Mybatis开发dao的方法

1 mybatis开发dao的方法
1.1 SqlSession作用范围
是使用局部变量、成员变量。。。。???
 
1.1.1 SqlSessionFactoryBuilder
SqlSessionFactoryBuilder是以工具类方式来使用,需要创建sqlSessionFactorynew一个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接口
Mybatis开发dao的方法
 Mybatis开发dao的方法
1.2.2 dao接口实现
Mybatis开发dao的方法
Mybatis开发dao的方法
 
1.2.3 测试代码
 Mybatis开发dao的方法
Mybatis开发dao的方法
 
 
 
 
 
1.3 mapper代理的方式
程序员只需要写dao接口,dao接口实现对象由mybatis自动生成代理对象。
本身dao在三层架构中就是一个通用的接口。
 
 
1.3.1 上边原始dao开发方式的问题
1、dao的实现类中存在重复代码,整个mybatis操作的过程代码模板重复(先创建sqlsession、调用sqlsession的方法、关闭sqlsession
 
2dao的实现 类中存在硬编码,调用sqlsession方法时将statementid硬编码。
 
1.3.2 mapper开发规范
 
要想让mybatis自动创建dao接口实现类的代理对象,必须遵循一些规则:
 
1mapper.xmlnamespace指定为mapper接口的全限定名
Mybatis开发dao的方法

Mybatis开发dao的方法
此步骤目的:通过mapper.xmlmapper.java进行关联。
 
2mapper.xmlstatementid就是mapper.java中方法名
 
3mapper.xmlstatementparameterTypemapper.java中方法输入参数类型一致
 
4mapper.xmlstatementresultTypemapper.java中方法返回值类型一致.
 
 
 
 
1.3.3 mapper.xml(映射文件)
mapper映射文件的命名方式建议:表名Mapper.xml
 
namespace指定为mapper接口的全限定名
Mybatis开发dao的方法
Mybatis开发dao的方法 
 
1.3.4 mapper接口
mybatis提出了mapper接口,相当 于dao 接口。
 
mapper接口的命名方式建议:表名Mapper
Mybatis开发dao的方法
Mybatis开发dao的方法 
 
1.3.5 mapper.xmlSqlMapConfig.xml中加载
Mybatis开发dao的方法
Mybatis开发dao的方法 
 
1.3.6 mapper接口返回单个对象和集合对象
不管查询记录是单条还是多条,在 statementresultType定义一致,都是单条记录映射的pojo类型。
mapper接口方法返回值,如果是返回的单个对象,返回值类型是pojo类型,生成的代理对象内部通过selectOne获取记录,如果返回值类型是集合对象,返回值类型是pojo类型的集合,生成的代理对象内部通过selectList获取记录。
Mybatis开发dao的方法 
 
Mybatis开发dao的方法
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也可以简单类型)传入进去,接下类会讲解到。