标签:输入参数 表达式 信息 cti 接口 int mit red 标签
mybatis是一个持久层的框架,是apache下的顶级项目。
mybatis托管到goolecode下,再后来托管到github下。
mybatis让程序将主要精力放在sql上,通过mybatis提供的映射方式,自由灵活生成(半自动化,因为有一部分需要我们自己编写sql)满足需要sql语句。
mybatis可以将向 preparedStatement中的输入参数自动进行输入映射,将查询结果集灵活映射成java对象。(输出映射)
配置mybatis的配置文件,mybatis-config.xml(名称不固定,根据个人习惯)。
通过配置文件,加载mybatis运行环境,创建SqlSessionFactory会话工厂(SqlSessionFactory在实际使用时按单例方式)
通过SqlSessionFactory创建SqlSession。SqlSession是一个面向用户接口(提供操作数据库方法),SqlSession的实例不能被共享,实现对象是线程不安全的,建议sqlSession应用场合在方法体内。
调用sqlSession的方法去操作数据。如果需要提交事务,需要执行SqlSession的commit()方法。
释放资源,关闭SqlSession。
mapper代理开发方法
只需要我们手动编写mapper接口(就是dao接口)。
只需在编写mapper.xml(映射文件)和mapper.java需要遵循一个开发规范:
SqlMapConfig.xml配置文件:可以配置properties属性、别名、mapper加载。
mybatis核心:对sql语句进行灵活操作,通过表达式进行判断,对sql进行灵活拼接、组装。
需求:
mapper.xml:
1 <!-- 用户信息综合查询 2 #{userCustom.sex}:取出pojo包装对象中性别值 3 ${userCustom.username}:取出pojo包装对象中用户名称 4 --> 5 <select id="findUserList" parameterType="com.iot.mybatis.po.UserQueryVo" 6 resultType="com.iot.mybatis.po.UserCustom"> 7 SELECT * FROM user 8 <!-- where 可以自动去掉条件中的第一个and --> 9 <where> 10 <if test="userCustom!=null"> 11 <if test="userCustom.sex!=null and userCustom.sex != ‘‘ "> 12 AND user.sex=#{userCustom.sex} 13 </if> 14 <if test="userCustom.username!=null and userCustom.username != ‘‘ "> 15 AND user.username LIKE ‘%${userCustom.username}%‘ 16 </if> 17 </if> 18 </where> 19 20 21 </select> 22 23 <!-- 用户信息综合查询总数 24 parameterType:指定输入类型和findUserList一样 25 resultType:输出结果类型 26 --> 27 <select id="findUserCount" parameterType="com.iot.mybatis.po.UserQueryVo" resultType="int"> 28 SELECT count(*) FROM user 29 <where> 30 <if test="userCustom!=null"> 31 <if test="userCustom.sex!=null and userCustom.sex != ‘‘ "> 32 AND user.sex=#{userCustom.sex} 33 </if> 34 <if test="userCustom.username!=null and userCustom.username != ‘‘ "> 35 AND user.username LIKE ‘%${userCustom.username}%‘ 36 </if> 37 </if> 38 </where> 39 </select>
向sql传递数组或List,mybatis使用foreach解析
在用户查询列表和查询总数的statement中增加多个id输入查询。两种方法,sql语句如下:
一个使用or,一个使用in
List<Integer> ids
传入多个id1 public class User{ 2 3 //传入多个id 4 private List<Integer> ids; 5 6 getter、setter方法 7 。。。 8 }
1 <if test="ids!=null"> 2 <!-- 使用 foreach遍历传入ids 3 collection:指定输入 对象中集合属性 4 item:每个遍历生成对象中 5 open:开始遍历时拼接的串 6 close:结束遍历时拼接的串 7 separator:遍历的两个对象中需要拼接的串 8 --> 9 <!-- 使用实现下边的sql拼接: 10 AND (id=1 OR id=10 OR id=16) 11 --> 12 <foreach collection="ids" item="user_id" open="AND (" close=")" separator="or"> 13 <!-- 每个遍历需要拼接的串 --> 14 id=#{user_id} 15 </foreach> 16 17 <!-- 实现 “ and id IN(1,10,16)”拼接 --> 18 <!-- <foreach collection="ids" item="user_id" open="and id IN(" close=")" separator=","> 19 每个遍历需要拼接的串 20 #{user_id} 21 </foreach> --> 22 23 </if>
1 //传入多个id 2 List<Integer> ids = new ArrayList<Integer>(); 3 ids.add(1); 4 ids.add(10); 5 ids.add(16); 6 //将ids通过user传入statement中 7 user.setIds(ids);
将上边实现的动态sql判断代码块抽取出来,组成一个sql片段。其它的statement中就可以引用sql片段。
1 <!-- 定义sql片段 2 id:sql片段的唯 一标识 3 4 经验:是基于单表来定义sql片段,这样话这个sql片段可重用性才高 5 在sql片段中不要包括 where 6 --> 7 <sql id="query_user_where"> 8 <if test="userCustom!=null"> 9 <if test="userCustom.sex!=null and userCustom.sex!=‘‘"> 10 AND user.sex = #{userCustom.sex} 11 </if> 12 <if test="userCustom.username!=null and userCustom.username!=‘‘"> 13 AND user.username LIKE ‘%${userCustom.username}%‘ 14 </if> 15 </if> 16 </sql>
1 <!-- 用户信息综合查询 2 #{userCustom.sex}:取出pojo包装对象中性别值 3 ${userCustom.username}:取出pojo包装对象中用户名称 4 --> 5 <select id="findUserList" parameterType="com.iot.mybatis.po.UserQueryVo" 6 resultType="com.iot.mybatis.po.UserCustom"> 7 SELECT * FROM user 8 <!-- where 可以自动去掉条件中的第一个and --> 9 <where> 10 <!-- 引用sql片段 的id,如果refid指定的id不在本mapper文件中,需要前边加namespace --> 11 <include refid="query_user_where"></include> 12 <!-- 在这里还要引用其它的sql片段 --> 13 </where> 14 </select>
标签:输入参数 表达式 信息 cti 接口 int mit red 标签
原文地址:https://www.cnblogs.com/lhy-549/p/10087549.html