目录
二·、mybatis主配置文件SqlMapConfig.xml
一、mybatis综述
1、mybatis介绍
MyBatis 本是apache的一个开源项目iBatis, 2010年这个项目由apache software foundation 迁移到了google code,并且改名为MyBatis,实质上Mybatis对ibatis进行一些改进。
MyBatis是一个优秀的持久层框架,它对jdbc的操作数据库的过程进行封装,使开发者只需要关注 SQL 本身,而不需要花费精力去处理例如注册驱动、创建connection、创建statement、手动设置参数、结果集检索等jdbc繁杂的过程代码。
Mybatis通过xml或注解的方式将要执行的各种statement(statement、preparedStatemnt、CallableStatement)配置起来,并通过java对象和statement中的sql进行映射生成最终执行的sql语句,最后由mybatis框架执行sql并将结果映射成java对象并返回。
2、mybatis架构
3、mybatis入门程序
(1)引入相关依赖
(2)加入maven插件
(3)编写实体类
(4)编写dao接口mapper映射文件User.xml
映射文件命名:
User.xml(原始ibatis命名),mapper代理开发映射文件名称叫XXXMapper.xml,比如:UserMapper.xml、ItemsMapper.xml
在映射文件中配置sql语句。
(5)创建mybatis主配置文件mybatis.xml
配置mybatis的运行环境,数据源、事务等。
在sqlMapConfig.xml中加载User.xml:【写在</environments>后面】
(6)创建测试类
(7)如需配置日志
在主配置文件中配置
4、插入时主键问题
(1)自增主键返回
通过mysql函数获取到刚插入记录的自增主键:LAST_INSERT_ID()。是insert之后调用此函数。
(2)非自增主键返回
使用mysql的uuid()函数生成主键,执行uuid()语句顺序相对于insert语句之前执行
5、#{}和${}
#{}表示一个占位符号,#{}接收输入参数,类型可以是简单类型,pojo、hashmap。
如果接收简单类型,#{}中可以写成value或其它名称。
#{}接收pojo对象值,通过OGNL读取对象中的属性值,通过属性.属性.属性...的方式获取对象属性值。
${}表示一个拼接符号,会引用sql注入,所以不建议使用${}。
${}接收输入参数,类型可以是简单类型,pojo、hashmap。
如果接收简单类型,${}中只能写成value。
${}接收pojo对象值,通过OGNL读取对象中的属性值,通过属性.属性.属性...的方式获取对象属性值。
二·、mybatis主配置文件SqlMapConfig.xml
1、properties属性
将数据库连接参数单独配置在db.properties中,只需要在SqlMapConfig.xml中加载db.properties的属性值。在SqlMapConfig.xml中就不需要对数据库连接参数硬编码。
将数据库连接参数只配置在db.properties中,原因:方便对参数进行统一管理,其它xml可以引用该db.properties。
在sqlMapConfig.xml加载属性文件:
2、settings全局参数配置
mybatis框架在运行时可以调整一些运行参数。比如:开启二级缓存、开启延迟加载。。
3、typeAliases别名
在mapper.xml中,定义很多的statement,statement需要parameterType指定输入参数的类型、需要resultType指定输出结果的映射类型。
如果在指定类型时输入类型全路径,不方便进行开发,可以针对parameterType或resultType指定的类型定义一些别名,在mapper.xml中通过别名定义,方便开发。
方式一:单个定义别名
方式二:批量定义别名
4、mappers映射配置
方式一:通过resource加载单个映射文件
方式二:通过mapper接口加载单个mapper
方式三:批量加载mapper
三、mybatis开发dao方法
1、原始dao开发方法
程序员需要写dao接口和dao实现类
(1)dao接口
(2)实现类
public class UserDaoImpl implements UserDao {
// 需要向dao实现类中注入SqlSessionFactory
// 这里通过构造方法注入
private SqlSessionFactory sqlSessionFactory;
public UserDaoImpl(SqlSessionFactory sqlSessionFactory) {
this.sqlSessionFactory = sqlSessionFactory;
}
@Override
public User findUserById(int id) throws Exception {
SqlSession sqlSession = sqlSessionFactory.openSession();
User user = sqlSession.selectOne("test.findUserById", id);
// 提交事务
//sqlSession.commit();
// 释放资源
sqlSession.close();
return user;
}
}
//其他方法省略
(3)测试代码
(4)存在的问题
a、dao接口实现类方法中存在大量模板方法,设想能否将这些代码提取出来,大大减轻程序员的工作量。
b、调用sqlsession方法时将statement的id硬编码了
c、调用sqlsession方法时传入的变量,由于sqlsession方法使用泛型,即使变量类型传入错误,在编译阶段也不报错,不利于程序员开发。
2、mapper代理方法
程序员只需要mapper接口(相当 于dao接口)
(1)dao接口UserMapper.java
(2)mapper文件UserMapper.xml
开发规范:
a、在mapper.xml中namespace等于mapper接口地址
b、mapper.java接口中的方法名和mapper.xml中statement的id一致
c、mapper.java接口中的方法输入参数类型和mapper.xml中statement的parameterType指定的类型一致。
d、mapper.java接口中的方法返回值类型和mapper.xml中statement的resultType指定的类型一致。
(3)在SqlMapConfig.xml中加载mapper.xml
(4)测试
四、输入映射
1、简单类型
2、pojo对象
3、包装类pojo
完成用户信息的综合查询,需要传入查询条件很复杂(可能包括用户信息、其它信息,比如商品、订单的)
4、hashmap
五、输出映射
1、resultType
(1)输出简单类型
(2)输出pojo对象和pojo列表
输出pojo对象和输出pojo列表在sql中定义的resultType是一样的。
返回单个pojo对象要保证sql查询出来的结果集为单条,内部使用session.selectOne方法调用,mapper接口使用pojo对象作为方法返回值。
返回pojo列表表示查询出来的结果集可能为多条,内部使用session.selectList方法,mapper接口使用List<pojo>对象作为方法返回值。
2、resultMap
resultType可以指定pojo将查询结果映射为pojo,但需要pojo的属性名和sql查询的列名一致方可映射成功。
如果sql查询字段名和pojo的属性名不一致,可以通过resultMap将字段名和属性名作一个对应关系 ,resultMap实质上还需要将查询结果映射到pojo对象中。
resultMap可以实现将查询结果映射为复杂类型的pojo,比如在查询结果映射对象中包括pojo和list实现一对一查询和一对多查询。
<id />:此属性表示查询结果集的唯一标识,非常重要。如果是多个字段为复合唯一约束则定义多个<id />。
Property:表示USer类的属性。
Column:表示sql查询出来的字段名。
Column和property放在一块儿表示将sql查询出来的字段映射到指定的pojo类属性上。
<result />:普通结果,即pojo的属性。
六、动态sql
1、if
注意要做不等于空字符串校验。
2、where
<where />可以自动处理第一个and。
3、foreach
(1)list
参数是List<Integer> ids
传递List,List中是pojo
(2)array
数组中是字符串类型
数组中是pojo
4、sql片段
注意:如果引用其它mapper.xml的sql片段,则在引用时需要加上namespace,如下:
<include refid="namespace.sql片段”/>