博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
8. Mybatis动态SQL
阅读量:3968 次
发布时间:2019-05-24

本文共 7477 字,大约阅读时间需要 24 分钟。

Mybatis动态SQL

文件目录

在这里插入图片描述

本质:就是实现sql语言的动态拼接

  • if
  • choose (when, otherwise)
  • trim (where, set)
  • foreach

下面让我们来解析一下这四个函数吧

固定模式

  • 核心配置文件,mybatis-config 和 db.properties
driver=com.mysql.jdbc.Driverurl=jdbc:mysql://localhost:3306/mybatis?useSSL=true&characterEncoding=UTF-8&useUnicode=trueusername=rootpassword=981216
  • 实体类
package com.qin.pojo;public class User {
private int id; private String name; private String pwd; public User() {
} public User(int id, String name, String pwd) {
this.id = id; this.name = name; this.pwd = pwd; } @Override public String toString() {
return "User{" + "id=" + id + ", name='" + name + '\'' + ", pwd='" + pwd + '\'' + '}'; } public int getId() {
return id; } public void setId(int id) {
this.id = id; } public String getName() {
return name; } public void setName(String name) {
this.name = name; } public String getPwd() {
return pwd; } public void setPwd(String pwd) {
this.pwd = pwd; }}
  • 工具类
package com.qin.utils;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 java.io.IOException;import java.io.InputStream;public class MybatisUtils {
public static SqlSessionFactory sqlSessionFactory; //使用静态方法,是为了能够在类加载时,跟着一起启动 static{
try {
String resource = "mybatis-config.xml"; InputStream inputStream = null; inputStream = Resources.getResourceAsStream(resource); sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream); } catch (IOException e) {
e.printStackTrace(); } } //以后想要使用sqlSession,只需要调用这个类的这个方法即可 public SqlSession getSqlSession(){
SqlSession sqlSession = sqlSessionFactory.openSession(); return sqlSession; }}

1.if的使用

  • 先说一下if的作用吧,讲讲几个重点,需要注意的地方
  • if主要是判断,如果判断为真,那么就sql语句就会开始拼接
  • 接口里面传的参数是map,当map为空时,查询全部用户,当map有具体的数据,譬如说id,那么就会找到对应id的所有数据

编写DynamicUserMapper接口

package com.qin.mapper;import com.qin.pojo.User;import java.util.List;import java.util.Map;public interface DynamicUserMapper {
//输入id就查询指定用户,不输入id就查询全部用户 List
queryDynamicUser(Map map);}

编写DynamicUserMapper.xml文件(重点)

我们来理解一下,当test里面的id不为空时sql语句怎么写,为空时怎么写的

  • 不为空 :select * from mybatis.user where 1 = 1 and id = #{id}
  • 为空 :select * from mybatis.user where 1 = 1

显而易见我们把后面的 and id 在不同输入情况下,把他拼接了

编写测试文件(重点)我们如何实现输入值为空,或者不为空

package com.qin.mapper;import com.qin.pojo.User;import com.qin.utils.MybatisUtils;import org.apache.ibatis.session.SqlSession;import org.junit.Test;import java.util.HashMap;import java.util.List;public class DynamicUserMapperTest {
@Test public void queryDynamicUserTest(){
SqlSession sqlSession = new MybatisUtils().getSqlSession(); DynamicUserMapper mapper = sqlSession.getMapper(DynamicUserMapper.class); //new 一个HashMap,实现传参 HashMap map = new HashMap(); map.put("id","1"); //当我们把这句代码注释掉,输入为空,查询所有用户,当我们不注释掉查找id为1的用户,就是这样实现了sql的动态拼接 List
userList = mapper.queryDynamicUser(map); for (User user : userList) {
System.out.println(user); } sqlSession.close(); }}

2.choose、when、otherwise的使用

  • 让我们先来了解一下功能,与注意事项
  • choose when otherwise 相当于switch case语句
  • 传递的参数也是map

编写DynamicUserMapper接口

package com.qin.mapper;import com.qin.pojo.User;import java.util.List;import java.util.Map;public interface DynamicUserMapper {
//不同的输入条件,实现不同的查询 List
queryChooseUser(Map map);}

编写DynamicUserMapper.xml(重点)

编写测试文件(重点)我们如何实现输入值选择判断

