这和整合 Spring 一样的,namespace 中指定的是对应的 Mapper, <resultMap> 中指定对应的实体类,即 User 。然后在内部指定表的字段和实体的属性相对应即可 。这里我们写一个根据用户名查询用户的 sql 。
实体类中有 id,username 和 password,我不在这贴代码,大家可以下载源码查看 。UserMapper.java 文件中写一个接口即可:
User getUserByName(String username);
中间省略 service 的代码,我们写一个 Controller 来测试一下:
@RestControllerpublic class TestController { @Resource private UserService userService; @RequestMapping("/getUserByName/{name}") public User getUserByName(@PathVariable String name) { return userService.getUserByName(name); }}
启动项目,在浏览器中输入:http://localhost:8080/getUserByName/CSDN 即可查询到数据库表中用户名为 CSDN 的用户信息(事先搞两个数据进去即可):
{"id":2,"username":"CSDN","password":"123456"}
这里需要注意一下:Spring Boot 如何知道这个 Mapper 呢?一种方法是在上面的 mapper 层对应的类上面添加 @Mapper 注解即可,但是这种方法有个弊端,当我们有很多个 mapper 时,那么每一个类上面都得添加 @Mapper 注解 。另一种比较简便的方法是在 Spring Boot 启动类上添加@MaperScan 注解,来扫描一个包下的所有 mapper 。如下:
@SpringBootApplication@MapperScan("com.itcodai.course10.dao")public class Course10Application { public static void main(String[] args) { SpringApplication.run(Course10Application.class, args); }}
这样的话,com.itcodai.course10.dao 包下的所有 mapper 都会被扫描到了 。
4. 基于注解的整合基于注解的整合就不需要 xml 配置文件了,MyBatis 主要提供了 @Select, @Insert, @Update, Delete 四个注解 。这四个注解是用的非常多的,也很简单,注解后面跟上对应的 sql 语句即可,我们举个例子:
@Select("select * from user where id = #{id}")User getUser(Long id);
这跟 xml 文件中写 sql 语句是一样的,这样就不需要 xml 文件了,但是有个问题,有人可能会问,如果是两个参数呢?如果是两个参数,我们需要使用 @Param 注解来指定每一个参数的对应关系,如下:
@Select("select * from user where id = #{id} and user_name=#{name}")User getUserByIdAndName(@Param("id") Long id, @Param("name") String username);
可以看出,@Param 指定的参数应该要和 sql 中 #{} 取的参数名相同,不同则取不到 。可以在 controller 中自行测试一下,接口都在源码中,文章中我就不贴测试代码和结果了 。
有个问题需要注意一下,一般我们在设计表字段后,都会根据自动生成工具生成实体类,这样的话,基本上实体类是能和表字段对应上的,最起码也是驼峰对应的,由于在上面配置文件中开启了驼峰的配置,所以字段都是能对的上的 。但是,万一有对不上的呢?我们也有解决办法,使用 @Results 注解来解决 。
@Select("select * from user where id = #{id}")@Results({ @Result(property = "username", column = "user_name"), @Result(property = "password", column = "password")})User getUser(Long id);
@Results 中的 @Result 注解是用来指定每一个属性和字段的对应关系,这样的话就可以解决上面说的这个问题了 。
当然了,我们也可以 xml 和注解相结合使用,目前我们实际的项目中也是采用混用的方式,因为有时候 xml 方便,有时候注解方便,比如就上面这个问题来说,如果我们定义了上面的这个 UserMapper.xml,那么我们完全可以使用 @ResultMap 注解来替代 @Results 注解,如下:
@Select("select * from user where id = #{id}")@ResultMap("BaseResultMap")User getUser(Long id);
@ResultMap 注解中的值从哪来呢?对应的是 UserMapper.xml 文件中定义的 <resultMap> 时对应的 id 值:
推荐阅读
- Springboot集成阿里云对象存储OSS
- Springboot集成阿里云视频点播
- SpringBoot整合定时器:定时任务不再硬编码,动态定时刷起来
- SpringBoot的可视化接口开发工具
- 15000 字详解 Spring Boot 注解
- Spring IOC容器对Bean实例化的过程详解源码分析
- Jenkins结合SpringCloud+K8S,打通微服一条龙技术讲解
- 框架的本质分析——Spring框架
- Spring MVC 框架搭建配置方法及详解
- SpringBoot:拒绝大文件,夏天到了,来给jar包瘦个身