概述:
1.mybatis是什么?有什么特点?是干什么的?
它是是一种持久层半自动化ORM(Object Relatioin Mapping)框架,其中Object 代表java对象,Relatioin 代表与数据库之间的关系,Mapping代表映射。也就是说是java对象和数据库之间的映射关系,例如一个BOOK类对应着数据库中一个BOOK表,而BOOK类中的私有属性刚好对应数据库中BOOK表的各个字段。用于简化JDBC开发。
mybatis是半自动化ORM,他需要手动编写SQL语句。有半自动化ORM就一定有全自动化ORM,代表是hibernate。他不需要手动编写SQL语句。但不代表hibernate更加好,因为mybatis灵活性较高。所以现在主流的是mybatis。
创建项目:
首先需要新建一个项目:如下图所示
在pom.xml文件中添加依赖:
<dependencies> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <version>8.0.29</version> </dependency> <dependency> <groupId>org.mybatis</groupId> <artifactId>mybatis</artifactId> <version>3.5.13</version> </dependency> </dependencies>
在数据库中创建一个Book表
在idea中创建一个vo文件夹,文件夹中创建一个Book类,类中的属性一定要和数据库的表相互对应:
创建一个dao文件夹,文件夹中有一个BookDao接口,在接口中写上增删改查的抽象方法:
创建接口的映射文件(因为不会长截屏,为了保证代码的完整性所以调整了代码的格式)
编写mybatis-config配置文件:
以下是mybatis基础机构流程:
根据流程在Java中新建一个Text类并写上自己需要实现的方法:
结果:
总结:
1.创建项目,导入依赖,在数据库中建好表,java中建好同名的类,类中写完整对应的属性
2.创建对应接口,接口中写上需要实现的方法,因为mybatis是实现去实例化类的操作,所以千万不要写实例化接口的类,需要写对应的mapper映射文件
3.编写mybatis-config配置文件,就是将java和数据库进行连接的一个操作
4.编写测试类,实现利用mybatis框架进行数据库数据的增删改查功能
注意要点:
1.在BookDao接口写的抽象方法建议使用带参方法,这样有利于后续数据的变动,也降低了代码耦合
2.在接口中进行查询操作时,一定要记得类型是Book对象类型,因为映射文件中有一句这样的代码<select id="selectbookbyid" resultType="vo.Book">,而且查询操作返回的是一条数据时使用Book类型,如果返回的是结果集那需要使用List<Book>类型。增删改操作都可以使用int类型,因为返回的是受影响的行数。
3.像修改和增加操作需要传入的数据较多,可以在接口中传Book对象作为参数,后续在测试类中直接Book book1=new Book();在括号里直接写数据即可
4.建议在非测试类中用#{ }来代替真实的数据,只需要在测试类中传入真实的数据即可,降低代码耦合度。例如:可以将author=“向日葵”;改为author=#{author},
5.一定不要忘记在mybatis-config配置文件中加载mapper映射文件,否则就会报错
6.测试类中SqlSessionFactory对象调用openSession方法是括号里建议写TRUE代表事务自动提交,否则需要手动写commit.
SqlSession sqlSession = build.openSession(true);//写true代表事务自动提交
7.建议在Book类中重写toString方法和有参构造方法,有利于在测试类中直接传参
隐藏错误:
1.在BookMapper映射文件中,写修改操作代码是,我是使用if判断来写的:
我一开始在Book类中定义Id是int类型,int类型默认是0,不是NULL。所以就一直报错
2.在写查询语句时遇到传入多个参数时,我是这样写的:
在我检查完数据类型之后发现没有错误,传入其他参数也不好使。就是一直报错
解决方案:
1.在Book中将ID类型改为int的包装类Integer即可,因为只有Integer才用是不是为NULL的说法
2.在写查询语句遇到需要传入多个参数时,需要在每个参数前面加入@ Param(" ") 才可以 "