Mybatis:基础知识2-mapper代理

mybatis开发dao的方法

SqlSession作用范围

是使用局部变量、成员变量???

SqlSessionFactoryBuilder

SqlSessionFactoryBuilder

是以工具类方式来使用,需要创建sqlSessionFactory就new一个SqlSessionFactoryBuilder。

sqlSessionFactory

正常开发时,以单例方式管理sqlSessionFactory,整个系统运行过程中sqlSessionFactory只有一个实例,将来和spring整合后由spring以单例方式管理sqlSessionFactory

SqlSession

sqlSession是一个面向用户(程序员)的接口,程序员调用sqlSession的接口方法进行操作数据库。

sqlSession能否以单例 方式使用??

由于sqlSession是线程不安全,所以sqlSession最佳应用范围在方法体内,在方法体内定义局部变量使用sqlSession。

原始dao开发方式

程序员需要写dao接口和dao 的实现 类

dao接口

 

dao接口实现

 

 

​​​​​​​测试代码

 

 

​​​​​​​mapper代理的方式

程序员只需要写dao接口,dao接口实现对象由mybatis自动生成代理对象

本身dao在三层架构中就是一个通用的接口。

​​​​​​​上边原始dao开发方式的问题

1 dao的实现类中存在重复代码,整个mybatis操作的过程代码模板重复(先创建sqlsession、调用sqlsession的方法、关闭sqlsession)

2、dao的实现 类中存在硬编码,调用sqlsession方法时将statement的id硬编码

​​​​​​​mapper开发规范

 

要想让mybatis自动创建dao接口实现类的代理对象,必须遵循一些规则:

1、mapper.xml中namespace指定为mapper接口的全限定名

 

此步骤目的:通过mapper.xml和mapper.java进行关联。

2、mapper.xml中statement的id就是mapper.java中方法名

3、mapper.xml中statement的parameterTypemapper.java中方法输入参数类型一致

4、mapper.xml中statement的resultTypemapper.java中方法返回值类型一致.

​​​​​​​mapper.xml(映射文件)

mapper映射文件的命名方式建议:表名Mapper.xml

namespace指定为mapper接口的全限定名

 

​​​​​​​mapper接口

mybatis提出了mapper接口,相当 于dao 接口。

mapper接口的命名方式建议:表名+Mapper

 

​​​​​​​将mapper.xml在SqlMapConfig.xml中加载​​​​​​​

​​​​​​​测试

 

​​​​​​​mapper接口返回单个对象和集合对象

不管查询记录是单条还是多条,在 statement中resultType定义一致,都是单条记录映射的pojo类型。

mapper接口方法返回值,如果是返回的单个对象,返回值类型是pojo类型,生成的代理对象内部通过selectOne获取记录,如果返回值类型是集合对象,生成的代理对象内部通过selectList获取记录。

问题

 

返回值的问题

如果方法调用的statement,返回是多条记录,而mapper.java方法的返回值为pojo,此时代理对象通过selectOne调用,由于返回多条记录,所以报错:

org.apache.ibatis.exceptions.TooManyResultsException: Expected one result (or null) to be returned by selectOne(), 

but found: 4

​​​​​​​输入参数的问题

使用mapper代理的方式开发,mapper接口方法输入 参数只有一个,可扩展性是否很差??

可扩展性没有问题,因为dao层就是通用的,可以通过扩展pojo(定义pojo包装类型)将不同的参数(可以是pojo也可以简单类型)传入进去。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

琦彦

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值