1 mybatis
开发
dao
的方法
1.1 SqlSession
作用范围
是使用局部变量、成员变量。。。。???
1.1.1
SqlSessionFactoryBuilder
SqlSessionFactoryBuilder
是以工具类方式来使用,需要创建sqlSessionFactory
就
new
一个SqlSessionFactoryBuilder
。
1.1.2
sqlSessionFactory
正常开发时,以
单例方式
管理sqlSessionFactory
,整个系统运行过程中
sqlSessionFactory
只有一个实例,将来和
spring
整合后由
spring
以单例方式管理sqlSessionFactory
。
1.1.3 SqlSession
sqlSession
是一个面向用户(程序员)的接口,程序员调用
sqlSession
的接口方法进行操作数据库。
sqlSession
能否以单例 方式使用??
由于
sqlSession
是
线程不安全
,所以
sqlSession
最佳应用范围在方法体内
,在方法体内定义局部变量使用
sqlSession
。
1.2
原始
dao
开发方式
程序员需要写
dao
接口和
dao
的实现 类
1.2.1 dao
接口
1.2.2 dao
接口实现
1.2.3
测试代码
1.3 mapper
代理的方式
程序员只需要写
dao
接口,
dao
接口实现对象由
mybatis
自动生成代理对象。
本身
dao
在三层架构中就是一个通用的接口。
1.3.1
上边原始
dao
开发方式的问题
1、dao
的实现类中存在重复代码,整个
mybatis
操作的过程代码模板重复(先创建
sqlsession
、调用
sqlsession
的方法、关闭
sqlsession
)
2
、
dao
的实现 类中存在硬编码,调用
sqlsession
方法时将
statement
的
id
硬编码。
1.3.2 mapper
开发规范
要想让
mybatis
自动创建
dao
接口实现类的代理对象,必须遵循一些规则:
1
、
mapper.xml
中
namespace
指定为
mapper
接口的全限定名
此步骤目的:通过
mapper.xml
和
mapper.java
进行关联。
2
、
mapper.xml
中
statement
的
id
就是
mapper.java
中方法名
3
、
mapper.xml
中
statement
的
parameterType
和
mapper.java
中方法输入参数类型一致
4
、
mapper.xml
中
statement
的
resultType
和
mapper.java
中方法返回值类型一致
.
1.3.3 mapper.xml
(映射文件)
mapper
映射文件的命名方式建议:表名
Mapper.xml
namespace
指定为
mapper
接口的全限定名
1.3.4 mapper
接口
mybatis
提出了
mapper
接口,相当 于
dao
接口。
mapper
接口的命名方式建议:表名
Mapper
1.3.5
将
mapper.xml
在
SqlMapConfig.xml
中加载
1.3.6 mapper
接口返回单个对象和集合对象
不管查询记录是单条还是多条,在
statement
中
resultType
定义一致,都是单条记录映射的
pojo
类型。
mapper
接口方法返回值,如果是返回的单个对象,返回值类型是
pojo
类型,生成的代理对象内部通过
selectOne
获取记录,如果返回值类型是集合对象,返回值类型是pojo类型的集合,生成的代理对象内部通过
selectList
获取记录。
1.3.7
问题
1.3.7.1
返回值的问题
如果方法调用的
statement
,返回是多条记录,而
mapper.java
方法的返回值为
pojo
,此时代理对象通过
selectOne
调用,由于返回多条记录,所以报错:
org.apache.ibatis.exceptions.TooManyResultsException: Expected one result (or null) to be returned by selectOne(), but found: 4
1.3.7.2
输入参数的问题
使用
mapper
代理的方式开发,
mapper
接口方法输入 参数只有一个,可扩展性是否很差??
可扩展性没有问题,因为
dao
层就是通用的,可以通过扩展
pojo
(定义
pojo
包装类型)将不同的参数(可以是
pojo
也可以简单类型)传入进去,接下类会讲解到。