动态sql简述
mybatis的动态sql语句是基于OGNL表达式的。可以方便的在sql语句中实现某些逻辑. 总体说来mybatis动态SQL语句主要有以下几类:
- if 语句 (简单的条件判断)
- choose (when,otherwize) ,相当于java 语言中的 switch ,与 jstl 中的choose 很类似
- trim (对包含的内容加上 prefix,或者 suffix 等,前缀,后缀)
- where (主要是用来简化sql语句中where条件判断的,能智能的处理 and or ,不必担心多余导致语法错误)
- set (主要用于更新时)
- foreach (在实现 mybatis in 语句查询时特别有用)
resultMap:适合使用返回值是自定义实体类的情况
resultType:适合使用返回值的数据类型是非自定义的,即jdk的提供的类型
3.1 使用resultMap返回自定义类型集合
3.2 使用resultType返回List
3.3 使用resultType返回单个对象(foreach)
3.4 使用resultType返回List
3.5 使用resultType返回Map
,适用于多表查询返回单个结果集
三、 foreach的使用
效果展示
创建IuserVo,作用:为了储存集合数据
public class IuserVo extends User{ private List userIds; public IuserVo(List userIds) { this.userIds = userIds; } public IuserVo(Integer id, String name, String loginName, String pwd, Integer rid, List userIds) { super(id, name, loginName, pwd, rid); this.userIds = userIds; } public IuserVo(String name, String loginName, String pwd, Integer rid, List userIds) { super(name, loginName, pwd, rid); this.userIds = userIds; } public IuserVo() { } public List getUserIds() { return userIds; } public void setUserIds(List userIds) { this.userIds = userIds; } @Override public String toString() { return "IuserVo{" + "userIds=" + userIds + '}'; } }foreach配置文件
<select id="list3" resultType="com.zking.mybatis.model.User" parameterType="com.zking.mybatis.model.IuserVo"> select id,name,loginName,pwd,rid from t_oa_user where id in <foreach collection="userIds" open="(" close=")" item="id"> #{id} foreach> select>mapper层(需要修改参数类型)
/** * 使用resultType返回单个对象 * @param IuserVo 用于处理多参数的集合 * @return */ Listlist3(IuserVo IuserVo); service层(需要修改参数类型)
/** * 使用resultType返回单个对象 * @param IuserVo 用于处理多参数的集合 * @return */ Listlist3(IuserVo IuserVo);
/** * 使用resultType返回单个对象 * @return */ @Override public Listlist3(IuserVo iuserVo) { return iusermapper.list3(iuserVo); }Test测试:使用resultType返回单个对象
@Test public void list3() { List list=new ArrayList<>(); list.add("10"); IuserVo u=new IuserVo(); u.setUserIds(list); System.out.println(userserviceimpl.list3(u)); }
案例list与list2的区别:
list1返回的resultMap返回自定义类型集合
list2返回的resultType返回list类型集合
定义一个BaseResultMap,为了实现自定义类型集合
<resultMap id="BaseResultMap" type="com.zking.mybatis.model.User" > <constructor > <idArg column="id" jdbcType="INTEGER" javaType="java.lang.Integer" /> <arg column="name" jdbcType="VARCHAR" javaType="java.lang.String" /> <arg column="loginName" jdbcType="VARCHAR" javaType="java.lang.String" /> <arg column="pwd" jdbcType="VARCHAR" javaType="java.lang.String" /> <arg column="rid" jdbcType="INTEGER" javaType="java.lang.Integer" /> constructor> resultMap>效果展示
list2运行结果
list1运行结果
mapper层
/** * 使用resultMap返回自定义类型集合 * @return */ Listlist1(); /** * * 使用resultType返回指定集合 * @return */ Listlist2(); service层
/** * 使用resultMap返回自定义类型集合 * @return */ Listlist1(); /** * * 使用resultType返回指定集合 * @return */ Listlist2();
/** * 使用resultMap返回自定义类型集合 * * @return */ @Override public Listlist1() { return iusermapper.list1(); } /** * * 使用resultType返回指定集合 * * @return */ @Override public Listlist2() { return iusermapper.list2(); }Test测试
@Test public void list1() { userserviceimpl.list1().forEach(System.out::println); } @Test public void list2() { userserviceimpl.list2().forEach(System.out::println); }总结:resultMap与resultType都能实现查询
在大数据量查询时,往往需要数据库端分页,mybatis的分页功能是基于内存的,可以使用pagehelper来实现后端分页。
1) 导入依赖的包
<dependency> <groupId>com.github.pagehelpergroupId> <artifactId>pagehelperartifactId> <version>5.1.2version> dependency>2)将插件配置到mybatis.cfg.xml 中(Mybatis.cfg.xml配置拦截器)
<plugins> <plugin interceptor="com.github.pagehelper.PageInterceptor"> plugin> plugins>mapper层
/** * 分页 * @param u 需要的实体 * @return */ ListqueryPage(User u); service层
/** * 分页 * @param u * @param pagebean * @return */ ListqueryPage(User u, PageBean pagebean); Total需要转换因为它是long类型,必须转换为String类型
/** * 分页 * @param u * @param pagebean * @return */ @Override public ListqueryPage(User u, PageBean pagebean) { if (pagebean != null && pagebean.isPagination()) { PageHelper.startPage(pagebean.getPage(), pagebean.getRows()); } Listlist = iusermapper.queryPage(u); if (pagebean != null && pagebean.isPagination()) { PageInfo info = new PageInfo(list); pagebean.setTotal(Long.valueOf(info.getTotal()).intValue()); } return list; }效果展示:
分页实现的sql语句
查询结果如下
Test测试
@Test public void queryPage(){ User u=new User(); PageBean pageBean = new PageBean(); pageBean.setRows(4); Listlist = userserviceimpl.queryPage(u, pageBean); list.forEach(t-> System.out.println(t)); }