MyBatis动态SQL

2020-03-15  本文已影响0人  煗NUAN

一.动态SQL简介

二.进行判断

a. if元素

<select id="findActiveBlogLike"
     resultType="Blog">
  SELECT * FROM BLOG WHERE state = ‘ACTIVE’
  <if test="title != null">
    AND title like #{title}
  </if>
  <if test="author != null and author.name != null">
    AND author_name like #{author.name}
  </if>
</select>

b. choose、when、otherwise

<select id="findActiveBlogLike"
     resultType="Blog">
  SELECT * FROM BLOG WHERE state = ‘ACTIVE’
  <choose>
    <when test="title != null">
      AND title like #{title}
    </when>
    <when test="author != null and author.name != null">
      AND author_name like #{author.name}
    </when>
    <otherwise>
      AND featured = 1
    </otherwise>
  </choose>
</select>

三.拼接关键字

a. where

<select id="findActiveBlogLike"
     resultType="Blog">
  SELECT * FROM BLOG
  <where>
    <if test="state != null">
         state = #{state}
    </if>
    <if test="title != null">
        AND title like #{title}
    </if>
    <if test="author != null and author.name != null">
        AND author_name like #{author.name}
    </if>
  </where>
</select>

b. set

<update id="updateAuthorIfNecessary">
  update Author
    <set>
      <if test="username != null">username=#{username},</if>
      <if test="password != null">password=#{password},</if>
      <if test="email != null">email=#{email},</if>
      <if test="bio != null">bio=#{bio}</if>
    </set>
  where id=#{id}
</update>

c. trim

<trim prefix="WHERE" prefixOverrides="AND |OR ">
  ...
</trim>

四.进行循环

a. foreach

b. 单参数List的类型

<select id="dynamicForeachTest" resultMap="BaseResultMap">
    select * from userinfo where uid in
    <foreach collection="list" index="index" item="item" open="(" separator=","close=")">
        #{item}
    </foreach>
</select>
public void findByIds(){
        SqlSession sqlSession = MyBatisUtils.getSqlSession();
        UserinfoMapper mapper = sqlSession.getMapper(UserinfoMapper.class);
        List list = new ArrayList();
        list.add(2);
        list.add(3);
        list.add(9);
        List<Userinfo> userList = mapper.dynamicForeachTest(list);
        for (Userinfo userinfo : userList) {
            System.out.println(userinfo.getUserName()+"\t"+userinfo.getUserPass());
        }
        sqlSession.close();
    }

c. 单参数array数组的类型

<select id="dynamicForeach2Test" resultMap="BaseResultMap">
    select * from userinfo where uid in
    <foreach collection="array" index="index" item="item" open="(" separator="," close=")">
        #{item}
    </foreach>
</select>
public void findByIds2(){
        SqlSession sqlSession = MyBatisUtils.getSqlSession();
        UserinfoMapper mapper = sqlSession.getMapper(UserinfoMapper.class);
        Long[] ids = new Long[]{2l,3l,9l};
        List<Userinfo> userList = mapper.dynamicForeach2Test(ids);
        for (Userinfo userinfo : userList) {
            System.out.println(userinfo.getUserName()+"\t"+userinfo.getUserPass());
        }
        sqlSession.close();
    }

d. 把参数封装成Map的类型

<select id="dynamicForeach3Test" resultMap="BaseResultMap">
    select * from userinfo where user_name like "%"#{userName}"%" and uid in
    <foreach collection="ids" index="index" item="item" open="(" separator="," close=")">
        #{item}
    </foreach>
</select>
public void findByIds3(){
    SqlSession sqlSession = MyBatisUtils.getSqlSession();
    UserinfoMapper mapper = sqlSession.getMapper(UserinfoMapper.class);
    List list = new ArrayList();
    list.add(2);
    list.add(3);
    list.add(9);
    Map params = new HashMap();
    params.put("ids",list);
    params.put("userName","db");
    List<Userinfo> userList = mapper.dynamicForeach3Test(params);
    for (Userinfo userinfo : userList) {
        System.out.println(userinfo.getUserName()+"\t"+userinfo.getUserPass());
    }
    sqlSession.close();
}

五.例题

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configuration
        PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
        "http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
    <!--引入外部配置文件db.properties-->
    <properties resource="db.properties" />

    <!--引入第三方日志包log4j-->
    <settings>
        <setting name="logImpl" value="LOG4J"/>
    </settings>

    <!--起别名使用package标签可以匹配com.yanm.pojo包下的所有类,并且不区分大小写
        也可使用typeAlias标签匹配指定类型-->
    <typeAliases>
        <package name="com.yanm.pojo" />
    </typeAliases>

    <!--配置mybatis环境变量-->
    <environments default="development">
        <environment id="development">
            <!--配置JDBC事务控制,由mybatis进行管理-->
            <transactionManager type="JDBC"/>
            <!--配置数据源,采用mybatis连接池-->
            <dataSource type="POOLED">
                <property name="driver" value="${driver}"/>
                <property name="url" value="${url}"/>
                <property name="username" value="${user}"/>
                <property name="password" value="${pass}"/>
            </dataSource>
        </environment>
    </environments>
    <!--加载映射文件-->
    <mappers>
        <!--使用资源的路径,匹配dao/IUserDao.xml包下的所有接口-->
        <mapper resource="dao/IUserDao.xml" />
    </mappers>
