SpringBoot系列:Spring Boot集成MyBatis,基于注解sql方式

it2022-05-05  159

一、关于MyBatis

MyBatis 本是apache的一个开源项目iBatis, 2010年这个项目由apache software foundation 迁移到了google code,并且改名为MyBatis 。

MyBatis 是一款优秀的持久层框架,它支持定制化 SQL、存储过程以及高级映射。MyBatis 避免了几乎所有的 JDBC 代码和手动设置参数以及获取结果集。MyBatis 可以使用简单的 XML 或注解来配置和映射原生信息,将接口和 Java 的 POJOs(Plain Ordinary Java Object,普通的 Java对象)映射成数据库中的记录。

MyBatis的简单和其使用sql灵活性,以及原生sql所带来的高性能,MyBatis备受欢迎,尤其是对效率有着苛刻要求的新型互联网公司。

二、示例演示

在Spring Boot中,MyBatis的使用和别的框架里没有任何变化,Spring Boot仅仅简化了MyBatis的集成。MyBatis开发有两种方式,一种是基于注解sql,一种是基于xml配置文件sql。

这一节主要讲解基于注解sql。

我们先引入pom依赖,即mybatis-spring-boot-starter。

<!--mysql连接--> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <scope>runtime</scope> </dependency> <!--druid连接池--> <dependency> <groupId>com.alibaba</groupId> <artifactId>druid</artifactId> <version>1.0.29</version> </dependency> <!--mybatis依赖--> <dependency> <groupId>org.mybatis.spring.boot</groupId> <artifactId>mybatis-spring-boot-starter</artifactId> <version>1.3.2</version> </dependency>

然后配置文中,主要是设置configuration.log-impl打印sql,mapperLocations表示xml配置文件的位置,如果使用xml形式需要配置该项,如果是注解sql开发,则可以省略。 我们的User实体,就是简单的PO对象,不需要任何额外配置。

@Data public class User { private Integer id; private String username; private String password; }

UserApi类,即controller。

@RestController @RequestMapping("user") public class UserApi { @Autowired private UserService userService; /** * 添加用户 * @param user */ @PostMapping("addUser") public String addUser(User user){ userService.addUser(user); return "添加用户成功"; } /** * 删除用户 * @param id */ @GetMapping("delUser") public String delUser(@RequestParam(value = "id") int id){ userService.delUser(id); return "删除用户成功"; } /** * 修改用户信息 * @param user */ @PostMapping("updateUser") public String updateUser(User user){ userService.updateUser(user); return "修改用户成功"; } /** * 获取用户信息 * @param id * @return */ @GetMapping("getUser") public User getUser(@RequestParam(value = "id") int id){ return userService.getUser(id); } @GetMapping("getUsers") public List<User> getUsers(){ List<User> users = userService.findAll(); return users; } @GetMapping("getUserByUP") public User getUserByUP(@RequestParam(value = "username") String username, @RequestParam(value = "password") String password){ return userService.getUser(username, password); } }

UserService类,由于简单,省略了其接口。

@Service public class UserService { @Autowired private IUserDao userDao; /** * 添加用户 * @param user */ public void addUser(User user){ userDao.add(user); } /** * 删除用户 * @param id */ public void delUser(int id){ userDao.del(id); } /** * 修改用户信息 * @param user */ public void updateUser(User user){ userDao.update(user); } /** * 获取用户信息 * @param id * @return */ public User getUser(int id){ return userDao.find(id); } /** * 获取全部用户信息 * @return */ public List<User> findAll() { return userDao.findAll(); } /** * 获取用户 * @param username * @param password * @return */ public User getUser(String username, String password) { User user = userDao.findByUsernameAndPassword(username, password); return user; } }

再就是今天的主角了,使用@Mapper注解声明为MyBatis的数据访问层对象。而对于每个方法,我们并不需要为其提供实现,不过需要提供其逻辑的对应的sql。

MyBatis为我们提供了sql相关的注解,如@Insert、@Delete、@Update、@Select等,我们使用这些注解配合sql,即可实现我们的数据库操作。

注意不要漏掉@Param来指明sql参数的名称,否则因为在编译后中的class文件并不记录方法参数名,会导致sql中的参数名无法识别的问题。

@Mapper public interface IUserDao { /** * 添加用户 * @param user * @return */ @Insert("insert into user(username, password) values(#{username}, #{password})") int add(User user); /** * 根据id删除用户 * @param id * @return */ @Delete("delete from user where id = #{id}") int del(@Param("id") int id); /** * 更新用户信息 * @param user * @return */ @Update("update user set username = #{username}, password = #{password} where id = #{id}") int update(User user); /** * 根据id查找用户 * @param id * @return */ @Select("select * from user where id = #{id}") User find(@Param("id") int id); /** * 获取全部用户 * @return */ @Select("select * from user") List<User> findAll(); /** * 根据用户名和密码查找用户 * @param username * @param password * @return */ @Select("select * from user where username = #{username} and password = #{password}") User findByUsernameAndPassword(@Param("username") String username, @Param("password") String password); }

使用@Mapper的方式需要我们为每个dao层接口类进行注解,当然如果包区分明显的话,也可以在启动类上使用@MapperScan,指定我们dao文件的位置,这样就不用再为每个类上去单独注解@Mapper了。

@MapperScan("com.yanger.*.dao") @SpringBootApplication public class SpringbootApplication { public static void main(String[] args) { SpringApplication.run(SpringbootApplication.class, args); } }

也有在dao层类上使用@Repository的,但这个注解必须在使用@MapperScan之后才可以使用,否则会注入失败,在@MapperScan使用后,本就不需要再使用任何注解特意声明MyBatis的Mapper文件了,所以再使用这个注解也就显得有些画蛇添足了。

源码地址:https://github.com/imyanger/springboot-project/tree/master/p7-springboot-mybatis


最新回复(0)