赵走x博客
网站访问量:151524
首页
书籍
软件
工具
古诗词
搜索
登录
32、使用MyBatis注解实现数据库操作
31、MyBaties使用XML配置文件实现数据库操作
30、Spring Boot构建MyBatis应用程序
29、MyBatis简介
28、实战:实现JdbcTemplate多数据源
27、使用JdbcTemplate操作数据库
26、JdbcTemplate入门
25、实战:实现Web API版本控制
24、使用Swagger生成Web API文档
23、Thymeleaf页面布局
22、Thymeleaf内置对象、内嵌变量
21、Thymeleaf内联
20、Thymeleaf语法
19、Thymeleaf表达式
18、Thymeleaf入门
17、全局异常处理
16、实战:实现优雅的数据返回
15、跳转指定页面
14、Spring Boot静态资源
13、Spring Boot数据转换配置
12、跨域访问
11、Web配置
10、过滤器
9、拦截器
8、数据验证
7、参数传递
6、URL映射
5、@ResponseBody
4、@RequestMapping
3、@Controller和@RestController
2、Web项目结构
1、spring-boot-starter-web介绍
32、使用MyBatis注解实现数据库操作
资源编号:552026
热度:107
32、使用MyBatis注解实现数据库操作
上一节我们在Spring Boot项目中集成了MyBatis,使用XML配置文件实现了数据的增、删、改、查操作以及自动生成插件的使用。 MyBatis还提供了注解的方式,相比XML的方式,注解的方式更加简单方便,无须创建XML配置文件。接下来好好研究注解的使用方式。 # 一、XML和注解的异同 自Java 1.5引入注解开始,注解就被广泛地应用在各种开源软件中,使用注解大大地降低了系统中的配置项,让代码变得更加简洁、优雅。 MyBatis也顺应潮流,推出了基于注解的数据库操作方式,避免开发过程中频繁切换到XML或者Java代码中,从而让开发者使用MyBatis有统一的开发体验。 MyBatis在最初设计时是一个XML驱动的框架,配置信息和映射文件都是基于XML的,而到了MyBatis 3,就有了新的选择。 注解模式为使用MyBatis提供了一种更加简单的SQL语句映射,而不会造成大量的开销。两种模式的区别如下: - 1)注解模式使用简单,开发效率高,但是维护麻烦,修改SQL需要重新编译打包。 - 2)XML模式便于维护,SQL和代码分开,代码清晰易懂,而使用注解模式需要在方法前加各种注解和SQL语句,使得代码的可读性不强。 - 3)XML模式虽然提供了完善的标签来实现复杂的SQL语句,但是没有在Java代码中直接判断拼接那样简单方便。 - 4)XML模式因为SQL是配置在XML文件中的,某些特殊字符需要转义,所以使用起来比较麻烦,容易出错。 两种模式各有特点,注解模式适合简单快速的模式,在微服务架构中,一般微服务都有自己对应的数据库,多表连接查询的需求会大大降低,非常适合注解模式。 而XML模式比较适合大型项目,可以灵活地动态生成SQL,方便调整SQL。在具体开发过程中,可以根据公司业务和团队技术基础进行选择。 # 二、使用MyBatis注解实现数据查询 MyBatis注解模式的最大特点是取消了Mapper的XML配置,通过@Insert、、@Update、@Select、@Delete等注解将SQL语句定义在Mapper接口方法中或SQLProvider的方法中,从而省去了XML配置文件。 这些注解和参数的使用与mapper.xml配置文件基本一致。 下面就来演示使用MyBatis注解实现数据查询。 ### 1. 修改配置文件 首先创建Spring Boot项目,集成MyBatis的过程与XML配置方式一样。 使用注解方式只需要在application.properties中指明实体类的包路径,其他保持不变,配置示例如下: ``` # mapper.xml mapper接口的包路径 MyBatis.type-aliases-package=com.weiz.example01 # 数据库连接 spring.datasource.url=jdbc:mysql://localhost:3306/MyBatis_test?serverTimezone=UTC&useUnicode=true&characterEncoding=utf-8&useSSL=true spring.datasource.username=root spring.datasource.password=root spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver ``` 在上面的示例中,配置了mapper接口的包路径和数据源,无须配置mapper.xml文件的路径。 ### 2. 添加mapper接口 使用MyBatis提供的SQL语句注解无须再创建mapper.xml映射文件,创建mapper接口类,然后添加相关的方法即可: ``` public interface StudentMapper { @Select("select * from student") List
selectAll(); } ``` 在上面的示例中,使用@Select注解定义SQL查询语句即可实现查询所有学生列表的功能,无须再定义mapper.xml映射文件。是不是更加简单? ### 3. 验证测试 增加单元测试方法,验证是否生效。示例代码如下: ``` @Test public void testSelectAll() { //查询 List
students = studentMapper.selectAll(); for (Student stu : students){ System.out.println("name:"+stu.getName()+",age:"+stu.getAge()); } } ``` 单击Run Test或在方法上右击,选择Run 'testSelectAll',查看单元测试结果,运行结果如图8-9所示。  结果表明单元测试方法testSelectAll运行成功,并输出了相应的查询结果。这说明使用注解成功实现了查询全部学生信息的功能。 # 三、参数传递 相信很多人会有疑问:MyBatis是如何将参数传递到SQL中的,有哪几种传参方式? 下面就来一一介绍MyBatis注解的传参方式。 ### 1. 直接传参 对于简单的参数,可以直接使用#{id}的方式接收同名的变量参数。示例代码如下: ``` @Select("select * from student where id=#{id,jdbcType=VARCHAR}") Student selectOne(Long id); ``` 在上面的示例中,使用#{id}传入变量参数,支持传入多个参数。只是需要注意,使用#{}方式定义的参数名必须和方法中的参数名保持一致。 ### 2. 使用@Param注解 @Param注解的作用是给参数命名,参数命名后就能根据名字匹配到参数值,正确地将参数传入SQL语句中。比如,注解是@Param("person"),那么参数就会被命名为#{person}。示例代码如下: ``` @Select("select * from student where name=#{name} and sex=#{sex}") Student selectByNameAndSex(@Param("name") String name,@Param("sex")Integer sex); ``` 如果方法有多个参数,也可以不自定义param,MyBatis在方法的参数上就能为它们取自定义的名字,参数先以"param"作为前缀,再加上它们的参数位置作为参数别名,比如#{param1}、#{param2}。 ``` // 默认使用param +参数序号或者0、1,值就是参数的值 @Select("SELECT * FROM student WHERE name = #{param1} and sex = #{param2}") Student selectByNameAndSex(String name, Integer sex); ``` 如果不想给每个参数命名,可以使用param参数,默认格式为param+参数序号或者0、1,值就是参数的值。 ### 3. 映射传值 需要传送多个参数时,也可以考虑使用映射(Map)的形式。 ``` @Select("SELECT * FROM student WHERE name = #{name} and sex = #{sex}") Student selectByNameAndSex(Map
map); ``` 在上面的示例中,将SQL语句需要的参数通过map类型传入,key为参数名,value为参数值。MyBatis会自动匹配对应的映射中的参数值。调用时将参数依次加入映射中即可: ``` @Map param= new HashMap(); param.put("name","weiz"); param.put("sex",1); Student student = studentMapper.selectByNameAndSex(param); ``` 对于参数较多的方法,使用映射还是比较方便的。 ### 4. 使用pojo对象 使用pojo对象传参是比较常用的传参方式,像前面介绍的insert、update等方法,都是直接传入user对象。 ``` @Update({ "update student", "set name = #{name,jdbcType=VARCHAR},", "age = #{age,jdbcType=INTEGER},", "sex = #{sex,jdbcType=INTEGER}", "where id = #{id,jdbcType=VARCHAR}" }) void update(Student record); ``` 对于insert、update等参数较多的方法,可以使用pojo对象传参。需要注意的是,参数的名字和类型必须和pojo对象的属性保持一致。 上面讲述了MyBatis传参的4种方式,使用时根据方法的参数来选择合适的传值方式即可。 # 四、结果映射 MyBatis会自动将查询结果集转换为需要返回的数据类型,但是有些特殊的场景需要处理,比如查询的返回结果与期望的数据格式不一致时,应该怎么处理呢? 这就需要使用@Results和@Result注解。这两个注解可以将数据库中查询到的数值转化为具体的属性或类型,修饰返回的结果集,比如查询的对象返回值属性名和字段名不一致,或者对象的属性中使用了枚举等。 ``` @@Select({ "select", "id, name as student_name,age, sex as student_sex", "from student", "where id = #{id,jdbcType=VARCHAR}" }) @Results({ @Result(column="id", property="id", jdbcType= JdbcType.VARCHAR, id=true), @Result(column="student_name", property="name", jdbcType=JdbcType.VARCHAR), @Result(column="student_sex", property="sex", jdbcType=JdbcType.TIMESTAMP) }) Student selectById(Long id); ``` 在上面的例子中,查询结果集的student_name字段和实体类Student定义的name属性的名称不一致,所以需要Result进行转换;而age名称是一致的,所以不需要Result进行转换。 # 五、实战:使用注解方式实现学生信息管理 前面使用注解方式实现了查询全部学生信息的功能,接下来通过实现完整的学生信息管理模块演示MyBatis注解方式的使用。 ### 1. 查询 查询注解@Select,定义查询数据的SQL语句时使用,一般简单的查询可以使用这个注解。示例代码如下: ``` @Select("select * from student where id=#{id,jdbcType=VARCHAR}") Student selectOne(Long id); ``` 在上面的示例中,使用@Select注解查询学生信息,传入参数id。如果是多个参数,需要将#后面的参数和方法传入的变量名保持一致。 ### 2. 新增 新增注解@Insert,定义插入数据的SQL语句时使用,直接传入数据实体类,MyBatis会自动将实体类属性解析到对应的参数,所以需要将#后面的参数和实体类属性保持一致。示例代码如下: ``` @Insert({ "insert into student (", "name, ", "age, ", "sex)", "values (", "#{name,jdbcType=VARCHAR},", "#{age,jdbcType=INTEGER},", "#{sex,jdbcType=INTEGER})" }) int insert(Student record); ``` 在上面的示例中,使用@Insert注解定义插入SQL,传入完整的学生信息实体数据。 ### 3. 修改 修改注解@Update,定义修改数据的SQL语句时使用。示例代码如下: ``` @Update({ "update student", "set name = #{name,jdbcType=VARCHAR},", "age = #{age,jdbcType=INTEGER},", "sex = #{sex,jdbcType=INTEGER}", "where id = #{id,jdbcType=VARCHAR}" }) void update(Student record); ``` ### 4. 删除 删除注解@Delete,定义删除数据的SQL语句时使用。示例代码如下: ``` @Select("delete from student where id=#{id,jdbcType=VARCHAR}") void delete(Long id); ``` 以上就是项目中常用的增、删、改、查操作,其实不需要手动编写这些基本的方法,使用前面讲过的MyBatis generator自动生成即可。 MyBatis的@Select、@Update、@Insert、@Delete注解与XML配置方式的select等标签一一对应,实现的功能是一样的。