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 的方式会自动处理事务,不需要再手动提交了。 

五、其他常用属性

原文地址:https://www.cnblogs.com/niujifei/p/15228007.html