Spring_MyBatis 使用动态 SQL 语句

一、文件结构

二、代码

 1 package mybatis.entity;
 2 
 3 public class Entity {
 4     private int id;
 5     private String name;
 6     private String sex;
 7     @Override
 8     public String toString() {
 9         return "Entity [id=" + id + ", name=" + name + ", sex=" + sex + "]";
10     }
11     public Entity(int id, String name, String sex) {
12         super();
13         this.id = id;
14         this.name = name;
15         this.sex = sex;
16     }
17     public Entity() {
18         super();
19     }
20     public int getId() {
21         return id;
22     }
23     public void setId(int id) {
24         this.id = id;
25     }
26     public String getName() {
27         return name;
28     }
29     public void setName(String name) {
30         this.name = name;
31     }
32     public String getSex() {
33         return sex;
34     }
35     public void setSex(String sex) {
36         this.sex = sex;
37     }
38     
39 }
Entity
 1 package mybatis.mapper;
 2 
 3 import java.util.List;
 4 
 5 import mybatis.entity.Entity;
 6 
 7 /**
 8  * 定义一个映射器
 9  *  1.映射文件(mybatis/entity/EntityMapper.xml)中的namespace的值修改成映射器的完全限定名 
10  *  2.映射器中方法的名称与映射文件中的节点的id值一致,参数和返回类型也一致
11  */
12 public interface PerMapper {
13     public List<Entity> selectWithCondition(Entity en);
14     public List<Entity> selectWithChoose(Entity en);
15     public List<Entity> selectWithWhere(Entity en);
16     public List<Entity> selectWithTrim(Entity en);
17     public int updataById(Entity en);
18     public List<Entity> SelectForeachIn(List<Integer> list);
19     public int insertForeach(List<Entity> list);
20     public int updateForeachById(List<Entity> list);
21     public int forEachUpdate(List<Entity> list);
22 }
PerMapper
  1 package mybatis.test;
  2 
  3 import java.util.ArrayList;
  4 import java.util.List;
  5 import org.apache.ibatis.session.SqlSession;
  6 import org.apache.ibatis.session.SqlSessionFactory;
  7 import org.junit.Before;
  8 import org.junit.Test;
  9 import mybatis.entity.Entity;
 10 import mybatis.mapper.PerMapper;
 11 import mybatis.util.SqlSessionFactoryUtil;
 12 
 13 public class TestMybatis {
 14     public SqlSessionFactory sqlSessionFactory = null;
 15 
 16     @Before
 17     public void init() {
 18         sqlSessionFactory = SqlSessionFactoryUtil.getSqlSessionFactoryInstance();
 19     }
 20 
 21     @Test
 22     public void selectByIf() {
 23         SqlSession session = sqlSessionFactory.openSession();
 24         PerMapper mapper = session.getMapper(PerMapper.class);
 25         Entity en = new Entity();
 26         en.setId(103);
 27         List<Entity> list = mapper.selectWithCondition(en);
 28         System.out.println(list);
 29         session.close();
 30     }
 31     @Test
 32     public void selectByChoose() {
 33         SqlSession session = sqlSessionFactory.openSession();
 34         PerMapper mapper = session.getMapper(PerMapper.class);
 35         Entity en = new Entity();
 36         //en.setId(103);
 37         //en.setName("孙悟空");
 38         en.setSex("男");
 39         List<Entity> list = mapper.selectWithChoose(en);
 40         for (Entity e : list) {
 41             System.out.println(e);
 42         }
 43         session.close();
 44     }
 45     @Test
 46     public void selectByWhere() {
 47         SqlSession session = sqlSessionFactory.openSession();
 48         PerMapper mapper = session.getMapper(PerMapper.class);
 49         Entity en = new Entity();
 50         //en.setId(103);
 51         //en.setName("孙悟空");
 52         en.setSex("女");
 53         List<Entity> list = mapper.selectWithWhere(en);
 54         for (Entity e : list) {
 55             System.out.println(e);
 56         }
 57         session.close();
 58     }
 59     @Test
 60     public void selectByTrim() {
 61         SqlSession session = sqlSessionFactory.openSession();
 62         PerMapper mapper = session.getMapper(PerMapper.class);
 63         Entity en = new Entity();
 64         //en.setId(103);
 65         en.setName("孙悟空");
 66         en.setSex("女");
 67         List<Entity> list = mapper.selectWithTrim(en);
 68         for (Entity e : list) {
 69             System.out.println(e);
 70         }
 71         session.close();
 72     }
 73     @Test
 74     public void updateBySet() {
 75         SqlSession session = sqlSessionFactory.openSession();
 76         PerMapper mapper = session.getMapper(PerMapper.class);
 77         Entity en = new Entity();
 78         en.setId(106);
 79         en.setName("布尔玛");
 80         //en.setSex("m");
 81         System.out.println(mapper.updataById(en));
 82         session.commit();
 83         session.close();
 84     }
 85     @Test
 86     public void SelectForeachIn() {
 87         SqlSession session = sqlSessionFactory.openSession();
 88         PerMapper mapper = session.getMapper(PerMapper.class);
 89         ArrayList<Integer> list = new ArrayList<Integer>();
 90         list.add(101);
 91         list.add(102);
 92         list.add(103);
 93         List<Entity> list2=mapper.SelectForeachIn(list);
 94         for (Entity e : list2) {
 95             System.out.println(e);
 96         }
 97         session.close();
 98     }
 99     @Test
100     public void insertForeach() {
101         SqlSession session = sqlSessionFactory.openSession();
102         PerMapper mapper = session.getMapper(PerMapper.class);
103         ArrayList<Entity> list = new ArrayList<Entity>();
104         Entity en = new Entity();
105         list.add(new Entity(202,"龟仙人","男"));
106         list.add(new Entity(203,"天津饭","男"));
107         list.add(new Entity(204,"梦琪","女"));
108         System.out.println(mapper.insertForeach(list));
109         session.commit();
110         session.close();
111     }
112     @Test
113     public void updateForeachById() {
114         SqlSession session = sqlSessionFactory.openSession();
115         PerMapper mapper = session.getMapper(PerMapper.class);
116         ArrayList<Entity> list = new ArrayList<Entity>();
117         Entity en = new Entity();
118         en.setId(201);
119         en.setName("龟仙人");
120         en.setSex("男");
121         Entity en2 = new Entity();
122         en.setId(202);
123         en.setName("克林");
124         en.setSex("男");
125         list.add(en);
126         list.add(en2);
127         /*list.add(new Entity(201,"龟仙人","男"));
128         list.add(new Entity(202,"克林","男"));
129         list.add(new Entity(204,"兰琪","女"));*/
130         System.out.println(mapper.forEachUpdate(list));
131         session.commit();
132         session.close();
133     }
134 }
TestMybatis
 1 package mybatis.util;
 2 
 3 import java.io.IOException;
 4 import java.io.Reader;
 5 
 6 import org.apache.ibatis.io.Resources;
 7 import org.apache.ibatis.session.SqlSessionFactory;
 8 import org.apache.ibatis.session.SqlSessionFactoryBuilder;
 9 
