Github 地址: https://github.com/Snailclimb/springboot-integration-examples(SpringBoot和其余经常使用技术的整合,多是你遇到的讲解最详细的学习案例,力争新手也能看懂而且可以在看完以后独立实践。基于最新的 SpringBoot2.0+,是你学习SpringBoot 的最佳指南。) ,欢迎各位 Star。
SpringBoot 整合 Mybatis 有两种经常使用的方式,一种就是咱们常见的 xml 的方式 ,还有一种是全注解的方式。我以为这二者没有谁比谁好,在 SQL 语句不太长的状况下,我以为全注解的方式必定是比较清晰简洁的。可是,复杂的 SQL 确实不太适合和代码写在一块儿。java
下面就开始吧!mysql
目录:git
建立一个基本的 SpringBoot 项目,我这里就很少说这方面问题了,具体能够参考下面这篇文章:sql
http://www.javashuo.com/article/p-qmwpdnah-bz.html数据库
咱们的数据库很简单,只有 4 个字段:用户 id、姓名、年龄、余额,以下图所示:springboot
添加了“余额money”字段是为了给你们简单的演示一下事务管理的方式。mybatis
建表语句:
CREATE TABLE `user` ( `id` int(13) NOT NULL AUTO_INCREMENT COMMENT '主键', `name` varchar(33) DEFAULT NULL COMMENT '姓名', `age` int(3) DEFAULT NULL COMMENT '年龄', `money` double DEFAULT NULL COMMENT '帐户余额', PRIMARY KEY (`id`) ) ENGINE=InnoDB AUTO_INCREMENT=5 DEFAULT CHARSET=utf8
因为要整合 springboot 和 mybatis 因此加入了artifactId 为 mybatis-spring-boot-starter 的依赖,因为使用了Mysql 数据库 因此加入了artifactId 为 mysql-connector-java 的依赖。
<dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <dependency> <groupId>org.mybatis.spring.boot</groupId> <artifactId>mybatis-spring-boot-starter</artifactId> <version>1.3.2</version> </dependency> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <scope>runtime</scope> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> <scope>test</scope> </dependency> </dependencies>
因为我使用的是比较新的Mysql链接驱动,因此配置文件可能和以前有一点不一样。
server.port=8333 spring.datasource.url=jdbc:mysql://127.0.0.1:3306/erp?useUnicode=true&characterEncoding=utf8&useSSL=false&serverTimezone=GMT%2B8 spring.datasource.username=root spring.datasource.password=153963 spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
注意:咱们使用的 mysql-connector-java 8+ ,JDBC 链接到mysql-connector-java 6+以上的须要指定时区 serverTimezone=GMT%2B8
。另外咱们以前使用配置 Mysql数据链接是通常是这样指定driver-class-name=com.mysql.jdbc.Driver
,可是如今不能够必须为 不然控制台下面的异常:
Loading class `com.mysql.jdbc.Driver'. This is deprecated. The new driver class is `com.mysql.cj.jdbc.Driver'. The driver is automatically registered via the SPI and manual loading of the driver class is generally unnecessary.
上面异常的意思是:com.mysql.jdbc.Driver
被弃用了。新的驱动类是 com.mysql.cj.jdbc.Driver
。驱动程序经过SPI自动注册,手动加载类一般是没必要要。
若是你非要写把com.mysql.jdbc.Driver
改成com.mysql.cj.jdbc.Driver
便可。
public class User { private int id; private String name; private int age; private double money; ... 此处省略getter、setter以及 toString方法 }
先来看一下 全注解的方式,这种方式和后面提到的 xml 的方式的区别仅仅在于 一个将 sql 语句写在 java 代码中,一个写在 xml 配置文件中。全注方式解转换成 xml 方式仅需作一点点改变便可,我在后面会提到。
项目结构:
UserDao.java
@Mapper public interface UserDao { /** * 经过名字查询用户信息 */ @Select("SELECT * FROM user WHERE name = #{name}") User findUserByName(@Param("name") String name); /** * 查询全部用户信息 */ @Select("SELECT * FROM user") List<User> findAllUser(); /** * 插入用户信息 */ @Insert("INSERT INTO user(name, age,money) VALUES(#{name}, #{age}, #{money})") void insertUser(@Param("name") String name, @Param("age") Integer age, @Param("money") Double money); /** * 根据 id 更新用户信息 */ @Update("UPDATE user SET name = #{name},age = #{age},money= #{money} WHERE id = #{id}") void updateUser(@Param("name") String name, @Param("age") Integer age, @Param("money") Double money, @Param("id") int id); /** * 根据 id 删除用户信息 */ @Delete("DELETE from user WHERE id = #{id}") void deleteUser(@Param("id") int id); }
@Service public class UserService { @Autowired private UserDao userDao; /** * 根据名字查找用户 */ public User selectUserByName(String name) { return userDao.findUserByName(name); } /** * 查找全部用户 */ public List<User> selectAllUser() { return userDao.findAllUser(); } /** * 插入两个用户 */ public void insertService() { userDao.insertUser("SnailClimb", 22, 3000.0); userDao.insertUser("Daisy", 19, 3000.0); } /** * 根据id 删除用户 */ public void deleteService(int id) { userDao.deleteUser(id); } /** * 模拟事务。因为加上了 @Transactional注解,若是转帐中途出了意外 SnailClimb 和 Daisy 的钱都不会改变。 */ @Transactional public void changemoney() { userDao.updateUser("SnailClimb", 22, 2000.0, 3); // 模拟转帐过程当中可能遇到的意外情况 int temp = 1 / 0; userDao.updateUser("Daisy", 19, 4000.0, 4); } }
@RestController @RequestMapping("/user") public class UserController { @Autowired private UserService userService; @RequestMapping("/query") public User testQuery() { return userService.selectUserByName("Daisy"); } @RequestMapping("/insert") public List<User> testInsert() { userService.insertService(); return userService.selectAllUser(); } @RequestMapping("/changemoney") public List<User> testchangemoney() { userService.changemoney(); return userService.selectAllUser(); } @RequestMapping("/delete") public String testDelete() { userService.deleteService(3); return "OK"; } }
//此注解表示SpringBoot启动类 @SpringBootApplication // 此注解表示动态扫描DAO接口所在包,实际上不加下面这条语句也能够找到 @MapperScan("top.snailclimb.dao") public class MainApplication { public static void main(String[] args) { SpringApplication.run(MainApplication.class, args); } }
上述代码通过测试都没问题,这里贴一下根据姓名查询的测试的结果。
项目结构:
相比于注解的方式主要有如下几点改变,很是容易实现。
我这里只演示一个根据姓名找人的方法。
UserDao.java
@Mapper public interface UserDao { /** * 经过名字查询用户信息 */ User findUserByName(String name); }
UserMapper.xml
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd"> <mapper namespace="top.snailclimb.dao.UserDao"> <select id="findUserByName" parameterType="String" resultType="top.snailclimb.bean.User"> SELECT * FROM user WHERE name = #{name} </select> </mapper>
配置文件中加入下面这句话:
mybatis.mapper-locations=classpath:mapper/*.xml
ThoughtWorks准入职Java工程师。专一Java知识分享!开源 Java 学习指南——JavaGuide(12k+ Star)的做者。公众号多篇文章被各大技术社区转载。公众号后台回复关键字“1”能够领取一份我精选的Java资源哦!