MyBatis注解开发

MyBatis编写SQL除了使用Mapper.xml还可以使用注解完成。当可以使用Auto Mapping时使用注解非常简单,不需要频繁的在接口和mapper.xml两个文件之间进行切换。但是必须配置resultMap时使用注解将会变得很麻烦,这种情况下推荐使用mapper.xml进行配置。

MyBatis支持纯注解方式,支持纯mapper.xml方式,也支持注解和mapper.xml混合形式。当只有接口没有mapper.xml时在mybatis.cfg.xml中可以通过<mapper class=””></mapper>加载接口类。如果是混合使用时,使用<package name=””/>。此方式一直是官方推荐方式。

如果某个功能同时使用两种方式进行配置,XML方式将覆盖注解方式。

一、使用注解完成对Dept的CRUD操作

1.1.创建实体类

创建实体类Dept

package com.augus04.pojo;

import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;

import java.io.Serializable;

@Data
@AllArgsConstructor
@NoArgsConstructor
public class Dept implements Serializable {
    private Integer deptno;
    private String dname;
    private String loc;
}

1.2.接口

在Mapper下创建DeptMapper如下:

package com.augus04.mapper;

import com.augus04.pojo.Dept;
import org.apache.ibatis.annotations.*;

public interface DeptMapper {
    @Select("select * from dept where deptno=#{deptno}")
    Dept findDeptByDeptNo(@Param("deptno") int deptno);

    /**
     * 根据部门编号修改部门名字、位置
     * @param dept 部门对象
     * @return
     */
    @Update("update dept set dname=#{dname},loc=#{loc} where deptno=#{deptno}")
    int updateDeptByDeptNO(Dept dept);

    @Insert("insert into dept values (default,#{dname},#{loc})")
    int addDept(Dept dept);

    @Delete("delete from dept where deptno=#{deptno}")
    int deleteDeptByDeptNo(int deptno);
}

1.3.在配置文件中添加加载接口

内容如下:

 

 

1.4.测试

创建测试文件如下:

public class Test1 {
    private static SqlSession sqlSession;

    @BeforeEach
    public void setUp(){
        //创建一个对象:参照了XML 文档或上面讨论过的更特定的 mybatis-config.xml 文件的 Reader 实例
        SqlSessionFactoryBuilder factoryBuilder = new SqlSessionFactoryBuilder();
        InputStream resourceAsStream;

        try {
            //Resources.getResourceAsStream对于简单的只读二进制或文本数据,加载为 Stream。
            resourceAsStream = Resources.getResourceAsStream("sqlMapConfig.xml");

            /*
            SqlSessionFactory
            SqlSessionFactory 有六个方法创建 SqlSession 实例。通常来说,当你选择这些方法时你需要考虑以下几点:
            事务处理:需要在 session 使用事务或者使用自动提交功能(auto-commit)吗?(通常意味着很多数据库和/或 JDBC 驱动没有事务)
            连接:需要依赖 MyBatis 获得来自数据源的配置吗?还是使用自己提供的配置?
            执行语句:需要 MyBatis 复用预处理语句和/或批量更新语句(包括插入和删除)吗?
             */

            SqlSessionFactory build = factoryBuilder.build(resourceAsStream);

            /*
            默认的 openSession()方法没有参数,它会创建有如下特性的 SqlSession:
            会开启一个事务(也就是不自动提交)。
            将从由当前环境配置的 DataSource 实例中获取 Connection 对象。
            事务隔离级别将会使用驱动或数据源的默认设置。
            预处理语句不会被复用,也不会批量处理更新。
             */
            sqlSession = build.openSession();

        } catch (IOException ioException) {
            ioException.printStackTrace();
        }
    }

    @Test
    public void testDept(){
        DeptMapper mapper = sqlSession.getMapper(DeptMapper.class);

        //根据部门编号查询部门信息
        Dept deptByDeptno = mapper.findDeptByDeptNo(30);
        System.out.println(deptByDeptno);

        //根据部门编号修改部门名字、位置
        Dept dept1 = new Dept(30, "运营部", "上海");
        int i = mapper.updateDeptByDeptNO(dept1);
        //提交事务
        sqlSession.commit();
        System.out.println(i);

        //添加部门信息
        Dept dept2 = new Dept(null, "项目部", "深圳");
        int result = mapper.addDept(dept2);
        //提交事务
        sqlSession.commit();
        System.out.println(result);

        //删除部门信息
        int i1 = mapper.deleteDeptByDeptNo(41);
        sqlSession.commit();
        System.out.println(i1);


    }

    @Test
    public void tearDown(){
        sqlSession.close();
    }
}

二、使用注解开发的问题,注解和XML的优缺点

注解开发存在的问题:

  1. 使用注解没有实现Java代码和SQL语句的解耦
  2. 无法实现SQL语句的动态拼接
  3. 进行多表的查询时定制ResultMap比较麻烦

注解开发和xml映射文件对比:

 

XML

注解

优点

1.类和类之间的解耦

2.利于修改。直接修改XML文件,无需到源代码中修改。

3.配置集中在XML中,对象间关系一目了然,利于快速了解项目和维护

4.容易和其他系统进行数据交交换

1.简化配置

2.使用起来直观且容易,提升开发效率

3.类型安全,编译器进行校验,不用等到运行期才会发现错误。

4.注解的解析可以不依赖于第三方库,可以直接使用Java自带的反射

posted @ 2022-08-09 11:59  酒剑仙*  阅读(77)  评论(0)    收藏  举报