在第一节中学习了如何初始化一个项目,并且写了一个最最最最:smile:简单的接口,但是项目中数据肯定是来自数据库,在传统 java
中使用 JDBC
来操作数据库,进入 web
部分后,现在主要采用 mybatis持久层框架
做SQL映射(把数据库内容映射成对象,Object Relational Mapping)来操作数据库,在 spring boot
中集成到了 mybatis-spring-boot-starter
中。 所以本系列教程中操作数据库时第一步在 pom.xml
先引入两个依赖:
<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> </dependency> 复制代码
datasource
有了上述的 starter
和 mysql驱动
之后,做一个小小的改变,将 resources/application.properties
文件删除。然后在此位置新建 application.yml
,然后写入数据库连接配置项:
server: port: 8082 servlet: context-path: /api #####################上面三行在第一节已经解释 spring: datasource: url: jdbc:mysql://localhost:3307/test_spring?useUnicode=true&characterEncoding=utf-8&serverTimezone=Asia/Shanghai username: root password: root driver-class-name: com.mysql.cj.jdbc.Driver 复制代码
其中 datasource
各个字段含义:
url
: jdbc:mysql://数据库ip:数据库端口号/数据库名字?用户编码&字符编码&服务器时区
username
:
password
:
driver-class-name
:
mybatis
通常来说有两种方式来使用 mybatis
:
mapper
接下来通过基本的数据库操作- 查询数据库 来分别实践两种方式,然后再把 增删改查 四种方式都实现一遍。 我是 约定大于配置
的拥趸,同样的,在 springboot
开发中也有一套约定,目前我觉得有两个好约定:代码结构和书写顺序:
controller dao service
,其中对于
service
层通常习惯面向接口(
interface
)编程,具体的实现在
impl
中写实现类,提高了不同业务中针对同一接口的不同实现。
web
开发中,按照如下的四个顺序写代码,比较快、也比较容易组织代码 package com.wushao.springbootdemo.entity; import java.util.Objects; public class User { private Integer id; private String name; public Integer getId() { return id; } public void setId(Integer id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } @Override public boolean equals(Object o) { if (this == o) return true; if (o == null || getClass() != o.getClass()) return false; User user = (User) o; return id.equals(user.id) && name.equals(user.name); } @Override public int hashCode() { return Objects.hash(id, name); } } 复制代码
对于以上的属性,直接利用 IDEA
的快捷键 alt+insert
进行 getter setter equals hashCode
的快速实现,也可以借助 lombok
的注解快速实现。
import lombok.Data; @Data public class User { private Integer id; private String name; } 复制代码
controller层
,可以认为是 接口层 。 @RestController @RequestMapping(value = "users") public class UserController { @Autowired UserService userService; @GetMapping(value = "", produces = {"application/json;charset=UTF-8"}) public List<User> getAllUsers() { return userService.listUsers(); } @PostMapping(value = "/getUsers", produces = {"application/json;charset=UTF-8"}) public List<User> getUsersByCondition(@RequestBody User user) { return userService.listUsersByCondition(user); } } 复制代码
对于 control
层来说
@RestController
的注解,告诉容器我是一个 restful
风格的api层 @RequestMapping
注解标识接口的根路径为 /users
@Autowired
自动注入 Service
层的逻辑接口。 @GetMapping @PostMapping @PutMapping @DeleteMapping
四种注解完成 Restful
接口 service
中完成业务 这一层是后端实现逻辑的主要 业务层 ,通常来说,这一层的代码结构采用两层来进行细化(详见上图的目录结构)
public interface UserService { List<User> listUsers(); List<User> listUsersByCondition(User user); } 复制代码
impl/
去实现上面的 interface
@Service public class UserServiceImpl implements UserService { @Autowired UserDao userDao; @Override public List<User> listUsers() { return userDao.findAll(); } @Override public List<User> listUsersByCondition(User user) { return userDao.findUsersByCondition(user); } } 复制代码
对于 Service层
来说,使用 Spring框架
的注解 @Service
告诉容器我是 Spring的一个Bean
service
中调用 dao
层相关 sql
去操作数据库 最后一步重要操作是通过 ibatis
的注解 @Select
操作数据库查询数据, mybatis
是它后来改的名字,也就是说必须先引入了 mybatis
的依赖,才能使用 @Select
。
@Repository public interface UserDao { @Select("select * from test_spring.user;") List<User> findAll(); List<User> findUsersByCondition(User user); } 复制代码
对于 Dao层
来说,使用 Spring框架
的注解 @Repository
告诉容器我是 Spring的一个Bean
Bean类
与容器入口类之间直接进行跳转。
@Select
注解后面的就是 sql语句
, @Select("select * from test_spring.user;")
, 查询 test_spring库的user表
完成查询数据库的操作。
mapper
的方式完成模糊查询 要想使用 mapper
方式:
application.yml
中写入 mapper
的扫描路径 # 上面的基础配置 mybatis: mapper-locations: classpath:mapper/*.xml 复制代码
resources/mapper
目录下建立对应的 user-mapper.xml
,一张表一个 mapper
<?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="com.wushao.springbootdemo.dao.UserDao"> <select id="findUsersByCondition" resultType="com.wushao.springbootdemo.entity.User" parameterType="com.wushao.springbootdemo.entity.User"> -- SELECT * FROM test_spring.user WHERE name LIKE '%${name}%' SELECT * FROM test_spring.user WHERE name LIKE "%"#{name}"%" </select> </mapper> 复制代码
上面的 xml
中
mapper标签
的 namespace
是 dao层目录
select标签
表示这是查询数据库的操作,它的 id
是 dao层
的方法名字 resultType
是实体类的路径,也是返回结果类型 parameterType
的参数的类型,也是实体类。如果在 dao
使用下面的写法可以不用这个参数: // List<User> findUsersByCondition(User user); List<User> findUsersByCondition(@Param("user") User user); 复制代码
sql语句
,有如下两种模糊查询的写法 SELECT * FROM test_spring.user WHERE name LIKE '%${name}%' SELECT * FROM test_spring.user WHERE name LIKE "%"#{name}"%" 复制代码
dao
层和 mapper
之间的跳转工具 很遗憾的说,推酷将在这个月底关闭。人生海海,几度秋凉,感谢那些有你的时光。
原文 https://juejin.im/post/5f0eea4b5188252e8272e0cf