10 /** 通过单例模式管理SqlSessionFactory对象 */
11 public class SqlSessionFactoryUtil {
12     private SqlSessionFactoryUtil() {
13     }
14 
15     /* 恶汉式 */
16     private static SqlSessionFactory sqlSessionFactory;
17     static {
18         Reader reader;
19         try {
20             reader = Resources.getResourceAsReader("mybatisConfig.xml");
21             SqlSessionFactoryBuilder builder = new SqlSessionFactoryBuilder();
22             sqlSessionFactory = builder.build(reader);
23         } catch (IOException e) {
24             e.printStackTrace();
25         }
26     }
27     public static SqlSessionFactory getSqlSessionFactoryInstance() {
28             return sqlSessionFactory;
29     }
30     /*
31      * 懒汉式: 
32      * private static SqlSessionFactory sqlSessionFactory = null;
33      * //synchronized 防并发 
34      * public synchronized static SqlSessionFactory getSqlSessionFactoryInstance() { 
35      *         if (sqlSessionFactory != null) { 
36      *             return sqlSessionFactory; 
37      * } else { 
38            Reader reader; 
39            try { 
40            reader = Resources.getResourceAsReader("mybatisConfig.xml"); 
41            SqlSessionFactoryBuilder
42            builder = new SqlSessionFactoryBuilder(); 
43            sqlSessionFactory = builder.build(reader); 
44            } catch (IOException e) { 
45                    e.printStackTrace(); }
46                 return sqlSessionFactory; 
47          * } 
48      * }
49      */
50 }
SqlSessionFactoryUtil

