1,输出映射
1.1,resultType
输出pojo或者list(上面都有见过了):
使用resultType进行输出映射,只有查询出来的数据列名和pojo中的属性名一致,该列才可以映射成功。
如果查询出来的列名和pojo中的属性名全部不一致,没有创建pojo对象。
只要查询出来的列名和pojo中的属性有一个一致,就会创建pojo对象。
比如:本该返回一个pojo对象的list的,但是pojo属性和数据库返回数据的字段不匹配,那么list长度会是实际返回个数,但是列表的元素都是null.
输出简单类型:
Mapper.xml文件
<!-- 获取用户列表总数 -->
<select id="findUserCount" parameterType="user" resultType="int"> select count(1) from user </select>
Mapper接口
public int findUserCount(User user) throws Exception;
调用:
Public void testFindUserCount() throws Exception{ //获取session SqlSession session = sqlSessionFactory.openSession(); //获取mapper接口实例 UserMapper userMapper = session.getMapper(UserMapper.class); User user = new User(); user.setUsername("管理员"); //传递Hashmap对象查询用户列表 int count = userMapper.findUserCount(user); //关闭session session.close(); }
查询出来的结果集只有一行且一列,可以使用简单类型进行输出映射。
输出hashmap
输出pojo对象可以改用hashmap输出类型,将输出的字段名称作为map的key,value为字段值。
1.2,resultMap使用方法
resultType可以指定pojo将查询结果映射为pojo,但需要pojo的属性名和sql查询的列名一致方可映射成功。
如果sql查询字段名和pojo的属性名不一致,可以通过resultMap将字段名和属性名作一个对应关系 ,resultMap实质上还需要将查询结果映射到pojo对象中。
resultMap可以实现将查询结果映射为复杂类型的pojo,比如在查询结果映射对象中包括pojo和list实现一对一查询和一对多查询。
即:可以将数据放入任何想要的一个对象中(对象属性和数据列不需要一致)。
如果查询出来的列名和pojo的属性名不一致,通过定义一个resultMap对列名和pojo属性名之间作一个映射关系:
1、定义resultMap
2、使用resultMap作为statement的输出映射类型
定义reusltMap
<id />:此属性表示查询结果集的唯一标识,非常重要。如果是多个字段为复合唯一约束则定义多个<id />。
Property:表示person类的属性。
Column:表示sql查询出来的字段名。
Column和property放在一块儿表示将sql查询出来的字段映射到指定的pojo类属性上。
<result />:普通结果,即pojo的属性。
使用resultMap作为statement的输出映射类型
mapper.java
测试
小结
使用resultType进行输出映射,只有查询出来的列名和pojo中的属性名一致,该列才可以映射成功。
如果查询出来的列名和pojo的属性名不一致,通过定义一个resultMap对列名和pojo属性名之间作一个映射关系。
2, 动态sql
mybatis核心 对sql语句进行灵活操作,通过表达式进行判断,对sql进行灵活拼接、组装。
(ps:即传入数据的正确验证在sql中进行)
需求:
用户信息综合查询列表和用户信息查询列表总数这两个statement的定义使用动态sql。
对查询条件进行判断,如果输入参数不为空才进行查询条件拼接。
mapper.xml
测试代码
3,sql片段
需求:
将上边实现的动态sql判断代码块抽取出来,组成一个sql片段。其它的statement中就可以引用sql片段。方便程序员进行开发。
定义sql片段
引用sql片段
在mapper.xml中定义的statement中引用sql片段:
4,foreach
向sql传递数组或List,mybatis使用foreach解析
需求:
在用户查询列表和查询总数的statement中增加多个id输入查询。sql语句如下:
两种方法:
1,SELECT * FROM USER WHERE id=1 OR id=10 OR id=16 2,SELECT * FROM USER WHERE id IN(1,10,16)
在输入参数类型中添加List<Integer> ids传入多个id
修改mapper.xml
WHERE id=1 OR id=10 OR id=16
在查询条件中,查询条件定义成一个sql片段,需要修改sql片段。
(ps:其中item的值可以随便取,但是需要和占位符中字段一致。)
测试:
另外一个sql的实现:
总结:
mybatis是什么?
mybatis是一人持久层框架,mybatis是一个不完全的ORM框架。sql语句需要程序员自己去编写,但是mybatis也有映射(输入参数映射、输出结果映射)。
mybatis入门门槛不高,学习成本低,让程序员把精力放在sql语句上,对sql语句优化非常方便,适用与需求变化较多项目,比如互联网项目。
mybatis框架执行过程:
1、配置mybatis的配置文件,SqlMapConfig.xml(名称不固定)
2、通过配置文件,加载mybatis运行环境,创建SqlSessionFactory会话工厂 SqlSessionFactory在实际使用时按单例方式。 3、通过SqlSessionFactory创建SqlSession SqlSession是一个面向用户接口(提供操作数据库方法),实现对象是线程不安全的,建议sqlSession应用场合在方法体内。 4、调用sqlSession的方法去操作数据。 如果需要提交事务,需要执行SqlSession的commit()方法。 5、释放资源,关闭SqlSession
mybatis开发dao的方法:
1、原始dao 的方法
需要程序员编写dao接口和实现类
需要在dao实现类中注入一个SqlSessionFactory工厂。
2、mapper代理开发方法(建议使用) 只需要程序员编写mapper接口(就是dao接口) 程序员在编写mapper.xml(映射文件)和mapper.java需要遵循一个开发规范: 1、mapper.xml中namespace就是mapper.java的类全路径。 2、mapper.xml中statement的id和mapper.java中方法名一致。 3、mapper.xml中statement的parameterType指定输入参数的类型和mapper.java的方法输入 参数类型一致。 4、mapper.xml中statement的resultType指定输出结果的类型和mapper.java的方法返回值类型一致。
SqlMapConfig.xml配置文件:可以配置properties属性、别名、mapper加载。。。
输入映射:
parameterType:指定输入参数类型可以简单类型、pojo、hashmap。。
对于综合查询,建议parameterType使用包装的pojo,有利于系统 扩展。
输出映射:
resultType:
查询到的列名和resultType指定的pojo的属性名一致,才能映射成功。
reusltMap:
可以通过resultMap 完成一些高级映射。
如果查询到的列名和映射的pojo的属性名不一致时,通过resultMap设置列名和属性名之间的对应关系(映射关系)。可以完成映射。
高级映射:
将关联查询的列映射到一个pojo属性中。(一对一)
将关联查询的列映射到一个List<pojo>中。(一对多)
动态sql:(重点)
if判断(掌握)
where
foreach
sql片段(掌握)