Mybatis 实现不确定修改几个字段的修改方法(动态语句set、if实现),避免修改时其它没被修改的字段变为null

Mybatis 实现不确定修改几个字段的修改方法(动态语句set、if实现),避免修改时其它没被修改的字段变为null


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


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


	
	
		update emp
		
			ename=#{ename},
			job=#{job},	
			mgr=#{mgr},
			hiredate=#{hiredate},
			sal=#{sal},
			comm=#{comm},
			deptno=#{deptno}
		
		where empno=#{empno}
	



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



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

1、IEmpDAO.java为接口提供修改数据方法 

 
/**
	 * 不确定修改几个字段的修改操作
	 * 
	 * @param emp
	 * @return
	 */
	public boolean doUpdate(Emp emp);

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

public boolean doUpdate(Emp emp) {
		SqlSession sqlSession = null;
		try {
			sqlSession = MybatisSqlSessionFactory.getMySqlSession();
			int result = sqlSession.update("cn.sz.hcq.pojo.Emp.updateEmp", emp);
			sqlSession.commit();
			return result > 0 ? true : false;
		} catch (Exception e) {
			e.printStackTrace();
			sqlSession.rollback();
		} finally {
			MybatisSqlSessionFactory.closeSqlSession();
		}
		return false;
	}


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为映射文件


 


	
	
	
		update emp
		
			ename=#{ename},
			job=#{job},	
			mgr=#{mgr},
			hiredate=#{hiredate},
			sal=#{sal},
			comm=#{comm},
			deptno=#{deptno}
		
		where empno=#{empno}
	


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

[html]  view plain  copy
  1. xml version="1.0" encoding="UTF-8"?>  
  2.         "http://mybatis.org/dtd/mybatis-3-config.dtd">  
  3. <configuration>  
  4.       
  5.     <environments default="myconn">  
  6.         <environment id="myconn">  
  7.               
  8.             <transactionManager type="JDBC">transactionManager>  
  9.               
  10.             <dataSource type="POOLED">  
  11.                   
  12.                 <property name="driver" value="org.gjt.mm.mysql.Driver">property>  
  13.                 <property name="url" value="jdbc:mysql://localhost:3306/db">property>  
  14.                 <property name="username" value="root">property>  
  15.                 <property name="password" value="root">property>  
  16.             dataSource>  
  17.         environment>  
  18.     environments>  
  19.   
  20.       
  21.     <mappers>  
  22.         <mapper resource="cn/sz/hcq/pojo/Emp.xml" />  
  23.     mappers>  
  24.       
  25. 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.0modelVersion>  
  4.     <groupId>cn.sz.hcq.progroupId>  
  5.     <artifactId>Mybatis_04artifactId>  
  6.     <version>0.0.1-SNAPSHOTversion>  
  7.     <packaging>warpackaging>  
  8.     <dependencies>  
  9.           
  10.         <dependency>  
  11.             <groupId>org.mybatisgroupId>  
  12.             <artifactId>mybatisartifactId>  
  13.             <version>3.2.3version>  
  14.         dependency>  
  15.           
  16.         <dependency>  
  17.             <groupId>mysqlgroupId>  
  18.             <artifactId>mysql-connector-javaartifactId>  
  19.             <version>5.1.39version>  
  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("----------不确定修改几个字段的修改----------");
		Emp emp = new Emp();
		emp.setEmpno(7788);// 修改的主键
		emp.setEname("测试用户名");
		boolean flag = empDAO.doUpdate(emp);
		System.out.println("修改结果:" + flag);
	}
}

完成代码后,运行测试类就可以完成修改。

你可能感兴趣的:(MyBatis)