三、配置

  1 <?xml version="1.0" encoding="UTF-8"?>
  2 <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
  3 "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
  4 <mapper namespace="mybatis.mapper.PerMapper">
  5     <resultMap id="ResultMap" type="Entity">
  6         <!-- 映射主键 -->
  7         <id property="id" column="qid"></id>
  8         <!-- 非主键字段 -->
  9         <result property="name" column="qname"></result>
 10         <result property="sex" column="qsex"></result>
 11     </resultMap>
 12 
 13     <!-- if 查询 符合条件就添加约束 -->
 14     <select id="selectWithCondition" resultType="Entity">
 15         select * from person2 where 1=1
 16         <if test="id>0">and id=#{id}</if>
 17         <if test="name!=null">and name=#{name}</if>
 18         <if test="sex!=null">and sex=#{sex}</if>
 19     </select>
 20     <!-- choose 查询 按从上到下满足的第一个条件添加其约束 -->
 21     <select id="selectWithChoose" resultMap="ResultMap"
 22         parameterType="Entity">
 23         select id qid,name qname,sex qsex from person2 where
 24         <choose>
 25             <when test="id>0">id=#{id}</when>
 26             <when test="name!=null">name=#{name}</when>
 27             <otherwise>sex=#{sex}</otherwise>
 28         </choose>
 29     </select>
 30     <!-- where 查询 自动跟随where -->
 31     <select id="selectWithWhere" resultMap="ResultMap"
 32         parameterType="Entity">
 33         select id qid,name qname,sex qsex from person2
 34         <where>
 35             <choose>
 36                 <when test="id>0">id=#{id}</when>
 37                 <when test="name!=null">name=#{name}</when>
 38                 <otherwise>sex=#{sex}</otherwise>
 39             </choose>
 40         </where>
 41     </select>
 42     <!-- trim 查询 设置 prefix 并吸收第一个 prefixOverrides -->
 43     <select id="selectWithTrim" resultMap="ResultMap"
 44         parameterType="Entity">
 45         select * from person2
 46         <trim prefix="where" prefixOverrides="and|or">
 47             <if test="id>0">or id=#{id}</if>
 48             <if test="name!=null">or name=#{name}</if>
 49             <if test="sex!=null">or sex=#{sex}</if>
 50         </trim>
 51     </select>
 52     <!-- set 更新 符合条件就自动添加约束 注意用','分割 -->
 53     <update id="updataById" parameterType="Entity">
 54         update person2
 55         <set>
 56             <if test="name!=null">name=#{name},</if>
 57             <if test="sex!=null">sex=#{sex}</if>
 58         </set>
 59         where id=#{id}
 60     </update>
 61     <!-- foreach collection:容器类型 item:临时变量 index:下标 open:参数开始标识 separator:参数分割符 
 62         close:参数结束标识 -->
 63     <select id="SelectForeachIn" resultType="Entity"
 64         parameterType="java.util.List">
 65         select * from person2 where id in
 66         <foreach collection="list" item="i" index="index" open="("
 67             separator="," close=")">
 68             #{i}
 69         </foreach>
 70     </select>
 71     <!-- 动态sql batch(批处理) insert -->
 72     <insert id="insertForeach" parameterType="java.util.List">
 73         insert into person2 values
 74         <foreach collection="list" item="i" index="index"
 75             separator=",">
 76             (#{i.id},#{i.name},#{i.sex})
 77         </foreach>
 78     </insert>
 79     <!-- 动态sql batch(批处理) update -->
 80     <update id="updateForeachById" parameterType="java.util.List">
 81         <foreach collection="list" item="i" index="index"
 82             separator=";">
 83         update person2
 84             <set>
 85                 <if test="i.name!=null">name=#{i.name},</if>
 86                 <if test="i.sex!=null">sex=#{i.sex}</if>
 87             </set>
 88             where id=#{i.id}
 89         </foreach>
 90     </update>
 91     <update id="forEachUpdate" parameterType="java.util.List">
 92         <foreach item="item" index="index" collection="list" open="" close="" separator=";">
 93             update person2 
 94             <set>
 95                 <if test="item.name!=null">
 96                     name=#{item.name},</if>
 97                 <if test="item.sex!=null">
 98                     sex=#{item.sex}
 99                 </if>
100             </set>
101             where id=#{item.id}
102         </foreach>
103     </update>
104 </mapper>
EntityMapper.xml
 1 <?xml version="1.0" encoding="UTF-8"?>
 2 <!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
 3 "http://mybatis.org/dtd/mybatis-3-config.dtd">
 4 <configuration>
 5     <!-- 配置属性 -->
 6     <properties resource="config.properties" />
 7     <!-- 设置实体类别名 _ *** -->
 8     <typeAliases>
 9         <typeAlias alias="Entity" type="mybatis.entity.Entity" />
10     </typeAliases>
11     <!-- 配置数据库连接环境(支持多个数据库连接) -->
12     <environments default="development">
13         <!-- 数据库连接 -->
14         <environment id="development">
15             <!-- 配置事务管理器,JDBC:按照jdbc方式处理事务 -->
16             <transactionManager type="JDBC" />
17             <!-- 配置数据库连接信息,POOLED:表示以数据库连接池的形式连接数据库 -->
18             <dataSource type="POOLED">
19                 <property name="driver" value="${driver}" />
20                 <property name="url" value="jdbc:mysql://localhost:3306/mybatis?serverTimezone=Asia/Shanghai&allowMultiQueries=true" />
21                 <property name="username" value="${username}" />
22                 <property name="password" value="${password}" />
23                 <!-- 在任意时间可以存在的活动(也就是正在使用)连接数量,默认值:10 -->
24                 <property name="poolMaximumActiveConnections" value="300" />
25                 <!-- 任意时间可能存在的空闲连接数 默认是5,最好设置为0,否则可能会崩溃掉 -->
26                 <property name="poolMaximumIdleConnections" value="0" />
27                 <!-- 在被强制返回之前,池中连接被检出(checked out)时间,默认值:20000 毫秒(即 20 秒) -->
28                 <property name="poolMaximumCheckoutTime" value="20000" />
29                 <!-- 这是一个底层设置,如果获取连接花费的相当长的时间,它会给连接池打印状态日志并重新尝试获取一个连接(避免在误配置的情况下一直安静的失败),默认值:20000 
30                     毫秒(即 20 秒)。 -->
31                 <property name="poolTimeToWait" value="20000" />
32                 <!-- 是否启用侦测查询。若开启,也必须使用一个可执行的 SQL 语句设置 poolPingQuery 属性(最好是一个非常快的 SQL),默认值:false。 -->
33                 <property name="poolPingEnabled" value="true" />
34                 <!-- 配置 poolPingQuery 的使用频度。这可以被设置成匹配具体的数据库连接超时时间,来避免不必要的侦测,默认值:0(即所有连接每一时刻都被侦测 
35                     — 当然仅当 poolPingEnabled 为 true 时适用) -->
36                 <property name="poolPingConnectionsNotUsedFor"
37                     value="3600000" />
38                 <!-- 发送到数据库的侦测查询,用来检验连接是否处在正常工作秩序中并准备接受请求。默认是“NO PING QUERY SET”,这会导致多数数据库驱动失败时带有一个恰当的错误消息。 -->
39                 <property name="poolPingQuery" value="select 1" />
40             </dataSource>
41         </environment>
42     </environments>
43     <!-- 加载映射文件 -->
44     <mappers>
45         <mapper resource="mybatis/entity/EntityMapper.xml" />
46     </mappers>
47 </configuration>
mybatisConfig.xml
 1 <project xmlns="http://maven.apache.org/POM/4.0.0"
 2     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
 3     xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
 4     <modelVersion>4.0.0</modelVersion>
 5     <groupId>mybatis</groupId>
 6     <artifactId>MyBatis_3</artifactId>
 7     <version>0.0.1-SNAPSHOT</version>
 8     <dependencies>
 9         <!-- https://mvnrepository.com/artifact/mysql/mysql-connector-java -->
10         <dependency>
11             <groupId>mysql</groupId>
12             <artifactId>mysql-connector-java</artifactId>
13             <version>8.0.11</version>
14         </dependency>
15         <!-- https://mvnrepository.com/artifact/org.mybatis/mybatis -->
16         <dependency>
17             <groupId>org.mybatis</groupId>
18             <artifactId>mybatis</artifactId>
19             <version>3.0.4</version>
20         </dependency>
21         <!-- https://mvnrepository.com/artifact/junit/junit -->
22         <dependency>
23             <groupId>junit</groupId>
24             <artifactId>junit</artifactId>
25             <version>4.12</version>
26             <scope>test</scope>
27         </dependency>
28         <!-- https://mvnrepository.com/artifact/log4j/log4j -->
29         <dependency>
30             <groupId>log4j</groupId>
31             <artifactId>log4j</artifactId>
32             <version>1.2.12</version>
33         </dependency>
34 
35     </dependencies>
36 </project>
pom.xml
1 #key=value
2 driver=com.mysql.cj.jdbc.Driver
3 url=jdbc:mysql://localhost:3306/mybatis?serverTimezone=Asia/Shanghai&allowMultiQueries=true
4 username=root
5 password=123456
config.properties

Maven依赖:log4j。

posted @ 2018-09-17 21:32  21yuer  阅读(134)  评论(0编辑  收藏  举报