MyBatis学习笔记——10MyBatis的动态sql
完整学习路线:https://blog.csdn.net/qq_40163148/article/details/89668242
1.动态sql(if是最常用的还有其他的参照pdf文档)
mybatis核心 对sql语句进还有行灵活操作,通过表达式进行判断,对sql进行灵活拼接,组装
需求:
用户信息综合查询列表和用户信息查询列表总数这两个statement的定义使用动态sql
对查询条件进行判断如果查询条件不为空我们才对查询条件进行拼接(usermapper.xml)
<!--
where可以自动去除条件中的第一个and
-->
<where>
<if test="userCustom.user_sex!=null and userCustom.user_sex!=''">
userdb.user_sex=#{userCustom.user_sex}
</if>
<if test="userCustom.user_name!=null and userCustom.user_name!=''">
and userdb.user_name like '%${userCustom.user_name}%'
</if>
</where>
用户信息综合查询列表由于条件一样动态sql一模一样这样我们在测试类里就可以自由传入参数比如什么都不传
测试类(TestMapper.java)
package com.lipengge.mybatis.first;
import static org.junit.Assert.*;
import java.io.InputStream;
import java.util.ArrayList;
import java.util.List;
import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
import org.junit.Before;
import org.junit.Test;
import com.lipengge.mybatis.bean.User;
import com.lipengge.mybatis.bean.UserCustom;
import com.lipengge.mybatis.bean.UserQueryVo;
import com.lipengge.mybatis.mapper.UserMapper;
public class TestMapper {
private SqlSessionFactory ssf;
@Before
public void setUp() throws Exception {
String resource="SqlMapConfig.xml";
InputStream inputStream = Resources.getResourceAsStream(resource);
ssf= new SqlSessionFactoryBuilder().build(inputStream);
}
@Test
public void test() throws Exception {
SqlSession openSession = ssf.openSession();
//mybatis自动生成usermapper代理对象
UserMapper um=openSession.getMapper(UserMapper.class);
// System.out.println(um.findUserById(6));
// System.out.println(um.findUserByName("振川"));
// User user=new User();
// user.setUser_age(63);
// user.setUser_name("王八蛋");
// user.setUser_name("男");
// um.insertUserById(user);
// System.out.println(user.getId());
// um.deleteUserById(22);
UserQueryVo userQueryvo=new UserQueryVo();
UserCustom userCustom=new UserCustom();
// List<Integer> list=new ArrayList<Integer>();
// list.add(6);
// list.add(8);
// list.add(10);
// userCustom.setUser_sex("男");
// userCustom.setUser_name("振川");
userQueryvo.setUserCustom(userCustom);
// userQueryvo.setIds(list);
System.out.println(um.findUserCount(userQueryvo));
// System.out.println(um.findUserList(userQueryvo));
// System.out.println(um.findUserByIdResultMap(6));
openSession.close();
}
}
2.sql片段
需求:
将上边实现的代码抽出来,组成一个sql片段。其他的statement中就可以引用这个sql片段
sql片段
<!--
id 唯一标识
经验:基于单表来定义sql片段,这样sql片段的重用性才高
里面不要包含where,因为有可能使用其他的sql片段
-->
<sql id="query_user_where">
<if test="userCustom.user_sex!=null and userCustom.user_sex!=''">
userdb.user_sex=#{userCustom.user_sex}
</if>
<if test="userCustom.user_name!=null and userCustom.user_name!=''">
and userdb.user_name like '%${userCustom.user_name}%'
</if>
</sql>
引用
<where>
<!-- refid引用sql片段 sql片段没有在该mapper里则前面要加namespace -->
<include refid="query_user_where"></include>
<!-- 这里应该有其他sql片段这是sql片段里不能有where的原因 -->
</where>
测试类同上
3.foreach(不常用说下)
需求:在用户综合查询列表和用户查询总数的statement中增加多个id输入查询。
两种方法:
select * from userdb where (id=1 or id=10 or id=16);
select * from userdb where id in(1,10,16);
在输入参数类型中添加List ids 传入多个id
测试类
package com.lipengge.mybatis.first;
import static org.junit.Assert.*;
import java.io.InputStream;
import java.util.ArrayList;
import java.util.List;
import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
import org.junit.Before;
import org.junit.Test;
import com.lipengge.mybatis.bean.User;
import com.lipengge.mybatis.bean.UserCustom;
import com.lipengge.mybatis.bean.UserQueryVo;
import com.lipengge.mybatis.mapper.UserMapper;
public class TestMapper {
private SqlSessionFactory ssf;
@Before
public void setUp() throws Exception {
String resource="SqlMapConfig.xml";
InputStream inputStream = Resources.getResourceAsStream(resource);
ssf= new SqlSessionFactoryBuilder().build(inputStream);
}
@Test
public void test() throws Exception {
SqlSession openSession = ssf.openSession();
//mybatis自动生成usermapper代理对象
UserMapper um=openSession.getMapper(UserMapper.class);
// System.out.println(um.findUserById(6));
// System.out.println(um.findUserByName("振川"));
// User user=new User();
// user.setUser_age(63);
// user.setUser_name("王八蛋");
// user.setUser_name("男");
// um.insertUserById(user);
// System.out.println(user.getId());
// um.deleteUserById(22);
UserQueryVo userQueryvo=new UserQueryVo();
UserCustom userCustom=new UserCustom();
List<Integer> list=new ArrayList<Integer>();
list.add(6);
list.add(8);
list.add(10);
// userCustom.setUser_sex("男");
// userCustom.setUser_name("振川");
userQueryvo.setUserCustom(userCustom);
userQueryvo.setIds(list);
System.out.println(um.findUserCount(userQueryvo));
// System.out.println(um.findUserList(userQueryvo));
// System.out.println(um.findUserByIdResultMap(6));
openSession.close();
}
}