package com.qin.mapper;import com.qin.pojo.User;import com.qin.utils.MybatisUtils;import org.apache.ibatis.session.SqlSession;import org.junit.Test;import java.util.HashMap;import java.util.List;public class DynamicUserMapperTest {
@Test public void queryDynamicUserTest(){
SqlSession sqlSession = new MybatisUtils().getSqlSession(); DynamicUserMapper mapper = sqlSession.getMapper(DynamicUserMapper.class); HashMap map = new HashMap(); //当把这两行注释掉,查询全部用 //当把id注释掉,查询名字为秦刚的信息 //当把name注释掉,查询id为1 的信息 //当id 和 name 都不注释掉,查询id,先到先得,switch case map.put("id",1); map.put("name","秦刚"); List
userList = mapper.queryChooseUser(map); for (User user : userList) {
System.out.println(user); } sqlSession.close(); }}

3. where 使用

这里我们借鉴mybatis官方文档的例子

  • 如果没有匹配的条件会怎么样?最终这条 SQL 会变成这样:
    SELECT * FROM BLOG WHERE
    select * from blog where 这样肯定是不行的
  • 这会导致查询失败。如果匹配的只是第二个条件又会怎样?这条 SQL 会是这样:
    SELECT * FROM BLOG WHERE AND title like ‘someTitle’
    select * from blog where and title like ‘some Title’
  • 这个查询也会失败

解决办法

where标签会自动帮我们把and加上或者不加上,会自动帮我们把where加上或者不加上

4.set的使用

  • 我们先来随便看一个修改语句吧
    update mybatis.user set name=#{name},pwd=#{pwd} where id=#{id}
  • 这只是修改2个值,通过id 修改name 和 pwd
  • 但是呢!!如果我有10个属性,10个字段,难道我们每次都需要修改所有的字段吗?要是上百个字段呢??这显然是不合理的
  • 所以我们需要动态的修改,只修改我们想要修改的
  • set标签很好的帮我们解决了这个问题
update Author
username=#{username},
password=#{password},
email=#{email},
bio=#{bio}
where id=#{id}

set 标签解决了哪些问题呢?

  1. 通过set标签我们可以只需要修改自己想要修改的字段
  2. 逗号,他帮我们解决了逗号的问题,
    1. 当我们只想要修改一个字段的时候,是没有使用到逗号的,set标签帮我们处理了
    2. 最后一个字段是不需要添加逗号的,set标签也非常智能的替我们解决了,而我们只需要在每个字段后面加上一个逗号即可

5.foreach对集合遍历

先写一个sql给大家看看

select * from blog where (id = 1 or id =2 or id =3)

这句sql的意思是我要查询blog表的 id 为 1 或者为2 再或者为3 的blog的信息

但是我们怎么在xml文件中写呢!!似乎不太好写,foreach替我们解决了

编写BlogMapper接口

//查询第一二三号的记录的博客    List
queryBlogForeach(Map map);

编写BlogMapper.xml(重中之重)

在这里插入图片描述### 编写测试类(重要)

@Test    public void queryBlogForeach(){
SqlSession sqlSession = new MybatisUtils().getSqlSession(); BlogMapper mapper = sqlSession.getMapper(BlogMapper.class); HashMap map = new HashMap(); //因为是集合所以要用数组 ArrayList
ids = new ArrayList<>(); ids.add(1); //当着两行被注释掉查询所有博客 ids.add(2); //不注释掉查询id为1和2的博客 map.put("ids",ids); //"ids" 对应xml文件的collection的ids 第二个ids 指的是上面ArrayList的ids 也就是传递的参数 List
blogs = mapper.queryBlogForeach(map); for (Blog blog : blogs) {
System.out.println(blog); } sqlSession.close(); }

转载地址:http://mhnki.baihongyu.com/

你可能感兴趣的文章
Android&nbsp;HAL基础
查看>>
Android电源管理(zz)
查看>>
Android平台开发-Android&nbsp;HAL&nbsp;deve…
查看>>
Android&nbsp;HAL基础
查看>>
2011年06月21日
查看>>
2011年06月21日
查看>>
Android&nbsp;Sensor传感器系统架构初探
查看>>
Android的传感器HAL层的书写---基…
查看>>
生成和使用动态链接库和静态链接库…
查看>>
linux工作队列(转)
查看>>
工作队列的初始化(INIT_WORK的参…
查看>>
sysfs&nbsp;and&nbsp;/proc/bus/usb/device
查看>>
linux工作队列(转)
查看>>
跟我一起写udev规则(译)
查看>>
sysfs&nbsp;and&nbsp;/proc/bus/usb/device
查看>>
跟我一起写udev规则(译)
查看>>
USB和sysfs文件系统
查看>>
USB和sysfs文件系统
查看>>
udev(八):实战:使用udevadm修…
查看>>
android开发环境搭建(for&nbsp;驱动开发…
查看>>