victory的博客

长安一片月,万户捣衣声

0%

MyBatis | 动态SQL

动态SQL

1.项目目录

2.EmpMapper.java

package com.atguigu.mapper;

import java.util.List;

import org.apache.ibatis.annotations.Param;

import com.atguigu.bean.Emp;

public interface EmpMapper {
    //根据eid,ename,age,sex多条件查询员工信息
    List<Emp> getEmpListByMoreTJ(Emp emp);
    
    //根据eid,ename,age,sex其中一个查询员工信息
    List<Emp> getEmpListByChoose(Emp emp);
    
    //添加员工信息,将0|1-->女|男
    void insertEmp(Emp emp);
    
    //根据eid所组成的字符串进行批量删除
    void deleteMoreEmp(String eids);
    
    //通过list集合实现批量删除
    //void deleteMoreByList(List<Integer> eids);
    void deleteMoreByList(@Param("eids")List<Integer> eids);
    
    //批量添加
    void insertMoreByArray(Emp[] emps);
    
    //批量修改
    void updateMoreByArray(@Param("emps")Emp[] emps);
}

3.EmpMapper.xml

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
 PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
 "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
 
<mapper namespace="com.atguigu.mapper.EmpMapper">
    <!--
         <sql id=""></sql>:设置一段SQL片段,即公共SQL,可以被当前映射文件中所有的SQL语句所访问
     -->
    <sql id="empColumns">
        select eid,ename,age,sex,did from emp
    </sql>

    <!-- List<Emp> getEmpListByMoreTJ(); -->
    <!--
        多条件查询:若页面中没有设置此条件,SQL语句中一定不能有该条件
     -->
    <!--
        <if test=""></if>:通过test表达式拼接SQL 
        <where>:添加where关键字并去掉多余的and
        <trim prefix="" suffix="" prefixOverrides="" suffixOverrides="">:截取并拼接
        prefix:在操作的SQL语句前加入某些内容
        suffix:在操作的SQL语句后加入某些内容
        prefixOverrides:把操作的SQL语句前的某些内容去掉
        suffixOverrides:把操作的SQL语句后的某些内容去掉
     -->
    <select id="getEmpListByMoreTJ" resultType="Emp">
        <!-- select eid,ename,age,sex,did from emp
        where 1 = 1
        <if test="eid != null">
            and eid=#{eid}
        </if>
        <if test="ename != null and ename != ''">
            and ename=#{ename}
        </if>
        <if test="age != null">
            and age=#{age}
        </if>
        <if test="sex == '1' or sex == '0'">
            and sex=#{sex}
        </if> -->
        
        
        <!-- select eid,ename,age,sex,did from emp
        <where>
            <if test="eid != null">
                and eid=#{eid}
            </if>
            <if test="ename != null and ename != ''">
                and ename=#{ename}
            </if>
            <if test="age != null">
                and age=#{age}
            </if>
            <if test="sex == '1' or sex == '0'">
                and sex=#{sex}
            </if>
        </where> -->
        
        <!-- select eid,ename,age,sex,did from emp -->
        <include refid="empColumns"></include>
        <trim prefix="where" suffixOverrides="and|or">
            <if test="eid != null">
                eid=#{eid} and
            </if>
            <if test="ename != null and ename != ''">
                ename=#{ename} and
            </if>
            <if test="age != null">
                age=#{age} or
            </if>
            <if test="sex == '1' or sex == '0'">
                sex=#{sex}
            </if>
        </trim>
    </select>
    
    <!-- List<Emp> getEmpListByChoose(Emp emp); -->
    <!--
        <choose>选择某一个when或otherwise执行
            <when test=""></when>:通过test表达式拼接SQL
            .
            .
            .
            <otherwise></otherwise>:当when都不符合条件,就会选择otherwise拼接SQL语句
        </choose> 
     -->
    <select id="getEmpListByChoose" resultType="Emp">
        select eid,ename,age,sex from emp
        where 
        <choose>
            <when test="eid != null">
                eid = #{eid}
            </when>
            <when test="ename != null and ename != ''">
                ename = #{ename}
            </when>
            <when test="age != null">
                age = #{age}
            </when>
            <otherwise>
                sex = #{sex}
            </otherwise>
        </choose>
    </select>
    
    <!-- void insertEmp(Emp emp); -->
    <insert id="insertEmp">
        insert into emp(eid,ename,age,sex) values(
            null,
            #{ename},
            #{age},
            <choose>
                <when test="sex == 0">'女'</when>
                <when test="sex == 1">'男'</when>
                <otherwise>'不详'</otherwise>
            </choose>
        )
    </insert>
    
    <!-- void deleteMoreEmp(String eids); -->
    <delete id="deleteMoreEmp">
        delete from emp where eid in (${value})
    </delete>
    
    <!-- void deleteMoreByList(List<Integer> eids); -->
    <!--
        <foreach collection="eids" item="" close="" open="" separator="" index=""></foreach>
        对一个数组或集合进行遍历
        collection:指定要遍历的集合或数组
        item:设置别名
        close:设置循环体的结束内容
        open:设置循环体的开始内容
        separator:设置每一次循环之间的分隔符
        index:若遍历的是list集合,index代表下标;若遍历的是map结合,index代表键
     -->
     <!--
        delete from emp where eid in ();
        delete from emp where eid = 1 or eid = 2 or eid = 3 
      -->
    <delete id="deleteMoreByList">
        <!-- delete from emp where eid in 
        <foreach collection="list" item="eid" separator="," open="(" close=")">
            #{eid}
        </foreach> -->
        
        delete from emp where
        <!-- <foreach collection="list" item="eid" separator="or">
            eid = #{eid}
        </foreach> -->
        <foreach collection="eids" item="eid" separator="or">
            eid = #{eid}
        </foreach>
    </delete>
    
    <!--
        delete:
            delete from emp where eid in ();
            delete from emp where eid = 1 or eid = 2 or eid = 3 
        select:
            select * from emp where eid in ();
            select * from emp where eid = 1 or eid = 2 or eid = 3 
        update:
            把每条数据修改成相同内容
            update emp set ... where eid in ();
            update emp set ... where eid = 1 or eid = 2 or eid = 3 
            把每条数据修改成对应内容,注意必须在链接地址(url)后添加?allowMultiQueries=true
            update emp set ... where eid=1;
            update emp set ... where eid=2;
            update emp set ... where eid=3;
        insert:
            insert into emp values(),(),()
     -->
     
     <!-- void insertMoreByArray(Emp[] emps); -->
     <insert id="insertMoreByArray">
        insert into emp values
        <foreach collection="array" item="emp" separator=",">
            (null,#{emp.ename},#{emp.age},#{emp.sex},1)
        </foreach>
     </insert>
     
     <!-- void updateMoreByArray(@Param("emps")Emp[] emps); -->
     <update id="updateMoreByArray">
        <foreach collection="emps" item="emp">
            update emp set ename=#{emp.ename}, age=#{emp.age}, sex=#{emp.sex} where eid = #{emp.eid};
        </foreach>
     </update>
</mapper>

4.TestDynamicSQl.java

package com.atguigu.test;

import java.io.IOException;
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.Test;

import com.atguigu.bean.Emp;
import com.atguigu.mapper.EmpMapper;

public class TestDynamicSQL {
    @Test
    public void TestMore() throws Exception{
        SqlSessionFactory sqlSessionFactory = getSqlSessionFactory();
        SqlSession sqlSession = sqlSessionFactory.openSession(true);
        EmpMapper mapper = sqlSession.getMapper(EmpMapper.class);
        
        //批量删除
//        List<Integer> eids = new ArrayList<>();
//        eids.add(10);
//        eids.add(16);
//        eids.add(17);
//        mapper.deleteMoreByList(eids);//只能删除id为1的员工
        
        //批量添加
        //Emp[] emps = new Emp[3];
        //Emp[] emps = new Emp[]{};
        //Emp[] emps = {};
//        Emp emp1 = new Emp(null, "a",23,"男");
//        Emp emp2 = new Emp(null, "aa",23,"男");
//        Emp emp3 = new Emp(null, "aaa",23,"男");
//        Emp[] emps = {emp1, emp2, emp3};
//        mapper.insertMoreByArray(emps);
        
        //批量修改(需要在jdbc.url后加?allowMultiQueries=true)
        //jdbc.url=jdbc:mysql://localhost:3306/ssm?allowMultiQueries=true
        Emp emp1 = new Emp(20, "a1",233,"女");
        Emp emp2 = new Emp(21, "aa1",233,"女");
        Emp emp3 = new Emp(22, "aaa1",233,"女");
        Emp[] emps = {emp1, emp2, emp3};
        mapper.updateMoreByArray(emps);
    }
    
    @Test
    public void TestChoose() throws Exception{
        SqlSessionFactory sqlSessionFactory = getSqlSessionFactory();
        SqlSession sqlSession = sqlSessionFactory.openSession(true);
        EmpMapper mapper = sqlSession.getMapper(EmpMapper.class);
        
        //测试1
        //Emp emp = new Emp();
//        emp.setEid(1);
//        emp.setEname("张三");
//        emp.setAge(12);
        //emp.setSex("1");
//        List<Emp> list = mapper.getEmpListByChoose(emp);
//        for (Emp e : list) {
//            System.out.println(e);
//        }
        
        //测试2
//        Emp emp = new Emp();
//        emp.setEname("张三");
//        emp.setAge(12);    
//        emp.setSex("1");
//        mapper.insertEmp(emp);
        
        Emp emp = new Emp();
        emp.setEname("张三三");
        emp.setAge(12);    
        emp.setSex("123");
        mapper.insertEmp(emp);
    }
    
    @Test
    public void TestIf() throws Exception{
        SqlSessionFactory sqlSessionFactory = getSqlSessionFactory();
        SqlSession sqlSession = sqlSessionFactory.openSession(true);
        EmpMapper mapper = sqlSession.getMapper(EmpMapper.class);
        Emp emp = new Emp();
        //emp.setEid(1);
        emp.setEname("张三");
        emp.setAge(12);
        //emp.setSex("1");
        List<Emp> list = mapper.getEmpListByMoreTJ(emp);
        for (Emp e : list) {
            System.out.println(e);
        }
    }
    
    public SqlSessionFactory getSqlSessionFactory() throws Exception{
        InputStream is = Resources.getResourceAsStream("mybatis-config.xml");
        SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(is);
        return sqlSessionFactory;
    }
}