【框架】115:mybatis的增删改查
今天是刘小爱自学Java的第115天。
感谢你的观看,谢谢你。
imagemybatis框架的继续学习,安排如下:
- 对昨天学习的内容做个小结,其中补充一个昨天忽视的问题。
- 数据库无外乎就是增删改查,所以使用mybatis做一个完整的crud操作。
- 最后使用动态代理对代码优化,具体底层实现原理就不深究了,大致知道怎么回事就行。
一、mybatis使用步骤回顾
主要是涉及到配置文件的编写,其中又包含核心配置文件和映射文件。
image创建mybatis-config.xml核心配置文件。
创建映射文件编写sql语句,可以创建多个,但每创建一个都要在核心配置文件中说明。
构建SqlSessionFactory,再通过该工厂创建SqlSession对象。
总之sqlSession对象是关键,通过它就能执行sql语句了。
而如何找到对应的sql语句并执行?
就需要在参数中说明sql语句对应的id了。
Java实体类和数据表
前面也一直强调过很多次,它们都是一一对应的关系,昨天的代码有一个问题:
在Java中变量名一般采用的是驼峰命名规则,比如userName。
而在数据库中若是多个单词,会用下划线隔开,比如说user_name。
image这样的话这两个就没法对应出来,查询结果也会显示userName为空。
昨天我遇到这个问题后的第一反应就是直接将数据库中的字段名给改了,改成username。
但今天看教程的时候也讲到这个问题,解决方法是在sql语句中给字段名取一个别名。
既然讲到了,那就做一个了解吧。
二、mybatis完整的crud
Java经典三层架构中的dao层,也可以叫mapper层,它们其实都是一回事。
映射文件说的也就是这个mapper。
1UserDao接口
image数据库四大操作:增删改查
在dao层中编写一个接口,包含这四种操作的方法,其中查询有全表和单条查询。
既然有接口,那么也要有一个和其对应的实现类userDaoImpl,当然该实现类后续可以使用动态代理省略掉,暂且先不考虑。
在写实现类之前,我们要先在mapper配置文件中编写对应的sql语句。
2UserDaoMapper配置文件
image老实说,这块就写的有点难受了,其中这个#{字段名}也就相当于预编译中的“?”问号。
查询语句包含查询所有用户和根据条件查询用户,也只有查询语句需要返回值类型。
值得注意的是:
在核心配置文件中要加入该映射文件说明。
3UserDaoImpl实现类
imagedao层中的代码很纯粹,只用来增删改查。获取sqlSession对象的代码不在dao层中编写。
所以创建构造方法,参数为sqlSession。
也就是说想要使用dao层,就得给传一个sqlSession对象完成初始化。
其中增删改操作中我们需要调用commit方法提交事务,不然数据库中的数据不会修改。
查询不需要事务提交,这也好理解,本身并没有对数据库中的数据进行修改。
4创建测试类
image①创建测试类
使用快捷键Ctrl+Shift+T在UserDao接口名上可以快速创建一个对应的测试类。
②设定测试类方法
哪些方法需要测试可以自行选择,其中setUp@Before选择后会创建一个setUp()方法。
这个before是什么意思呢?
就是上述一共有5个要测试的方法,每个方法运行时都会先执行before方法里的内容。
所以将获取sqlSession对象的操作封装到setUp方法中,每次增删改查时会先获取sqlSession对象。
5最后测试下增加操作
image测试代码一运行,分析下其流程:
- set up()方法会优先执行,从而获取SqlSession对象,并将userDao初始化
- 调用该dao层中的增加方法,执行的也就是其实现类中的insertUser()方法。
- insertUser()方法中也就是利用sqlSession对象进行增加操作。
- 参数为sql语句对应的映射文件id,和需要增加的数据user。
- 这样在数据库中就增加了一条数据。
三、使用动态代理省略实现类
动态代理可以将dao层接口和映射文件直接连接起来,从而省略了dao层实现类的编写。
image再次说明这个mapper层也就是dao层,只不过我们以前一直把它叫做dao层。
如何将接口和映射文件连接起来呢?需要满足以下条件:
- 映射文件中的命名空间与Mapper接口的全路径一致,也就是上图中最上面的箭头。
- 映射文件中sql语句的id与Mapper接口的方法名保持一致。
说白了其实就是将接口中的方法和sql语句所在的位置对应起来了。
在满足上面的要求后,就可以使用动态代理省略实现类的编写了,创建测试类:
image使用快捷键Ctrl+Shift+T创建测试类。
其实关键就是sqlSession.getMapper()这个方法,其本质就相当于userMapper的实现类。
实现原理可以查看该方法源码,这里就不做拓展了,知道它和通过实现类的方式一样即可。
这样完成之后就可以直接在测试代码中使用userMapper增删改查。
最后
谢谢你的观看。
如果可以的话,麻烦帮忙点个赞,谢谢你。