</configuration>
driver=org.mariadb.jdbc.Driver
url=jdbc:mariadb://localhost:3306/mall
user=root
pass=root
# 全局日志配置
# 共有四个级别 ERROE,DEBUG,WARN,INFO
log4j.rootLogger=ERROR, stdout, F
# MyBatis 日志配置,可以指定到包下,也可以指定到类上,也可以指定到类中的某一个方法
log4j.logger.com.yanm.dao.IUserDao=TRACE
# 控制台输出
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern=%6p [%t] - %m%n

#打印到文件myproj.log中--专门为DAO层服务
log4j.appender.F = org.apache.log4j.DailyRollingFileAppender
log4j.appender.F.File =myproj.log
log4j.appender.F.Append = true
log4j.appender.F.Threshold = ERROE
log4j.appender.F.layout=org.apache.log4j.PatternLayout
log4j.appender.F.layout.ConversionPattern=%-d{yyyy-MM-dd HH\:mm\:ss}-[%p %F\:%L]  %m%n
<?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.yanm.dao.IUserDao">

    <!--可以把重复的语句提取出来,之后可以使用include refid="#"进行调用-->
    <sql id="getAll">
        select * from user
    </sql>

    <select id="getAllUser" resultType="User">
        <include refid="getAll" />
    </select>

    <select id="getUserById" resultType="user">
        <include refid="getAll" />
            where uid=#{uid}
    </select>

    <select id="getXiaoqiaoAndAge" resultType="User">
        <include refid="getAll" />
        <where>
            <if test="username!=null">
                username=#{username}
            </if>

            <if test="age!=null">
                or age=#{age}
            </if>
        </where>
    </select>

    <select id="getUserByIds" resultType="User">
        <include refid="getAll" />
        <where>
            uid in
            <foreach  collection="uids" item="uid" index="index"  open="(" separator="," close=")">
                #{uid}
            </foreach>
        </where>
    </select>

</mapper>
@Data
@AllArgsConstructor
@NoArgsConstructor
public class User {
    private int uid;
    private String username;
    private String password;
    private int age;
    private String addr;
}
public interface IUserDao {

    //获取所有的用户信息
    List<User> getAllUser();

    //根据id获取用户信息
    User getUserById(int uid);

    //查询name是小乔或者大乔的个人信息
    List<User> getXiaoqiaoAndAge(Map map);

    //查询多个id查询用户信息
    List<User> getUserByIds(Map map);
}
package dao;

import com.yanm.dao.IUserDao;
import com.yanm.pojo.User;
import com.yanm.utils.SessionUtils;
import org.apache.ibatis.session.SqlSession;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;

import java.util.*;

public class TestSQL {
    private SqlSession ss=null;

    @Before
    public void beforeSQL(){
        ss= SessionUtils.getSqlSession();
    }

    @After
    public void afterSQL(){
        SessionUtils.SqlSessionClose(ss);
    }

    @Test
    public void getAllUser(){
        IUserDao dao=ss.getMapper(IUserDao.class);

        List<User> users = dao.getAllUser();
        for (User user : users) {
            System.out.println(user);
        }
    }


    @Test
    public void getUserById(){
        IUserDao dao=ss.getMapper(IUserDao.class);

        User user = dao.getUserById(2);
        System.out.println(user);
    }

    @Test
    public void getXiaoqiaoAndAge(){
        IUserDao dao=ss.getMapper(IUserDao.class);

        Map<String,Object> map=new HashMap<String, Object>();
        map.put("username","大乔");
        map.put("age",20);

        List<User> users = dao.getXiaoqiaoAndAge(map);
        for (User user : users) {
            System.out.println(user);
        }
    }

    @Test
    public void getUserByIds(){
        IUserDao dao=ss.getMapper(IUserDao.class);

        List<Integer> uids=new ArrayList<Integer>();
        Collections.addAll(uids,1,2,3,5);

        Map<String,Object> map=new HashMap<String, Object>();

        map.put("uids",uids);

        List<User> users = dao.getUserByIds(map);
        for (User user : users) {
            System.out.println(user);
        }
    }
}
public class SessionUtils {
    private static SqlSessionFactory ssf=null;
    private static SqlSession ss=null;

    static {
        try {
            ssf=new SqlSessionFactoryBuilder().build(Resources.getResourceAsStream("mybatis.xml"));
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    //获取SqlSession对象
    public static SqlSession getSqlSession(){
        ss=ssf.openSession(true);
        return ss;
    }

    //关闭SqlSession对象
    public static void SqlSessionClose(SqlSession s){
        if (s!=null){
            s.close();
            s=null;
        }
    }
}
上一篇 下一篇

猜你喜欢

热点阅读