• MyBatis(四)映射文件 之 增删改查


    一、准备工作

      1、创建数据库中对应的 JavaBean 

    public class Employee {
        private Integer id;
        private String lastName;
        private String gender;
        private String email;
    
        public Employee() {
        }
    
        public Employee(Integer id, String lastName, String gender, String email) {
            this.id = id;
            this.lastName = lastName;
            this.gender = gender;
            this.email = email;
        }
    }

      2、创建对应的 mapper 接口

    public interface EmployeeMapper {
    
        public Employee getEmpById(Integer id);
    
        public void addEmp(Employee employee);
    
        public void updateEmp(Employee employee);
    
        public void deleteEmpById(Integer id);
    }

    二、实现CRUD(单表)

      使用 EmployeeMapper.xml 完成对 tbl_employee 表的增删改查

      1、查询select

        <!--
            public Employee getEmpById(Integer id);
        -->
        <select id="getEmpById" resultType="com.njf.mybatis.bean.Employee">
            select id, last_name lastName, email, gender from tbl_employee where id = #{id}
        </select>

      2、插入insert

        <!--
            public void addEmp(Employee employee);
        -->
        <insert id="addEmp" parameterType="com.njf.mybatis.bean.Employee">
            insert into tbl_employee(`last_name`, `email`, `gender`)
            values(#{lastName}, #{email}, #{gender})
        </insert>

      3、更新 update

        <!--
            public void updateEmp(Employee employee);
    
         -->
        <update id="updateEmp">
            update tbl_employee set
                `last_name` = #{lastName},
                `email` = #{email},
                `gender` = #{gender}
                where id = #{id}
        </update>

      4、删除 delete

        <!--
            public void deleteEmpById(Integer id);
         -->
        <delete id="deleteEmpById">
            delete from tbl_employee where id = #{id}
        </delete>

      5、测试

         public SqlSessionFactory getsqlSessionFactory() throws IOException {
            String resource = "mybatis-config.xml";
            InputStream inputStream = Resources.getResourceAsStream(resource);
            SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
            return sqlSessionFactory;
         }
    @Test
    public void testQuery() throws IOException { //1、获取 sqlSessionFactory SqlSessionFactory sqlSessionFactory = getsqlSessionFactory(); //2、获取 sqlSession 实例,能直接执行已经映射的 SQL 语句 SqlSession sqlSession = sqlSessionFactory.openSession(); try { //3、获取接口的实现类对象 /** * 推荐使用 * 会为接口自动的创建一个代理对象,代理对象去执行增删改查方法 */ EmployeeMapper employeeMapper = sqlSession.getMapper(EmployeeMapper.class); Employee emp = employeeMapper.getEmpById(1); System.out.println(emp); } finally { sqlSession.close(); } } @Test public void testAdd() throws IOException { //1、获取 sqlSessionFactory SqlSessionFactory sqlSessionFactory = getsqlSessionFactory(); //2、获取 sqlSession 实例,能直接执行已经映射的 SQL 语句, 此时sqlSession不会自动提交数据 SqlSession sqlSession = sqlSessionFactory.openSession(); try { //3、获取接口的实现类对象 /** * 推荐使用 * 会为接口自动的创建一个代理对象,代理对象去执行增删改查方法 */ EmployeeMapper employeeMapper = sqlSession.getMapper(EmployeeMapper.class); Employee employee = new Employee(2, "John", "1", "john@126.com"); employeeMapper.addEmp(employee); System.out.println("employee = " + employee.getId()); sqlSession.commit(); } finally { sqlSession.close(); } } @Test public void testUpdate() throws IOException { //1、获取 sqlSessionFactory SqlSessionFactory sqlSessionFactory = getsqlSessionFactory(); //2、获取 sqlSession 实例,能直接执行已经映射的 SQL 语句 SqlSession sqlSession = sqlSessionFactory.openSession(); try { //3、获取接口的实现类对象 /** * 推荐使用 * 会为接口自动的创建一个代理对象,代理对象去执行增删改查方法 */ EmployeeMapper employeeMapper = sqlSession.getMapper(EmployeeMapper.class); Employee employee = new Employee(2, "John", "1", "john@163.com"); employeeMapper.updateEmp(employee); sqlSession.commit(); } finally { sqlSession.close(); } } @Test public void testDelete() throws IOException { //1、获取 sqlSessionFactory SqlSessionFactory sqlSessionFactory = getsqlSessionFactory(); //2、获取 sqlSession 实例,能直接执行已经映射的 SQL 语句 SqlSession sqlSession = sqlSessionFactory.openSession(); try { //3、获取接口的实现类对象 /** * 推荐使用 * 会为接口自动的创建一个代理对象,代理对象去执行增删改查方法 */ EmployeeMapper employeeMapper = sqlSession.getMapper(EmployeeMapper.class); employeeMapper.deleteEmpById(2); sqlSession.commit(); } finally { sqlSession.close(); } }

      6、小结

        (1)mapper 标签里面的 namespace 属性是名称空间,指定为接口的全类名;

        (2)每个标签里面的 id 表示唯一表示,用于绑定方法名;

        (3)resultType:返回值类型,mybatis 查询完数据要封装为什么类型;

        (4)#{id}:从传递过来的参数中取出 id值;

    三、CRUD 的返回值问题

      1、原生JDBC返回值

        在使用原生的 JDBC 时,可以使用 executeQuery 执行 SQL 查询语句,返回的是 ResultSet 一个集合;
        使用 executeUpdate() 用于执行增删改语句,返回一个 int 类型的值,表示对数据库影响的行数;
        使用 execute() 执行的 SQL 语句,返回的是一个 boolean 值,如果为 true,表示执行成功,如果为 false,表示执行失败。
     

      2、MyBatis 中的返回值

        Mybatis允许增删改直接定义以下类型返回值:Integer、Long、Boolean、void

        如果在 mapper 接口中方法的返回值不是 void,而是 Integer、Long 或 Boolean ,在使用 Mybatis 执行时,会根据返回值类型自动返回值。

        代码示例:

          Mapper 接口方法(返回值不再为 void,而是 Integer或 boolean)

        //修改员工信息
        public int updateEmp(Employee employee);
        //删除员工信息
        public boolean deleteEmpById(Integer id);
     
          Mapper 映射文件(不需要改动)
        <!--
            public int updateEmp(Employee employee);
    
         -->
        <update id="updateEmp">
            update tbl_employee set
                `last_name` = #{lastName},
                `email` = #{email},
                `gender` = #{gender}
                where id = #{id}
        </update>
    
        <!--
            public boolean deleteEmpById(Integer id);
         -->
        <delete id="deleteEmpById">
            delete from tbl_employee where id = #{id}
        </delete>
        测试:
     //测试:修改员工信息
    int result = empMapper.updateEmp(new  Emp(10,"张11",22,"男"));
    System.out.println("result=" + result);  //result = 1   表示操作成功,影响一行数据
             
    //测试:删除员工信息
    boolean i = empMapper.deleteEmp("11");
    System.out.println("result=" + i);  //result =  true   表示操作成功,返回 true
     

    四、注意

      1、获取 SqlSession

    SqlSession sqlSession =  sqlSessionFactory.openSession();//需要手动处理事务
    

        因为在 mybatis-config.xml 中的事务使用原生的 JDBC,所以当进行增删改操作后,还需要手动进行提交或回滚,sqlSession.commit() 或 sqlSession.rollback()。

    <transactionManager type="JDBC" />
    

      

      2、自动提交的 SqlSession

    SqlSession sqlSession =  sqlSessionFactory.openSession(true);//自动处理事务
    

        这种获取 SqlSession 的方式会自动处理事务,不需要再手动提交了。 

    五、其他常用属性

  • 相关阅读:
    对象状态序列化到字节流中
    操作EXCEL完毕后,关闭EXCEL进程
    ORACLE多表查询优化(引)
    再谈需要分析一
    动态添加table,动态添加控件
    ref传参时出错
    SqlServer2000下实现行列转换
    调用结构属性、方法或公共字段的区别
    拆箱存在的隐患
    鼠标悬停图片,滑动显示文字
  • 原文地址:https://www.cnblogs.com/niujifei/p/15228007.html
Copyright © 2020-2023  润新知