您的位置:首页 > 其它

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

2017-11-17 20:21 771 查看
Mybatis 实现不确定修改几个字段的修改方法(动态语句set、if实现),避免修改时其它没被修改的字段变为null

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



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

<!-- 不确定修改几个字段的修改方法 -->
<!-- set标签会自动删除多条件中最后的逗号 -->
<update id="updateEmp" parameterType="cn.sz.hcq.pojo.Emp">
update emp
<set>
<if test="ename!=null">ename=#{ename},</if>
<if test="job!=null">job=#{job},</if>
<if test="mgr!=null">mgr=#{mgr},</if>
<if test="hiredate!=null">hiredate=#{hiredate},</if>
<if test="sal!=null">sal=#{sal},</if>
<if test="comm!=null">comm=#{comm},</if>
<if test="deptno!=null">deptno=#{deptno}</if>
</set>
where empno=#{empno}
</update>

下面是项目的结构(本人使用的是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

package cn.sz.hcq.factory;  

  

import java.io.IOException;  

import java.io.Reader;  

  

import org.apache.ibatis.io.Resources;  

import org.apache.ibatis.session.SqlSession;  

import org.apache.ibatis.session.SqlSessionFactory;  

import org.apache.ibais.session.SqlSessionFactoryBuilder;  

  

public class MybatisSqlSessionFactory {  

    // 配置文件  

    private static final String RESOURCE = "mybatis_cfg.xml";  

    private static Reader reader = null;  

    private static SqlSessionFactoryBuilder builder = null;  

    private static SqlSessionFactory factory = null;  

    // 可以在同一个线程范围内,共享一个对象  

    private static ThreadLocal<SqlSession> threadLocal = new ThreadLocal<SqlSession>();  

  

    // 静态代码块(类加载的时候执行一次)  

    static {  

        try {  

            reader = Resources.getResourceAsReader(RESOURCE);  

            builder = new SqlSessionFactoryBuilder();  

            factory = builder.build(reader);  

        } catch (IOException e) {  

            e.printStackTrace();  

        }  

    }  

  

    public static SqlSession getMySqlSession() {  

        // 从本地线程中获取session连接  

        SqlSession sqlSession = threadLocal.get();  

        // 连接为空则创建连接,并将该连接添加到本地线程中去  

        if (sqlSession == null) {  

            if (factory == null) {  

                rebuildFactory();  

            }  

            sqlSession = factory.openSession();  

        }  

        threadLocal.set(sqlSession);  

        return sqlSession;  

    }  

  

    // 创建工厂  

    public static void rebuildFactory() {  

        try {  

            reader = Resources.getResourceAsReader(RESOURCE);  

            builder = new SqlSessionFactoryBuilder();  

            factory = builder.build(reader);  

        } catch (IOException e) {  

            e.printStackTrace();  

        }  

    }  

  

    // 关闭连接  

    public static void closeSqlSession() {  

        SqlSession sqlSession = threadLocal.get();  

        if (sqlSession != null) {  

            // 关闭session  

            sqlSession.close();  

        }  

        // 同时将本地线程中置为null(防止用户再次调用时出现空的session)  

        threadLocal.set(null);  

    }  

  

}  

4、Emp.java为实体类

[java] view
plain copy

public class Emp implements Serializable {  

    private Integer empno;  

    private String ename;  

    private String job;  

    private Integer mgr;  

    private Date hiredate;  

    private Double sal;  

    private Double comm;  

    private Integer deptno;  

  

    public Integer getEmpno() {  

        return empno;  

    }  

  

    public void setEmpno(Integer empno) {  

        this.empno = empno;  

    }  

  

    public String getEname() {  

        return ename;  

    }  

  

    public void setEname(String ename) {  

        this.ename = ename;  

    }  

  

    public String getJob() {  

        return job;  

    }  

  

    public void setJob(String job) {  

        this.job = job;  

    }  

  

    public Integer getMgr() {  

        return mgr;  

    }  

  

    public void setMgr(Integer mgr) {  

        this.mgr = mgr;  

    }  

  

    public Date getHiredate() {  

        return hiredate;  

    }  

  

    public void setHiredate(Date hiredate) {  

        this.hiredate = hiredate;  

    }  

  

    public Double getSal() {  

        return sal;  

    }  

  

    public void setSal(Double sal) {  

        this.sal = sal;  

    }  

  

    public Double getComm() {  

        return comm;  

    }  

  

    public void setComm(Double comm) {  

        this.comm = comm;  

    }  

  

    public Integer getDeptno() {  

        return deptno;  

    }  

  

    public void setDeptno(Integer deptno) {  

        this.deptno = deptno;  

    }  

  

}  

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">

<!-- 不确定修改几个字段的修改方法 -->
<!-- set标签会自动删除多条件中最后的逗号 -->
<update id="updateEmp" parameterType="cn.sz.hcq.pojo.Emp">
update emp
<set>
<if test="ename!=null">ename=#{ename},</if>
<if test="job!=null">job=#{job},</if>
<if test="mgr!=null">mgr=#{mgr},</if>
<if test="hiredate!=null">hiredate=#{hiredate},</if>
<if test="sal!=null">sal=#{sal},</if>
<if test="comm!=null">comm=#{comm},</if>
<if test="deptno!=null">deptno=#{deptno}</if>
</set>
where empno=#{empno}
</update>
</mapper>

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

[html] view
plain copy

<?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>  

    <!--数据源 -->  

    <environments default="myconn">  

        <environment id="myconn">  

            <!--事务管理方式 -->  

            <transactionManager type="JDBC"></transactionManager>  

            <!--数据库连接参数 -->  

            <dataSource type="POOLED">  

                <!-- type:数据源连接的方式 ,POOLED:连接池方式, UNPOOLED: 非连接池的方式 ,JNDI:java命名与目录接口方式 -->  

                <property name="driver" value="org.gjt.mm.mysql.Driver"></property>  

                <property name="url" value="jdbc:mysql://localhost:3306/db"></property>  

                <property name="username" value="root"></property>  

                <property name="password" value="root"></property>  

            </dataSource>  

        </environment>  

    </environments>  

  

    <!-- 引入实体映射文件 -->  

    <mappers>  

        <mapper resource="cn/sz/hcq/pojo/Emp.xml" />  

    </mappers>  

    <!-- 配置的参数 -->  

</configuration>  

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

[html] view
plain copy

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"  

    xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">  

    <modelVersion>4.0.0</modelVersion>  

    <groupId>cn.sz.hcq.pro</groupId>  

    <artifactId>Mybatis_04</artifactId>  

    <version>0.0.1-SNAPSHOT</version>  

    <packaging>war</packaging>  

    <dependencies>  

        <!-- https://mvnrepository.com/artifact/org.mybatis/mybatis -->  

        <dependency>  

            <groupId>org.mybatis</groupId>  

            <artifactId>mybatis</artifactId>  

            <version>3.2.3</version>  

        </dependency>  

        <!-- https://mvnrepository.com/artifact/mysql/mysql-connector-java -->  

        <dependency>  

            <groupId>mysql</groupId>  

            <artifactId>mysql-connector-java</artifactId>  

            <version>5.1.39</version>  

        </dependency>  

    </dependencies>  

</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);
}
}


完成代码后,运行测试类就可以完成修改。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