MyBatis开发dao方法

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的通用性。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值