日常生活中,我们并不使用 JdbcTemplate, 而是使用 JPA和MyBatis,MyBatis-Plus. 这一章节,我们讲解一下, JPA的相关操作。
一. SpringBoot 整合 JPA前期准备
按照老蝴蝶以前讲解的方式,采用Maven 构建SpringBoot项目。
一.一 pom.xml 添加依赖
<!--引入MySql的驱动--> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> </dependency> <!--引入springboot与jpa整合的依赖--> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-jpa</artifactId> </dependency>
一.二 application.yml 添加JPA的配置
# 引入 数据库的相关配置 spring: datasource: driver-class-name: com.mysql.cj.jdbc.Driver url: jdbc:mysql://localhost:3306/springboot?serverTimezone=GMT%2B8&useUnicode=true&characterEncoding=UTF-8&useSSL=false username: root password: abc123 # JPA的相关配置 jpa: # 设置数据库平台 database-platform: org.hibernate.dialect.MySQLDialect # 设置数据库 database: mysql # 是否展示SQL语句 show-sql: true hibernate: # 持久化规则是 update ddl-auto: update naming: # 物理命名策略类的全限定名称 physical-strategy: org.hibernate.boot.model.naming.PhysicalNamingStrategyStandardImpl
一.三 创建 User 表
DROP TABLE IF EXISTS `user`; CREATE TABLE `user` ( `id` int(11) NOT NULL AUTO_INCREMENT, `name` varchar(15) DEFAULT NULL, `sex` varchar(20) DEFAULT NULL, `age` int(6) DEFAULT NULL, `description` varchar(50) DEFAULT NULL, PRIMARY KEY (`id`) ) ENGINE=InnoDB AUTO_INCREMENT=18 DEFAULT CHARSET=utf8;
二. 整合JPA应用
SpringBoot整合JPA时,需要创建相应的 实体类,工厂接口。
工厂接口有 Crud接口,有 PagingAndSorting,有 Jpa接口,也有 Specification 动态查询接口。
每一种接口,都有其特殊的功能。
二.一 创建 POJO 类和业务类
在 pojo 包下,创建 User.java
@Data @NoArgsConstructor @AllArgsConstructor @Table(name = "user") @Entity public class User implements Serializable { /** * @param id id编号 * @param name 姓名 * @param sex 性别 * @param age 年龄 * @param description 描述 */ @Id //指定生成策略 @GeneratedValue(strategy=GenerationType.IDENTITY) private Integer id; @Column(name = "name") private String name; @Column(name="sex") private String sex; @Column(name="age") private Integer age; @Column(name="description") private String description; }
在 service包下,创建相应的接口和实现类
public interface UserService { }
@Service public class UserServiceImpl implements UserService { }
二.二 Crud 工厂接口
二.二.一 接口的相关定义
org.springframework.data.repository.CrudRepository
@NoRepositoryBean public interface CrudRepository<T, ID> extends Repository<T, ID> { }
二.二.二. Crud 接口实现
在 repository 包下,创建 UserCrudRepository 接口。
public interface UserCrudRepository extends CrudRepository<User,Integer> { }
二.二.三 Crud 测试
在 test测试目录下,创建对应的测试类和测试方法,进行测试。
@SpringBootTest @Log4j2 public class CrudRepositoryTests { @Autowired private UserService userService; }
二.二.三.一 插入 save 方法
测试方法:
@Test public void addTest(){ //1. 构建对象 User user=new User(); user.setName("欢欢"); user.setAge(22); user.setSex("女"); user.setDescription("一个非常可爱的女孩纸"); //2. 添加方法 userService.addUser(user); log.info("添加成功,{}",user); }
省略接口方法,其对应的实现方法
添加Crud接口注入
@Autowired private UserCrudRepository userCrudRepository;
@Override public void addUser(User user) { userCrudRepository.save(user); }
控制台打印输出:
二.二.三.二 更新 save 方法
测试方法
@Test public void updateTest(){ //1. 构建对象 User user=new User(); user.setId(1); //id不存在,会添加 user.setName("欢欢"); user.setDescription("岳泽霖最好的朋友"); //2. 修改方法 userService.updateUser(user); log.info("修改成功,{}",user); }
接口实现方法
@Override public void updateUser(User user) { userCrudRepository.save(user); }
控制台打印输出
先查询,发现有,就更新,如果没有的话,就插入。
二.二.三.三 删除 delete 方法
测试方法
@Test public void deleteTest(){ userService.deleteUser(1); }
接口实现方法
@Override public void deleteUser(Integer id) { userCrudRepository.deleteById(id); }
数据库里面,没有此条数据了。
二.二.三.四 批量更新数据 saveAll
重新执行一下, save() 方法,插入一条数据, id=2.
测试方法:
@Test public void batchAddTest(){ //1. 构建对象 User user=new User(); user.setName("小欢欢"); user.setAge(22); user.setSex("女"); user.setDescription("一个小坏蛋"); User user1=new User(); user1.setName("小泽霖"); user1.setAge(25); user1.setSex("男"); user1.setDescription("一个大坏蛋"); //这是修改的操作,id=2已经存在这条记录了。 User user2=new User(); user2.setName("岳泽霖"); user2.setId(2); user2.setAge(25); user2.setSex("男性"); user2.setDescription("一个快乐的程序员"); //2. 放置到集合里面 List<User> userList=new ArrayList<>(); userList.add(user); userList.add(user1); userList.add(user2); userService.batchAddUser(userList); }
接口实现方法:
@Override public void batchAddUser(List<User> userList) { userCrudRepository.saveAll(userList); }
会插入前两条,更新第三条记录。