您当前的位置: 首页 >  Java

彭世瑜

暂无认证

  • 1浏览

    0关注

    2791博文

    0收益

  • 0浏览

    0点赞

    0打赏

    0留言

私信
关注
热门博文

Java:MyBatis动态SQL实践

彭世瑜 发布时间:2020-07-25 23:23:52 ,浏览量:1

项目结构

$ tree
.
├── README.md
├── pom.xml
└── src
    ├── main
    │   ├── java
    │   │   └── com
    │   │       └── mouday
    │   │           ├── mapper
    │   │           │   ├── PersonMapper.java
    │   │           │   └── PersonMapper.xml
    │   │           ├── pojo
    │   │           │   └── Person.java
    │   │           └── util
    │   │               └── MyBatisUtil.java
    │   └── resources
    │       ├── db.properties
    │       ├── mybatis-config.xml
    │       └── sql
    │           └── person.sql
    └── test
        └── java
            └── com
                └── mouday
                    └── PersonTest.java

依赖 pom.xml



    4.0.0

    com.mouday
    mybatis-demo
    1.0-SNAPSHOT

    
        
            
            
                src/main/java
                
                    **/*.xml
                
                true
            
        
    

    
        
            org.mybatis
            mybatis
            3.5.5
        

        
            mysql
            mysql-connector-java
            8.0.20
        

        
            org.projectlombok
            lombok
            1.18.12
            provided
        

        
            junit
            junit
            4.11
            test
        
    

数据库配置 db.properties

driver=com.mysql.cj.jdbc.Driver
url=jdbc:mysql://localhost:3306/data
username=root
password=123456

MyBatis配置 mybatis-config.xml





    
    

    
    
        
    

    
    
        
    

    
        
            
            
                
                
                
                
            
        
    

    
        
    

建表插入数据 person.sql

-- 建表
create table person(
    id int not null primary key auto_increment,
    name varchar(20),
    age int
);

-- 插入数据
insert into person(name, age) values('刘备', 25);
insert into person(name, age) values('关羽', 24);
insert into person(name, age) values('张飞', 23);
insert into person(name, age) values('曹操', 25);
insert into person(name, age) values('许褚', 24);
insert into person(name, age) values('孙权', 25);
insert into person(name, age) values('周瑜', 24);

工具类 MyBatisUtil.java

package com.mouday.util;


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 MyBatisUtil {

    private static SqlSessionFactory factory = null;

    // 使用static静态代码块,随着类的加载而加载,只执行一次
    static {
        try {
            String resource = "mybatis-config.xml";
            // 加载MyBatis的主配置文件
            InputStream inputStream = Resources.getResourceAsStream(resource);
            // 通过构建器(SqlSessionFactoryBuilder)构建一个SqlSessionFactory工厂对象
            factory = new SqlSessionFactoryBuilder().build(inputStream);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    public static SqlSession getSqlSession() throws IOException {
        return factory.openSession();
    }
}



实体Person.java

package com.mouday.pojo;

import lombok.Getter;
import lombok.Setter;

@Setter
@Getter
public class Person {
    private Integer id;
    private String name;
    private Integer age;
}

mapper接口 PersonMapper.java

package com.mouday.mapper;

import com.mouday.pojo.Person;

import java.util.List;

public interface PersonMapper {
    List selectAll();

    /**
     * 根据输入的信息进行条件检索
     * 1. 当只输入用户名时, 使用用户名进行 【模糊检索】
     * 2. 当只输入年龄时, 使用性别进行 【完全匹配】
     * 3. 当用户名和年龄都存在时, 用这两个条件进行查询匹配的用
     */
    List selectByPersonSelective(Person person);

    /**
     * 更新非空属性
     */
    int updateByPrimaryKeySelective(Person person);

    /**
     * 插入非空字段
     */
    int insertSelective(Person person);

    /**
     * 当 name 没有值时, 使用 name 进行查询
     * 否则使用 id 进行查询
     */
    List selectByNameOrId(Person person);

}

