MyBatis开发dao方法
1.SqlSession在代码中的使用场合
使用场合:sqlSession在使用时由SqlSessionFactory生成创建一个Sqlsession会话对象,对象在代码中可以定义为成员变量、方法形参、方法的局部变量。
1.1.SqlSessionFactory
- SqlSessionFactory作为会话工厂,创建sqlSession,可以将SqlSessionFactory以单例方式。
1.2.SqlSessionFactoryBuilder
- SqlSessionFactoryBuilder用于创建SqlSessionFactory,又由于SqlSessionFactory以单例方式,可以将SqlSessionFactoryBuilder简单的当成一个工具类来使用即可。
1.3 SqlSession
- sqlSession是一个面向程序员接口。
- SqlSession作用是操作数据库,sqlSession对象要存储数据库连接、事务、一级缓存结构等。
sqlSession对象是线程不安全的(多线程访问系统,当多线程同时使用一个sqlsession对象时会造成数据冲突问题)
由于sqlSession对象是线程不安全的,sqlSession最佳使用场合在方法体内作为局部变量来使用。
2.开发原始dao方法
2.1.Use.xml映射文件
2.2.dao接口与dao的实现类
程序员需要编写dao接口及dao实现类。
接口实现类中注入SqlSessionFactory。
测试类
2.3.存在问题
- 1、dao接口实现类方法中存在大量的重复代码,这些重复的代码就是模板代码。
模板代码:
先创建sqlsession
再调用sqlsession的方法
再提交sqlsession
再关闭sqlsession - 2、在调用sqlSession的方法时存在硬编码
调用sqlsession方法第一个参数是 statement 的id就是硬编码。
3.mapper代理开发方法
- 程序员只需要编写dao接口(即mapper接口),由mybatis 框架自动生成接口实现的代理对象
3.1分析
- mapper代理方法要生成一个代理对象,代理对象内部执行的方法内容类似原始dao开发的dao实现类。
mapper代理类方法主要是对调用sqlsession的方法进行封装,如下:
sqlSession.selectOne(“test.findUserById”, id)
sqlSession.selectList(“test.findUserByName”, “张”)
sqlSession.insert(“test.insertUser”, user);对以上代码进行哪些封装?
什么时候调用sqlSession 的selectOne方法、什么时候调用sqlSession 的selecList方法,什么时候 调用insert。。。。
解决方法:可以根据映射文件中标签类型一决定是执行select方法还是执行insert方法等。。硬编码的statement的id如何封装。
解决方法:要解决映射文件中statement和mapper接口的方法的对应关系,在生成的代理对象方法中就知道该 代理对象的方法对应去调用哪个映射文件中statement。
3.2开发规范
mybatis要解决映射文件中statement和mapper接口的方法对应起来。
可以遵循一个开发规范让statement和mapper接口的方法对应起来:
- 1、映射文件和mapper接口类的对应
映射文件中namespace等于mapper接口类路径
- 2、statement和mapper接口的方法对应
将映射文件中statement的id和mapper中方法名一致
- 3、让mapper的接口方法的输入参数类型和statement的parameterType指定的参数类型保持一致
- 4、让mapper的接口方法返回值类型和statement的resultType指定的类型保持一致。
3.3.代码实现
3.3.1.mapper.xml
将mapper.xml在SqlMapConfig.xml加载
3.3.2.mapper.java
3.3.3.测试
3.4.根据用户名称模糊查询
3.4.1.mapper.xml
3.4.2.mapper.java
3.5.总结
selectOne和selectList
动态代理对象调用sqlSession.selectOne()和sqlSession.selectList()是根据mapper接口方法的返回值决定,如果返回list则调用selectList方法,如果返回单个对象则调用selectOne方法。selectOne如果返回多条记录报错:
namespace
mybatis官方推荐使用mapper代理方法开发mapper接口,程序员不用编写mapper接口实现类,使用mapper代理方法时,输入参数可以使用pojo包装对象或map对象,保证dao的通用性。