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的优缺点
注解开发存在的问题:
- 使用注解没有实现Java代码和SQL语句的解耦
- 无法实现SQL语句的动态拼接
- 进行多表的查询时定制ResultMap比较麻烦
注解开发和xml映射文件对比:
|
XML |
注解 |
|
|
优点 |
1.类和类之间的解耦 2.利于修改。直接修改XML文件,无需到源代码中修改。 3.配置集中在XML中,对象间关系一目了然,利于快速了解项目和维护 4.容易和其他系统进行数据交交换 |
1.简化配置 2.使用起来直观且容易,提升开发效率 3.类型安全,编译器进行校验,不用等到运行期才会发现错误。 4.注解的解析可以不依赖于第三方库,可以直接使用Java自带的反射 |

浙公网安备 33010602011771号