Mybatis 不确定条件查询(动态语句where和if)借助实体类封装参数

来源:互联网 发布:什么是锁sql 编辑:程序博客网 时间:2024/06/05 22:46

Mybatis 不确定条件查询(动态语句where和if)

下面的案例本人将演示如何使用动态语句批量删除数据库数据,本人在数据库建了一张emp员工表(表的数据自己填充),表的结构如下:


核心代码为,在实体映射文件中配置如下的代码:

 

<!-- 多条件查询,条件个数不确定 --><!-- 方式一 --><select id="findEmpByConditionChanged" parameterType="cn.sz.hcq.pojo.EmpCondition"resultType="cn.sz.hcq.pojo.Emp">select empno,ename,job,mgr,sal,comm,hiredatefrom emp where 1=1<if test="kw!=null">and ename like '%${kw}%' </if><if test="job!=null">and job=#{job}</if><if test="losal!=null&&hisal!=null">and sal between #{losal} and #{hisal}</if></select><!--方式二 --><!-- where 标签能够自动把第一个条件的and去掉 (&转义符为&) --><select id="findEmpByConditionChanged" parameterType="cn.sz.hcq.pojo.EmpCondition"resultType="cn.sz.hcq.pojo.Emp">select empno,ename,job,mgr,sal,comm,hiredatefrom emp<where><if test="kw!=null">ename like '%${kw}%' </if><if test="job!=null">and job=#{job}</if><if test="losal!=null&&hisal!=null">and sal between #{losal} and #{hisal}</if></where></select>


下面是项目的结构(本人使用的是maven搭建的web项目):



IEmpDAO.java为接口提供修改数据方法,EmpDAOImpl.java为接口的实现类,MybatisSqlSessionFactory.java为本人创建的获取sqlSession的工具类,EmpCondition.java为多条件查询将查询条件封装成的实体类,Emp.java为实体类,Emp.xml为映射文件,mybatis_cfg.xml为mybatis主配置文件,Test.java为测试类,pom.xml为maven引入依赖的文件。

1、IEmpDAO.java为接口提供查询方法

/** * 多条件查询,但条件个数是不确定的情况 *  * @param ec 封装的添加实体类为参数 * @return */public List<Emp> findEmpByConditionChanged(EmpCondition ec);


2、EmpDAOImpl.java为接口的实现类

public List<Emp> findEmpByConditionChanged(EmpCondition ec) {SqlSession sqlSession = null;try {sqlSession = MybatisSqlSessionFactory.getMySqlSession();return sqlSession.selectList("cn.sz.hcq.pojo.Emp.findEmpByConditionChanged", ec);} catch (Exception e) {e.printStackTrace();} finally {MybatisSqlSessionFactory.closeSqlSession();}return null;}


3、MybatisSqlSessionFactory.java为本人创建的获取sqlSession的工具类

