1) 获得Mybatis配置文件流
其中“SqlMapConfig.xml”是Mybatis的环境配置文件。
2) 创建会话工厂SqlSessionFactory
3) 通过会话工厂获得SqlSession
SqlSession sqlSession = sqlSessionFactory.openSession()
4) 通过SqlSession对象操作数据库
a) SelectOne:表示查询出一条记录进行映射。如果使用selectOne可以实现使用selectList也可以实现(list中只有一个对象)。
b) selectList:表示查询出一个列表(多条记录)进行映射。如果使用selectList查询多条记录,不能使用selectOne。
1. SqlSessionFactory:使用单例模式来管理,即将其设为成员变量,在一个对数据库操作的java文件中只有一个SqlSessionFactory。
private SqlSessionFactory sqlSessionFactory;
在构造方法中初始化sqlSessionFactory实例:
2. SqlSession:是一个面向用户(程序员)的接口,其中提供了很多操作数据库的方法,是线程不安全的,在SqlSesion实现类中除了有接口中的方法(操作数据库的方法)还有数据域属性。最佳应用场合在方法体内,定义成局部变量使用。
SQLSession sqlSession =sqlSessionFactory.openSession()
|
框架 |
Sql语句 |
应用场景 |
hibernate |
是一个标准ORM框架(对象关系映射) |
不需要程序写sql,sql语句自动生成了。 对sql语句进行优化、修改比较困难的 |
适用与需求变化不多的中小型项目 |
mybatis |
一个不完全 的ORM框架 |
专注是sql本身,需要程序员自己编写。 sql语句,sql修改、优化比较方便 |
适用与需求变化较多的项目 |
1. dao接口实现类方法中存在大量模板方法。
2. 调用sqlsession方法时将statement的id硬编码了
3. 调用sqlsession方法时传入的变量,由于sqlsession方法使用泛型,即使变量类型传入错误,在编译阶段也不报错,不利于程序员开发。
1. 在mapper.xml中namespace等于mapper接口地址
2. mapper.java接口中的方法名和mapper.xml中statement的id一致。
3. mapper.java接口中的方法输入参数类型和mapper.xml中statement的parameterType指定的类型一致。
4. mapper.java接口中的方法返回值类型和mapper.xml中statement的resultType指定的类型一致。
1. 程序员编写mapper接口需要遵循一些开发规范,mybatis可以自动生成mapper接口实现类代理对象。
2. mapper.xml映射文件与mapper.java接口文件一一对应。
3. 以上开发规范主要是对下边的代码进行统一生成:
User user = sqlSession.selectOne("test.findUserById",id);
sqlSession.insert("test.insertUser",user); … …
1. 代理对象内部调用selectOne或selectList:
1) 如果mapper方法返回单个pojo对象(非集合对象),代理对象内部通过selectOne查询数据库。
2) 如果mapper方法返回集合对象,代理对象内部通过selectList查询数据库。
2. mapper接口方法参数只能有一个:
即使mapper接口只有一个参数,可以使用包装类型的pojo满足不同的业务方法的需求。
持久层方法的参数可以包装类型、map。。。,service方法中建议不要使用包装类型(不利于业务层的可扩展)
mybatis的全局配置文件SqlMapConfig.xml,配置内容如下:
properties(属性)
settings(全局配置参数)
typeAliases(类型别名)
typeHandlers(类型处理器)
objectFactory(对象工厂)
plugins(插件)
environments(环境集合属性对象)
environment(环境子属性对象)
transactionManager(事务管理)
dataSource(数据源)
mappers(映射器)
1. 作用:
将数据库连接参数单独配置在db.properties中,只需要在SqlMapConfig.xml中加载db.properties文件,通过参数的形式引用,可使得在SqlMapConfig.xml中不需要对数据库连接参数硬编码。
2. 原因:
方便对参数进行统一管理,其它xml可以引用该db.properties。
3. 在sqlMapConfig.xml加载属性文件
1. 作用:
mybatis框架在运行时可以调整一些运行参数,比如:开启二级缓存、开启延迟加载等。
1. 作用
在mapper.xml对Sql语句的配置中,parameterType指定输入参数的类型、需要resultType指定输出结果的映射类型。如果在指定类型时输入类型全路径,不方便进行开发,可以针对parameterType或resultType指定的类型定义一些别名,在mapper.xml中通过别名定义,方便开发。
2. 自定义实体类的别名设置
1) 单个类别名的配置(不常用)
引用别名:
2) 批量定义别名(常用)
指定包内的所有实体类自动定义别名,其别名是类的名称(不区分大小写)
相应mapper的加载是通过mapper接口类实现的
按照上边的规范,将mapper.java和mapper.xml放在一个目录 ,且同名。
1. 数据类型:简单数据类型、hashmap、pojo的包装类型。
在实际工程中考虑到可扩展性,实际结构如下:
1. 包装类的定义:在包装类型的pojo中将复杂的查询条件包装进去。
2. 映射文件:在UserMapper.xml中定义用户信息综合查询(查询条件复杂,通过高级查询进行复杂关联查询)。
1. 特点:使用resultType进行输出映射,只有查询出来的列名和pojo中的属性名一致,该列才可以映射成功。
1) 如果查询出来的列名和pojo中的属性名全部不一致,没有创建pojo对象。
2) 只要查询出来的列名和pojo中的属性有一个一致,就会创建pojo对象。
1. 特点:如果查询出来的列名和pojo的属性名不一致,通过定义一个resultMap对列名和pojo属性名之间作一个映射关系。
SELECT id id_,username username_ FROM USERWHERE id=#{value},User类中属性名和表中查询列名不一致。
1. 定义resultMap
2. 使用resultMap作为statement的输出映射类型
1. Mybatis中主要涉及4样:
1) SqlMapConfig.xml:Mybatis的全局配置文件。
2) Pojo持久层对象
3) Mapper.xml:SQL语句的配置信息,其中包括parameterType和resultType/resultMap两个参数。
4) Mapper.java:使用Mapper代理开发。与mapper.xml一一对应,需要满足一定的规范。对应关系如下:
Mapper.xm |
Mapper.java |
namespace |
类的全限定名 |
Id |
方法接口名称 |
parameterType |
方法参数类型 |
resultType/resultMap |
方法返回值类型 |
2. 使用resultType进行输出映射,只有查询出来的列名和pojo中的属性名一致,该列才可以映射成功。
3. 如果查询出来的列名和pojo的属性名不一致,通过定义一个resultMap对列名和pojo属性名之间作一个映射关系。