首先明白Mybatis是干什么的,以前使用jdbc操做数据库时候要写不少语句,获取光标,链接,获取具体对象进行相应操做,代码过于繁琐,因此如今有了Mybatis,它将这个操做整合在了一块儿,你不须要关心具体的和数据库的之间交互,你如今只须要关心你的业务逻辑,书写好你的sql语句,并进行相应的配置就能够了,这样大大提升了开发效率,简化了没必要要的代码。ps:说实话我以为jdbc操做真的繁琐,要注意的太多了,这种方式操做数据库方便多了,毕竟咱们重要的是业务逻辑代码。html
这篇博客记录了基本的配置,statement方式,动态代理方式的增删改查java
1.首先咱们先从官网将压缩包下载下来,而后将目录下的 .jar文件引入项目文件之中,在Intellij之下,引入jar文件,具体怎么引入问度娘,注意这里暂时只须要引入一个.jar 文件,lib目录下的jar文件至关因而扩展功能,你须要的时候再引入。而后用一样的方式将jdbc引入一下,由于Mybatis是依赖于jdbc的,是jdbc的一种封装能够理解为。mysql
2.好的接下来咱们建立 config.xml文件,用于配置数据库的链接,以下sql
<?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Config 3.0//EN" "http://mybatis.org/dtd/mybatis-3-config.dtd"> <configuration> <environments default="development"> <!--默认的配置环境,发行版本,debug版本--> <environment id="development"> <transactionManager type="JDBC"/> <dataSource type="POOLED"> <!--建立链接池,效率高,一次打开,屡次使用--> <property name="driver" value="com.mysql.cj.jdbc.Driver"/> <property name="url" value="jdbc:mysql://localhost:3306/mybatis?useUnicode=true&characterEncoding=utf-8&serverTimezone=GMT"/> <property name="username" value="xxx"/> <property name="password" value="xxxx"/> </dataSource> </environment> </environments> <mappers> <!-- 加载映射文件,有多个,直接写相对于src文件的路径--> <mapper resource="entity/PersonMapping.xml"/> </mappers> </configuration>
看它这个xml文件,仍是比较容易理解的,注意两点,数据库
1.我这里使用的是mysql 8.0.2版本,配置和mysql低版本不太同样,url后面的参数是以 & 来分隔的。虽然也不知道为撒这样,反正人家这么规定的。数组
2.最下面<mappers>加载映射文件的时候,一个<mapper resource-"xxx"/>加载一个,resource属性就是具体的映射文件相对于src文件的路径。session
接下来咱们建立Person类,和数据库的一张表造成映射:以下mybatis
package entity; public class Person {
private int id; private String name; private String loves; public Person(){ }
public Person(String name, String loves) { this.name = name; this.loves = loves; }
public int getId(){return id;}
public void setId(int id){this.id=id;}
public String getName() { return name; } public void setName(String name) { this.name = name; } public String getLoves() { return loves; } public void setLoves(String loves) { this.loves = loves; } public String toString(){ return "姓名:"+this.name+"\n爱好:"+this.loves; } }
表person以下:app
create table person( `id` int(11) not null auto_increment primary key, `name` varchar(30) not null, loves varchar(40) not null )engine=innodb;
而后看映射文件 PersonMapping.xml的配置,这个映射文件和Person类时对应的,配置的是关于表person和类Person的相关操做ide
<?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd"> <mapper namespace="entity.PersonMapping"> <!--该mapping文件的惟一映射--> <select id="selectPersonById" resultType="entity.Person" parameterType="string"> select * from person where `name` = #{name} </select> <insert id="insertOnePerson" parameterType="entity.Person"> insert into person values(#{name},#{loves}) </insert> <delete id="deleteOnePerson" parameterType="int" > delete from person where id=#{id} </delete> </mapper>
能够看到首先namespace是该文件一个惟一标识,就是该文件的路径(相对于src),接下来有各类标签,<select> <delete> <insert> ..这其实就对应了数据库的增删改查,具体对哪一张表,什么操做,看你书写的sql语句,由于咱们看到标签体的内容就是sql语句,举个例子:
<insert id="insertOnePerson" parameterType="entity.Person" resultType=""> insert into person values(#{name},#{loves}) </insert>
这个标签是向数据库插入数据,id表明的是该sql语句的惟一标识,parameterType 指的是传入的参数类型,这里是entity.Person,Person使咱们构造的一个类,resultType是返回值的类型,
标签体是咱们书写的sql语句,这里是动态传值的方式,输出格式是:#{变量名},对于变量名咱们注意:若是传入的是一个string,int等类型的数据,那这个变量名能够是任何字符,可是若是传入的是一个对象的话,那么变量名就必须和该对象的属性一一对应起来,好比 name 就指 person对象的name属性,loves指person的loves属性。另外注意Mybatis传参只能传一个值,可是有时候要传多个参数,可使用数组的方式传值。
一样的,增删改查操做都是在相应的标签下书写sql语句来完成的。
到这里咱们的基本配置demo就算是完成了,接下来写一个具体的操做例子,首先分为三步:
1.加载配置信息,2.获取SqlSession对象进行操做 3.执行指定的sql语句
public static void main(String[] args) throws IOException { //加载配置信息 Reader reader = Resources.getResourceAsReader("config.xml"); //connection SqlSessionFactory sessionFactory = new SqlSessionFactoryBuilder().build(reader); SqlSession sqlSession = sessionFactory.openSession(); //执行指定的sql语句 String statement = "entity.PersonMapping.selectPersonById"; //查询数据 List<Person> persons = new ArrayList<Person>(sqlSession.selectList(statement,"温鸿飞")); for (Person person:persons) { System.out.println(person.toString()); } statement = "entity.PersonMapping.deleteOnePerson"; //删除数据 sqlSession.delete(statement,1); System.out.println("------"); statement = "entity.PersonMapping.selectPersonById"; //查询数据 persons = new ArrayList<Person>(sqlSession.selectList(statement,"温鸿飞")); for (Person person:persons) { System.out.println(person.toString()); } sqlSession.commit(); sqlSession.close(); }
配置信息加载是经过Reader reader = Resources.getResourceAsReader("config.xml"); 完成,config就是咱们刚才建立的配置文件,告诉编译器都有哪些mapper,
获取SqlSession对象,这个不说了,官网就是这么写的,规定
而后到了具体的操做了,看到咱们先书写了一个 statement,这个statement对应了刚才的PersonMapping.xml文件当中的一个标签,格式是:namespace.id,好比
entity.PersonMapping.deleteOnePerson指的就是deleteOnePerson的标签,以后用SqlSession来操做,调用增删改查里面的一个方式,传入statement和相应的参数就能够了,好比删除
SqlSession.delete(statement,param); 以后有返回值的接受一下, 没有就算了。sqlSession.commit()提交一下事务,固然这里还有回滚等暂时不说了
上面的代码执行结果以下,能够看到正确的查询到了数据并删除了id为1 的数据
"C:\Program Files\Java\jdk-11.0.1\bin\java.exe" "-javaagent:C:\Program Files\JetBrains\IntelliJ IDEA 2019.1.3\lib\idea_rt.jar=63824:C:\Program Files\JetBrains\IntelliJ IDEA 2019.1.3\bin" -Dfile.encoding=UTF-8 -classpath C:\learn\java\mybatis\out\production\mybatis;C:\迅雷下载\mybatis-3.5.2\mybatis-3.5.2\mybatis-3.5.2.jar;C:\迅雷下载\mysql-connector-java-8.0.16.jar entity.test
姓名:温鸿飞 爱好:哈啊哈哈
姓名:温鸿飞 爱好:21212121 姓名:温鸿飞 爱好:2121266 ------ 姓名:温鸿飞 爱好:21212121 姓名:温鸿飞 爱好:2121266
到这里咱们的第一个statement小demo就算成功完成了,但使用statement的话,每次都要书写statement,很繁琐,因此咱们有了动态的进行增删改查的方式,其实就是将statemtn语句进行约定,名字什么都是有固定规则的,简化代码,省略掉statement,简单来说,让约定优于配置,根据约定定位sql语句
具体的话,看下面:
定义一个接口,经过这个接口来替代statement,该接口有以下规则;
1.接口名和映射.xml文件的文件名相同
2.接口之中的抽象方法的方法名,返回值,参数和映射.xml之中配置的均相同,
3.注意一下若是要返回一个数组的话,使用 List<className> 做为返回类型
定义好了以后经过SqlSession.getMapper(接口名字.class);来获取到操做数据库的对象,以后调用该接口的方法就能够了,具体代码以下:
PersonMapping接口
package mappers; import entity.Person; import java.util.List; //操做person类的接口 public interface PersonMapping { //接口名也同样 public abstract Person selectPersonById(int id); //方法名,返回值,参数均和配置同样 void deletePersonById(int id); void insertOnePerson(Person person); public abstract List<Person> selectPersonByName(String name); }
main函数之中:
public class test { public static void main(String[] args) throws IOException { //加载配置信息 。。。获取到SqlSession对象,和前面同样//获取到mapper对象 PersonMapping personMapping = sqlSession.getMapper(PersonMapping.class); //调用接口方法操做数据库 Person person = personMapping.selectPersonById(2); System.out.println(person); List<Person> persons = personMapping.selectPersonByName("温鸿飞"); for (Person temp:persons) { System.out.println(temp); } sqlSession.commit(); sqlSession.close(); } }
感受这和symfony里面的Respository同样呀,不过你这个还要本身配置,Symfonyh都本身配置好了,你直接实例化对象就好了,symfony很强呀
原文出处:https://www.cnblogs.com/eenio/p/11314611.html