[html] view plain copy
  1. package cn.sz.hcq.factory;  
  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.SqlSession;  
  8. import org.apache.ibatis.session.SqlSessionFactory;  
  9. import org.apache.ibais.session.SqlSessionFactoryBuilder;  
  10.   
  11. public class MybatisSqlSessionFactory {  
  12.     // 配置文件  
  13.     private static final String RESOURCE = "mybatis_cfg.xml";  
  14.     private static Reader reader = null;  
  15.     private static SqlSessionFactoryBuilder builder = null;  
  16.     private static SqlSessionFactory factory = null;  
  17.     // 可以在同一个线程范围内,共享一个对象  
  18.     private static ThreadLocal<SqlSession> threadLocal = new ThreadLocal<SqlSession>();  
  19.   
  20.     // 静态代码块(类加载的时候执行一次)  
  21.     static {  
  22.         try {  
  23.             reader = Resources.getResourceAsReader(RESOURCE);  
  24.             builder = new SqlSessionFactoryBuilder();  
  25.             factory = builder.build(reader);  
  26.         } catch (IOException e) {  
  27.             e.printStackTrace();  
  28.         }  
  29.     }  
  30.   
  31.     public static SqlSession getMySqlSession() {  
  32.         // 从本地线程中获取session连接  
  33.         SqlSession sqlSession = threadLocal.get();  
  34.         // 连接为空则创建连接,并将该连接添加到本地线程中去  
  35.         if (sqlSession == null) {  
  36.             if (factory == null) {  
  37.                 rebuildFactory();  
  38.             }  
  39.             sqlSession = factory.openSession();  
  40.         }  
  41.         threadLocal.set(sqlSession);  
  42.         return sqlSession;  
  43.     }  
  44.   
  45.     // 创建工厂  
  46.     public static void rebuildFactory() {  
  47.         try {  
  48.             reader = Resources.getResourceAsReader(RESOURCE);  
  49.             builder = new SqlSessionFactoryBuilder();  
  50.             factory = builder.build(reader);  
  51.         } catch (IOException e) {  
  52.             e.printStackTrace();  
  53.         }  
  54.     }  
  55.   
  56.     // 关闭连接  
  57.     public static void closeSqlSession() {  
  58.         SqlSession sqlSession = threadLocal.get();  
  59.         if (sqlSession != null) {  
  60.             // 关闭session  
  61.             sqlSession.close();  
  62.         }  
  63.         // 同时将本地线程中置为null(防止用户再次调用时出现空的session)  
  64.         threadLocal.set(null);  
  65.     }  
  66.   
  67. }  

4、Emp.java为实体类

[java] view plain copy
  1. public class Emp implements Serializable {  
  2.     private Integer empno;  
  3.     private String ename;  
  4.     private String job;  
  5.     private Integer mgr;  
  6.     private Date hiredate;  
  7.     private Double sal;  
  8.     private Double comm;  
  9.     private Integer deptno;  
  10.   
  11.     public Integer getEmpno() {  
  12.         return empno;  
  13.     }  
  14.   
  15.     public void setEmpno(Integer empno) {  
  16.         this.empno = empno;  
  17.     }  
  18.   
  19.     public String getEname() {  
  20.         return ename;  
  21.     }  
  22.   
  23.     public void setEname(String ename) {  
  24.         this.ename = ename;  
  25.     }  
  26.   
  27.     public String getJob() {  
  28.         return job;  
  29.     }  
  30.   
  31.     public void setJob(String job) {  
  32.         this.job = job;  
  33.     }  
  34.   
  35.     public Integer getMgr() {  
  36.         return mgr;  
  37.     }  
  38.   
  39.     public void setMgr(Integer mgr) {  
  40.         this.mgr = mgr;  
  41.     }  
  42.   
  43.     public Date getHiredate() {  
  44.         return hiredate;  
  45.     }  
  46.   
  47.     public void setHiredate(Date hiredate) {  
  48.         this.hiredate = hiredate;  
  49.     }  
  50.   
  51.     public Double getSal() {  
  52.         return sal;  
  53.     }  
  54.   
  55.     public void setSal(Double sal) {  
  56.         this.sal = sal;  
  57.     }  
  58.   
  59.     public Double getComm() {  
  60.         return comm;  
  61.     }  
  62.   
  63.     public void setComm(Double comm) {  
  64.         this.comm = comm;  
  65.     }  
  66.   
  67.     public Integer getDeptno() {  
  68.         return deptno;  
  69.     }  
  70.   
  71.     public void setDeptno(Integer deptno) {  
  72.         this.deptno = deptno;  
  73.     }  
  74.   
  75. }  


