(1)后端项目代码分三层,controller层是对外提供的接口层,service层是逻辑实现层,mapper是操作数据库的仓储层。domain层的实体类在以上三层中都会用到
(2)jpa简答介绍
JPA是Java Persistence API的简称,中文名Java持久层API,是JDK 5.0注解或XML描述对象-关系表的映射关系,并将运行期的实体对象持久化到数据库中。
使用jpa的好处就是不用写sql语句,但是一般的企业项目中都不会用jpa,因为jpa的缺点就是不够灵活,不能够完全自定义sql语句,只能使用jpa提供的方法,实际企业项目中大多都用mybatis。
举例子感受一下使用 jpa 和 使用 mybatis 的区别
1)使用 jpa
User findByAccount(String account);
jpa中的查询语句都是find开头,在By后面添加查询条件,这里的Account是数据库表中的字段名称
可以多条件查询
User findByAccountAndPassword(String account,String password);
模糊查询
List<User> findAllByAccountLikeOrUsernameLike(String account, String username);
2)使用 mybatis
<select id="findByAccount" resultType="com.example.springbootmybatismysql.domain.User"> select * from springboot_demo.user where account=#{account} </select>
多条件查询
<select id="findByAccountAndPassword" resultType="com.example.springbootmybatismysql.domain.User"> select * from springboot_demo.user where account=#{account} and password=#{password} </select>
模糊查询
<select id="findAllByAccountLikeOrUsernameLike" resultMap="userResultMap"> select * from springboot_demo.user where account like concat('%',#{keywords},'%') or username like concat('%',#{keywords},'%') </select>
这里有介绍,此处不赘述:springboot简单应用
先创建基本目录:controller(控制器层)、service(逻辑层)、mapper(仓储层)、domain(领域层),result文件下是一些工具类
jpa的依赖
<!-- jpa 依赖 --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-jpa</artifactId> </dependency>
mysql的依赖,mysql有5.0的版本和8.0的版本,这里我用的是5.0的版本
<!-- <!– mysql 8 –>--> <!-- <dependency>--> <!-- <groupId>mysql</groupId>--> <!-- <artifactId>mysql-connector-java</artifactId>--> <!-- <version>8.0.15</version>--> <!-- </dependency>--> <!-- mysql 5 --> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <version>5.1.27</version> </dependency>
完整的pom文件,除了jpa的依赖和mysql的依赖,其他的依赖都是新建项目时自动生成的
<?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <groupId>com.example</groupId> <artifactId>springboot-jpa-mysql</artifactId> <version>0.0.1-SNAPSHOT</version> <name>springboot-jpa-mysql</name> <description>Demo project for Spring Boot</description> <properties> <java.version>1.8</java.version> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding> <spring-boot.version>2.3.7.RELEASE</spring-boot.version> </properties> <dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> <scope>test</scope> <exclusions> <exclusion> <groupId>org.junit.vintage</groupId> <artifactId>junit-vintage-engine</artifactId> </exclusion> </exclusions> </dependency> <!-- jpa 依赖 --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-jpa</artifactId> </dependency> <!-- <!– mysql 8 –>--> <!-- <dependency>--> <!-- <groupId>mysql</groupId>--> <!-- <artifactId>mysql-connector-java</artifactId>--> <!-- <version>8.0.15</version>--> <!-- </dependency>--> <!-- mysql 5 --> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <version>5.1.27</version> </dependency> </dependencies> <dependencyManagement> <dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-dependencies</artifactId> <version>${spring-boot.version}</version> <type>pom</type> <scope>import</scope> </dependency> </dependencies> </dependencyManagement> <build> <plugins> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-compiler-plugin</artifactId> <version>3.8.1</version> <configuration> <source>1.8</source> <target>1.8</target> <encoding>UTF-8</encoding> </configuration> </plugin> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> <version>2.3.7.RELEASE</version> <configuration> <mainClass>com.example.springbootjpamysql.SpringbootJpaMysqlApplication</mainClass> </configuration> <executions> <execution> <id>repackage</id> <goals> <goal>repackage</goal> </goals> </execution> </executions> </plugin> </plugins> </build> </project>
在application.properties文件中添加配置信息
# 应用名称 spring.application.name=springboot-jpa-mysql # 应用服务 WEB 访问端口 server.port=8080 spring.datasource.url=jdbc:mysql://127.0.0.1:3306/springboot_demo?serverTimezone=UTC&useSSL=false&tinyInt1isBit=false&zeroDateTimeBehavior=round spring.datasource.username=root spring.datasource.password=root #MySQL 8 #spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver #MySQL 5 spring.datasource.driver-class-name=com.mysql.jdbc.Driver spring.jpa.hibernate.ddl-auto = none
mysql 8.0 和mysql 5.0的驱动器是不一样的,我用的是5.0的。
数据库连接账号和密码我这里都是root
先新建数据库 springboot_demo,再执行下面的sql语句新建表
DROP TABLE IF EXISTS `user`; CREATE TABLE `user` ( `id` int(11) NOT NULL AUTO_INCREMENT, `account` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, `username` varchar(30) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL, `password` varchar(16) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, PRIMARY KEY (`id`) USING BTREE ) ENGINE = InnoDB AUTO_INCREMENT = 5 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci ROW_FORMAT = Compact; -- ---------------------------- -- Records of User -- ---------------------------- INSERT INTO `user` VALUES (1, '1001', 'test1', '123456'); INSERT INTO `user` VALUES (2, '1002', 'test2', '123456'); INSERT INTO `user` VALUES (3, '1003', 'test3', '123456'); INSERT INTO `user` VALUES (4, '1004', 'test4', '123456');
(1)在domain目录下新建实体类 User
package com.example.springbootjpamysql.domain; import com.fasterxml.jackson.annotation.JsonIgnoreProperties; import javax.persistence.*; @Entity @Table(name = "user") @JsonIgnoreProperties({"handler","hibernateLazyInitializer"}) public class User { //主键定义,只能有一个,选择对应的列名 @Id @GeneratedValue(strategy = GenerationType.IDENTITY) @Column(name = "id") int id; String account; String username; String password; public int getId() { return id; } public void setId(int id) { this.id = id; } public String getAccount() { return account; } public void setAccount(String account) { this.account = account; } public String getUsername() { return username; } public void setUsername(String username) { this.username = username; } public String getPassword() { return password; } public void setPassword(String password) { this.password = password; } }
(2)在mapper目录下新建接口 UserMapper
package com.example.springbootjpamysql.mapper; import com.example.springbootjpamysql.domain.User; import org.springframework.data.jpa.repository.JpaRepository; import java.util.List; public interface UserMapper extends JpaRepository<User, Integer> { User findById(int id); User findByAccount(String account); User findByAccountAndPassword(String account,String password); List<User> findAllByUsernameLike(String username); List<User> findAllByAccountLikeOrUsernameLike(String account, String username); }
(3)在result目录下新建类 Search
package com.example.springbootjpamysql.result; public class Search { String keywords; public String getKeywords() { return keywords; } public void setKeywords(String keywords) { this.keywords = keywords; } }
(4)在service目录下新建接口 UserService
package com.example.springbootjpamysql.service; import com.example.springbootjpamysql.domain.User; import java.util.List; public interface UserService { List<User> getAllUser(); User findById(int id); User findByAccount(String account); User findByAccountAndPassword(String account, String password); List<User> findAllByUsernameLike(String keywords); List<User> findAllByAccountLikeOrUsernameLike(String keywords); void deleteById(int id); User add(User user); User update(User user); }
(5)在service->impl 目录下新建类 UserServiceImpl
package com.example.springbootjpamysql.service.impl; import com.example.springbootjpamysql.domain.User; import com.example.springbootjpamysql.mapper.UserMapper; import com.example.springbootjpamysql.service.UserService; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.data.domain.Sort; import org.springframework.stereotype.Service; import java.util.List; @Service public class UserServiceImpl implements UserService { @Autowired UserMapper userMapper; @Override public List<User> getAllUser() { return userMapper.findAll(); } @Override public User findById(int id) { return userMapper.findById(id); } @Override public User findByAccount(String account) { return userMapper.findByAccount(account); } @Override public User findByAccountAndPassword(String account, String password) { return userMapper.findByAccountAndPassword(account,password); } @Override public List<User> findAllByUsernameLike(String keywords) { return userMapper.findAllByUsernameLike('%' + keywords + '%'); } @Override public List<User> findAllByAccountLikeOrUsernameLike(String keywords) { return userMapper.findAllByAccountLikeOrUsernameLike('%' + keywords + '%','%' + keywords + '%'); } @Override public void deleteById(int id) { userMapper.deleteById(id); } @Override public User add(User user) { return userMapper.save(user); } @Override public User update(User user) { return userMapper.save(user); } }
(6)在controller目录下新建类 UserController
package com.example.springbootjpamysql.controller; import com.example.springbootjpamysql.domain.User; import com.example.springbootjpamysql.result.Search; import com.example.springbootjpamysql.service.UserService; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RestController; import java.util.List; @RestController public class UserController { @Autowired UserService userService; @GetMapping("/api/getAllUser") public List<User> getAllUser() throws Exception { return userService.getAllUser(); } @PostMapping("/api/findById") public User findById(int id) throws Exception { return userService.findById(id); } @PostMapping("/api/findByAccount") public User findByAccount(@RequestBody Search s) throws Exception { return userService.findByAccount(s.getKeywords()); } @PostMapping("/api/findByAccountAndPassword") public User findByAccountAndPassword(@RequestBody User user) throws Exception { return userService.findByAccountAndPassword(user.getAccount(),user.getPassword()); } @PostMapping("/api/findAllByUsernameLike") public List<User> findAllByUsernameLike(@RequestBody Search s) throws Exception { return userService.findAllByUsernameLike(s.getKeywords()); } @PostMapping("/api/findAllByAccountLikeOrUsernameLike") public List<User> findAllByAccountLikeOrUsernameLike(@RequestBody Search s) throws Exception { return userService.findAllByAccountLikeOrUsernameLike(s.getKeywords()); } @PostMapping("/api/addUser") public User addUser(@RequestBody User user) throws Exception { User user1 = userService.findByAccount(user.getAccount()); if (user1 != null){ return null; }else { userService.add(user); return user; } } @PostMapping("/api/updateUser") public User updateUser(@RequestBody User user) throws Exception { User user1 = userService.findByAccount(user.getAccount()); if (user1 != null){ userService.update(user); return user; }else { return null; } } @PostMapping("/api/deleteUser") public User deleteUser(@RequestBody User user) throws Exception { User user1 = userService.findByAccount(user.getAccount()); if (user1 != null){ userService.deleteById(user.getId()); return user; }else { return null; } } }
(7)创建完毕后的目录结构是这样的
启动项目,用postman测试
增删改
http://localhost:8080/api/addUser
http://localhost:8080/api/deleteUser
http://localhost:8080/api/updateUser
获取所有user
http://localhost:8080/api/getAllUser
模糊查询
findAllByAccountLikeOrUsernameLike
http://localhost:8080/api/findAllByAccountLikeOrUsernameLike
springboot-jpa-mysql