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

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,hiredate
		from 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,hiredate
		from 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,hiredate
		from 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,hiredate
		from 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");// 查询名字包括s
		ec.setJob("clerk");// 查询职位为clerk
		ec.setLosal(1000d);// 查询最低薪水为1000
		ec.setHisal(5000d);// 查询最高薪水为5000
		List<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());
		}
	}
}

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

  • 3
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 在 MyBatis-Plus 中,你可以使用 Lambda 表达式来构建复杂的 SQL 查询条件。如果你想在 SQL 查询条件中加括号,可以使用 Lambda 表达式中的 `and` 和 `or` 方法来实现。 例如,假设你有一个用户表,希望查询年龄大于 18 岁或者名字以 "J" 开头的用户。你可以这样写: ``` List<User> users = userMapper.selectList(new QueryWrapper<User>() .lambda() .and(age -> age.ge(18)) .or(name -> name.likeRight("J%")) ); ``` 这样生成的 SQL 语句就会带上括号,类似这样: ``` SELECT * FROM user WHERE (age >= 18) OR (name LIKE 'J%') ``` 如果你想在条件中嵌套更多的括号,可以使用 Lambda 表达式的 `and` 和 `or` 方法的重载版本,接受一个 `Function<QueryWrapper<T>, QueryWrapper<T>>` 类型的参数,这样就可以在括号内再嵌套一个 Lambda 表达式了。 例如,假设你想查询年龄大于 18 岁并且名字以 "J" 开头或者邮箱以 "example.com" 结尾的用户,你可以这样写: ``` List<User> users = userMapper.selectList(new QueryWrapper<User>() .lambda() .and(age -> age.ge(18)) .and(name -> name.likeRight("J%")) .or(query -> query.lambda() .and(email -> email.like("%example.com")) ) ); ``` 这样生成的 SQL 语句就会带上括号,类似这样: ``` SELECT * FROM user WHERE (age >= 18) AND (name LIKE ' ### 回答2: 使用Mybatis-Plus在SQL查询条件中加括号的方法是使用Wrapper构建查询条件,并使用lambda表达式和括号来组合条件。 首先,创建一个Wrapper对象,可以使用`QueryWrapper`或`LambdaQueryWrapper`来构建。以`LambdaQueryWrapper`为例: ```java LambdaQueryWrapper<User> wrapper = new LambdaQueryWrapper<>(); ``` 然后,在Wrapper对象中使用lambda表达式来定义查询条件,并使用括号来分组条件。例如,查询年龄小于30或者姓名为"张三"的用户: ```java wrapper.and(w -> w.lt(User::getAge, 30).or().eq(User::getName, "张三")); ``` 在这个例子中,括号内的条件`.lt(User::getAge, 30)`表示查询年龄小于30,`.or()`表示或运算,`.eq(User::getName, "张三")`表示查询姓名为"张三"。整个表达式的意思是查询满足括号内条件的用户。 最后,将Wrapper对象作为参数传递给Mybatis-Plus的查询方法,如`selectList()`、`selectOne()`等。 这样就可以在Mybatis-Plus中使用括号来组合查询条件了。 ### 回答3: 在MyBatis-Plus中,在SQL查询条件中加括号可以通过使用实体类的QueryWrapper对象来实现。QueryWrapper是MyBatis-Plus提供的一个查询封装类,可以方便地构建查询条件。 首先,需要创建一个QueryWrapper对象。可以使用QueryWrapper的构造函数创建一个空的QueryWrapper对象,然后使用它的方法来添加查询条件。 然后,可以使用QueryWrapper对象提供的方法来添加查询条件。例如,可以使用eq方法添加等于条件,使用like方法添加模糊查询条件。 如果需要在SQL查询条件中加括号,可以使用and方法或者or方法来将多个条件加括号。例如,可以使用and方法将多个相等条件加括号。 最后,调用MyBatis-Plus提供的mapper的select方法,将QueryWrapper对象作为参数传入,就可以执行查询操作。查询结果将会被封装成一个List集合返回。 综上所述,MyBatis-Plus中在SQL查询条件中加括号可以通过使用QueryWrapper对象来实现。通过构建QueryWrapper对象并使用它的方法来添加查询条件,然后将QueryWrapper对象作为参数传入select方法进行查询操作。这样就可以在SQL查询条件中加括号实现更复杂的查询条件组合。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值