5、Emp.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="cn.sz.hcq.pojo.Emp"><!-- 多条件查询(将条件封装为一个实体类) --><!-- 多条件查询,条件个数不确定 --><!-- 方式一 --><!--<select id="findEmpByConditionChanged" parameterType="cn.sz.hcq.pojo.EmpCondition"resultType="cn.sz.hcq.pojo.Emp">select empno,ename,job,mgr,sal,comm,hiredatefrom emp where 1=1<if test="kw!=null">and ename like '%${kw}%' </if><if test="job!=null">and job=#{job}</if><if test="losal!=null&&hisal!=null">and sal between #{losal} and #{hisal}</if></select>--><!--方式二 --><!-- where 标签能够自动把第一个条件的and去掉 (&转义符为&) --><select id="findEmpByConditionChanged" parameterType="cn.sz.hcq.pojo.EmpCondition"resultType="cn.sz.hcq.pojo.Emp">select empno,ename,job,mgr,sal,comm,hiredatefrom emp<where><if test="kw!=null">ename like '%${kw}%' </if><if test="job!=null">and job=#{job}</if><if test="losal!=null&&hisal!=null">and sal between #{losal} and #{hisal}</if></where></select></mapper>

6、mybatis_cfg.xml为mybatis主配置文件

[html] view plain copy
  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.     <environments default="myconn">  
  7.         <environment id="myconn">  
  8.             <!--事务管理方式 -->  
  9.             <transactionManager type="JDBC"></transactionManager>  
  10.             <!--数据库连接参数 -->  
  11.             <dataSource type="POOLED">  
  12.                 <!-- type:数据源连接的方式 ,POOLED:连接池方式, UNPOOLED: 非连接池的方式 ,JNDI:java命名与目录接口方式 -->  
  13.                 <property name="driver" value="org.gjt.mm.mysql.Driver"></property>  
  14.                 <property name="url" value="jdbc:mysql://localhost:3306/db"></property>  
  15.                 <property name="username" value="root"></property>  
  16.                 <property name="password" value="root"></property>  
  17.             </dataSource>  
  18.         </environment>  
  19.     </environments>  
  20.   
  21.     <!-- 引入实体映射文件 -->  
  22.     <mappers>  
  23.         <mapper resource="cn/sz/hcq/pojo/Emp.xml" />  
  24.     </mappers>  
  25.     <!-- 配置的参数 -->  
  26. </configuration>  

7、pom.xml为maven引入依赖的文件

[html] view plain copy
  1. <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"  
  2.     xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">  
  3.     <modelVersion>4.0.0</modelVersion>  
  4.     <groupId>cn.sz.hcq.pro</groupId>  
  5.     <artifactId>Mybatis_04</artifactId>  
  6.     <version>0.0.1-SNAPSHOT</version>  
  7.     <packaging>war</packaging>  
  8.     <dependencies>  
  9.         <!-- https://mvnrepository.com/artifact/org.mybatis/mybatis -->  
  10.         <dependency>  
  11.             <groupId>org.mybatis</groupId>  
  12.             <artifactId>mybatis</artifactId>  
  13.             <version>3.2.3</version>  
  14.         </dependency>  
  15.         <!-- https://mvnrepository.com/artifact/mysql/mysql-connector-java -->  
  16.         <dependency>  
  17.             <groupId>mysql</groupId>  
  18.             <artifactId>mysql-connector-java</artifactId>  
  19.             <version>5.1.39</version>  
  20.         </dependency>  
  21.     </dependencies>  
  22. </project>  


8、Test.java为测试类

public class Test {public static void main(String[] args) {// 多条件查询(将条件封装为一个实体类)IEmpDAO empDAO = new EmpDAOImpl();// 多条件查询,但条件个数是不确定的情况System.out.println("*************多条件查询,但条件个数是不确定的情况****************");// 将查询的条件信息封装为一个实体类EmpCondition ec = new EmpCondition();// 可以设置不确定的条件进行查询ec.setKw("s");// 查询名字包括sec.setJob("clerk");// 查询职位为clerkec.setLosal(1000d);// 查询最低薪水为1000ec.setHisal(5000d);// 查询最高薪水为5000List<Emp> empList = empDAO.findEmpByConditionChanged(ec);for (int i = 0; i < empList.size(); i++) {Emp emp = empList.get(i);System.out.println(emp.getEname() + "," + emp.getJob() + ","+ emp.getSal());}}}

完成代码后,运行测试类就可以完成不确定条件的查询。

阅读全文
0 0
原创粉丝点击