mybatis总概览(4)(resultType,动态sql(where,if,foreach))


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解析

补充:传入参数为list、数组、map写法

需求:

在用户查询列表和查询总数的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片段(掌握)

 


免责声明!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系本站邮箱yoyou2525@163.com删除。



 
粤ICP备18138465号  © 2018-2025 CODEPRJ.COM