mapper映射文件 PersonMapper.xml






    
        id, name, age
    

    
    select
    
    from person
    


    
        select
        
        from person
        
            
                and name like concat('%', #{name}, '%')
            
            
                and age=#{age}
            
        
    


    
    update person
    
        
            `name` = #{name,jdbcType=VARCHAR},
        

        
            `age` = #{age,jdbcType=INTEGER},
        

    
    where id = #{id,jdbcType=INTEGER}
    


    
        insert into person
        
            
                id,
            
            
                `name`,
            
            
                age,
            
        
        
            
                #{id,jdbcType=INTEGER},
            
            
                #{name,jdbcType=VARCHAR},
            
            
                #{age,jdbcType=INTEGER},
            

        
    



    
        select
        
        from person
        where 1=1
        
            
                and id=#{id}
            

            
                and name=#{name}
            
        
    


测试文件PersonTest.java

package com.mouday;

import com.mouday.mapper.PersonMapper;
import com.mouday.pojo.Person;
import com.mouday.util.MyBatisUtil;
import org.apache.ibatis.session.SqlSession;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;

import java.io.IOException;

public class PersonTest {

    private SqlSession session;
    private PersonMapper mapper;

    @Before
    public void init() throws IOException {
        this.session = MyBatisUtil.getSqlSession();
        this.mapper = this.session.getMapper(PersonMapper.class);
    }

    @After
    public void destroy() {
        this.session.close();
    }

    @Test
    public void testSelect() {
        System.out.println(mapper.selectAll());
    }

    /**
     * 选择数据
     */
    @Test
    public void testSelectByStudentSelective() {

        Person person = new Person();
        System.out.println(mapper.selectByPersonSelective(person));
        // select id, name, age from person

        person.setName("操");
        System.out.println(mapper.selectByPersonSelective(person));
        // select id, name, age from person WHERE name like concat('%', ?, '%')

        person.setAge(25);
        System.out.println(mapper.selectByPersonSelective(person));
        // select id, name, age from person WHERE name like concat('%', ?, '%') and age=?
    }

    /**
     * 更新数据
     */
    @Test
    public void testUpdateByPrimaryKeySelective() {
        Person person = new Person();
        person.setId(1);
        person.setAge(26);

        mapper.updateByPrimaryKeySelective(person);
        // update person SET `age` = ? where id = ?
        session.commit();

        person.setName("刘禅");
        mapper.updateByPrimaryKeySelective(person);
        session.commit();
        // update person SET `name` = ?, `age` = ? where id = ?
    }

    /**
     * 插入数据
     */
    @Test
    public void testInsertSelective() {
        Person person = new Person();
        person.setName("司马懿");


        mapper.insertSelective(person);
        // insert into person ( `name` ) values ( ? )
        session.commit();

        person.setAge(26);
        mapper.insertSelective(person);
        // insert into person ( `name`, age ) values ( ?, ? )

        session.commit();
    }

    /**
     * 选择查询
     */
    @Test
    public void testSelectByNameOrId() {
        Person person = new Person();
        person.setName("司马懿");

        mapper.selectByNameOrId(person);
        // select id, name, age from person where 1=1 and name=?


        person.setId(1);
        mapper.selectByNameOrId(person);
        // select id, name, age from person where 1=1 and id=?
    }
}

Where

set 和 where 其实都是 trim 标签的一种类型

where 等价于



表示当 trim 中含有内容时, 添加 where, 且第一个为 and 或 or 时, 会将其去掉。 而如果没有内容, 则不添加 where。

set 等价于


  ...

表示当 trim 中含有内容时, 添加 set, 且最后的内容为 , 时, 会将其去掉。而没有内容, 不添加 set

trim 的几个属性

prefix: 当 trim 元素包含有内容时, 增加 prefix 所指定的前缀
prefixOverrides: 当 trim 元素包含有内容时, 去除 prefixOverrides 指定的 前缀
suffix: 当 trim 元素包含有内容时, 增加 suffix 所指定的后缀
suffixOverrides:当 trim 元素包含有内容时, 去除 suffixOverrides 指定的后缀

参考

  1. 你用过Mybatis的动态SQL后,就知道写SQL有多爽了!
  2. https://mybatis.org/mybatis-3/zh/dynamic-sql.html
关注
打赏
1665367115
查看更多评论
立即登录/注册

微信扫码登录

0.1826s