网络最火游戏排行榜,百度免费优化,长沙小学网站建设,互联网产品做网站好还是小程序之前我们已经介绍了两种在Spring Boot中访问关系型数据库的方式#xff1a;
使用spring-boot-starter-jdbc使用spring-boot-starter-data-jpa
虽然Spring Data JPA在国外广泛流行#xff0c;但是在国内还是MyBatis的天下。所以#xff0c;今天这篇我们将具体说说如何在Spri…之前我们已经介绍了两种在Spring Boot中访问关系型数据库的方式
使用spring-boot-starter-jdbc使用spring-boot-starter-data-jpa
虽然Spring Data JPA在国外广泛流行但是在国内还是MyBatis的天下。所以今天这篇我们将具体说说如何在Spring Boot中整合MyBatis完成关系型数据库的增删改查操作。
整合MyBatis
第一步新建Spring Boot项目在pom.xml中引入MyBatis的Starter以及MySQL Connector依赖具体如下
dependency groupIdorg.mybatis.spring.boot/groupId artifactIdmybatis-spring-boot-starter/artifactId version2.1.1/version/dependencydependency groupIdmysql/groupId artifactIdmysql-connector-java/artifactId/dependency关于mybatis-spring-boot-starter的版本需要注意
2.1.x版本适用于MyBatis 3.5、Java 8、Spring Boot 2.12.0.x版本适用于MyBatis 3.5、Java 8、Spring Boot 2.0/2.11.3.x版本适用于MyBatis 3.4、Java 6、Spring Boot 1.5
其中目前还在维护的是2.1.x版本和1.3.x版本。
第二步同之前介绍的使用jdbc模块和jpa模块连接数据库一样在application.properties中配置mysql的连接配置
spring.datasource.urljdbc:mysql://localhost:3306/testspring.datasource.usernamerootspring.datasource.passwordspring.datasource.driver-class-namecom.mysql.cj.jdbc.Driver当然也可以不用默认数据源如果要使用Druid作为数据库连接池的话可以参见《Spring Boot 2.x使用国产数据库连接池Druid》一文。
第三步Mysql中创建一张用来测试的表比如User表其中包含id(BIGINT)、age(INT)、name(VARCHAR)字段。
具体创建命令如下
CREATE TABLE User ( id bigint NOT NULL AUTO_INCREMENT, name varchar(100) COLLATE utf8mb4_general_ci DEFAULT NULL, age int DEFAULT NULL, PRIMARY KEY (id)) ENGINEInnoDB DEFAULT CHARSETutf8mb4 COLLATEutf8mb4_general_ci第四步创建User表的映射对象User
DataNoArgsConstructorpublic class User { private Long id; private String name; private Integer age; public User(String name, Integer age) { this.name name; this.age age; }}第五步创建User表的操作接口UserMapper。在接口中定义两个数据操作一个插入一个查询用于后续单元测试验证。
Mapperpublic interface UserMapper { Select(SELECT * FROM USER WHERE NAME #{name}) User findByName(Param(name) String name); Insert(INSERT INTO USER(NAME, AGE) VALUES(#{name}, #{age})) int insert(Param(name) String name, Param(age) Integer age);}第六步创建Spring Boot主类
SpringBootApplicationpublic class Chapter35Application { public static void main(String[] args) { SpringApplication.run(Chapter35Application.class, args); }}第七步创建单元测试。具体测试逻辑如下
插入一条nameAAAage20的记录然后根据nameAAA查询并判断age是否为20测试结束回滚数据保证测试单元每次运行的数据环境独立
Slf4jRunWith(SpringRunner.class)SpringBootTestpublic class Chapter35ApplicationTests { Autowired private UserMapper userMapper; Test Rollback public void test() throws Exception { userMapper.insert(AAA, 20); User u userMapper.findByName(AAA); Assert.assertEquals(20, u.getAge().intValue()); }}注解配置说明
下面通过几种不同传参方式来实现前文中实现的插入操作来学习一下MyBatis中常用的一些注解。
使用Param
在之前的整合示例中我们已经使用了这种最简单的传参方式如下
Insert(INSERT INTO USER(NAME, AGE) VALUES(#{name}, #{age}))int insert(Param(name) String name, Param(age) Integer age);这种方式很好理解Param中定义的name对应了SQL中的#{name}age对应了SQL中的#{age}。
使用Map
如下代码通过MapString, Object对象来作为传递参数的容器
Insert(INSERT INTO USER(NAME, AGE) VALUES(#{name,jdbcTypeVARCHAR}, #{age,jdbcTypeINTEGER}))int insertByMap(MapString, Object map);对于Insert语句中需要的参数我们只需要在map中填入同名的内容即可具体如下面代码所示
MapString, Object map new HashMap();map.put(name, CCC);map.put(age, 40);userMapper.insertByMap(map);使用对象
除了Map对象我们也可直接使用普通的Java对象来作为查询条件的传参比如我们可以直接使用User对象:
Insert(INSERT INTO USER(NAME, AGE) VALUES(#{name}, #{age}))int insertByUser(User user);这样语句中的#{name}、#{age}就分别对应了User对象中的name和age属性。
增删改查
MyBatis针对不同的数据库操作分别提供了不同的注解来进行配置在之前的示例中演示了Insert下面针对User表做一组最基本的增删改查作为示例
public interface UserMapper { Select(SELECT * FROM user WHERE name #{name}) User findByName(Param(name) String name); Insert(INSERT INTO user(name, age) VALUES(#{name}, #{age})) int insert(Param(name) String name, Param(age) Integer age); Update(UPDATE user SET age#{age} WHERE name#{name}) void update(User user); Delete(DELETE FROM user WHERE id #{id}) void delete(Long id);}在完成了一套增删改查后不妨我们试试下面的单元测试来验证上面操作的正确性
TransactionalRunWith(SpringRunner.class)SpringBootTestpublic class ApplicationTests { Autowired private UserMapper userMapper; Test Rollback public void testUserMapper() throws Exception { // insert一条数据并select出来验证 userMapper.insert(AAA, 20); User u userMapper.findByName(AAA); Assert.assertEquals(20, u.getAge().intValue()); // update一条数据并select出来验证 u.setAge(30); userMapper.update(u); u userMapper.findByName(AAA); Assert.assertEquals(30, u.getAge().intValue()); // 删除这条数据并select验证 userMapper.delete(u.getId()); u userMapper.findByName(AAA); Assert.assertEquals(null, u); }}返回结果绑定
对于增、删、改操作相对变化较小。而对于“查”操作我们往往需要进行多表关联汇总计算等操作那么对于查询的结果往往就不再是简单的实体对象了往往需要返回一个与数据库实体不同的包装类那么对于这类情况就可以通过Results和Result注解来进行绑定具体如下
Results({ Result(property name, column name), Result(property age, column age)})Select(SELECT name, age FROM user)ListUser findAll();在上面代码中Result中的property属性对应User对象中的成员名column对应SELECT出的字段名。在该配置中故意没有查出id属性只对User对应中的name和age对象做了映射配置这样可以通过下面的单元测试来验证查出的id为null而其他属性不为null
TestRollbackpublic void testUserMapper() throws Exception { ListUser userList userMapper.findAll(); for(User user : userList) { Assert.assertEquals(null, user.getId()); Assert.assertNotEquals(null, user.getName()); }}本文主要介绍几种最为常用的方式更多其他注解的使用可参见文档下一篇我们将介绍如何使用XML配置SQL的传统使用方式。
更多本系列免费教程连载「点击进入汇总目录」
代码示例
本文的相关例子可以查看下面仓库中的chapter3-5目录
Githubhttps://github.com/dyc87112/SpringBoot-Learning/Giteehttps://gitee.com/didispace/SpringBoot-Learning/
如果您觉得本文不错欢迎Star支持您的关注是我坚持的动力