关于Jpa,具体的详细我也不是很了解,但是关于Jpa的简介,我会在后续学习后专门写一篇博客进行记录。
这篇主要讲SpringBoot整合Jpa。
依赖
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.32</version>
<scope>runtime</scope>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid-spring-boot-starter</artifactId>
<version>1.1.10</version>
</dependency>
</dependencies>
这值得一提的是这里使用数据库连接池,使用的是Druid,这里是Druid是使用的是com.alibaba.druid-spring-boot-starter,该starter是由第三方提供的,MyBatis和Druid依赖的命名和其他库的命名不太一样,但是它所支持的mysql是mysql8,这由于数据库版本的问题,所以我们需要锁定数据库版本。
application.properties
# 数据库的基本配置
spring.datasource.username=root
spring.datasource.password=rootzsl
spring.datasource.url=jdbc:mysql:///db?useUnicode=true&characterEncoding=UTF-8
spring.datasource.type=com.alibaba.druid.pool.DruidDataSource
# JPA配置
spring.jpa.database=mysql
# 在控制台打印SQL
spring.jpa.show-sql=true
# 数据库平台
spring.jpa.database-platform=mysql
# 每次启动项目时,数据库初始化策略
spring.jpa.hibernate.ddl-auto=update
# 指定默认的存储引擎为InnoDB
spring.jpa.properties.hibernate.dialect=org.hibernate.dialect.MySQL57Dialect
注意
在mysql中,默认情况下,自动创建表的时候会使用MyISAM做表的引擎,所以需要配置数据库方言为MySQL57Dialect,则使用InnoDB做表的引擎。也就是上面的最后一行
# 指定默认的存储引擎为InnoDB
spring.jpa.properties.hibernate.dialect=org.hibernate.dialect.MySQL57Dialect
无需手动建表,根据pojo类自动建表
/**
* @author ZSL
* @ClassName User
* @description
* @date 2019/8/10
*/
@Entity(name = "t_user")//这是一个实体类,name指定表名
public class User {
@Id//主键id
/**
* 主键自增长,IDENTITY用于Mysql的主键自增长,SEQUENCE用于Oralc,序列自增长
*/
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Integer id;
/**
* 默认都会根据属性名在表中生成相应的字段,字段名和属性名相同
* 也可以根据业务逻辑来配置字段的名称,长度,是否为空等
*/
@Column(name = "name")//指定字段名
private String name;
@Column(name = "age")//指定字段名
private Integer age;
public User(String name, Integer age) {
this.name = name;
this.age = age;
}
public User() {
}
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;
}
public Integer getAge() {
return age;
}
public void setAge(Integer age) {
this.age = age;
}
@Override
public String toString() {
return "User{" +
"id=" + id +
", name='" + name + '\'' +
", age=" + age +
'}';
}
}
ORM框架(Object Relational Mapping):对象关系映射,所以ORM框架可以根据pojo实体类,去创建对应的数据表。
当你配置完上面内容,运行后,数据库会自动生成这个pojo对应的表。
我们在Mybatis中,有Mapper接口以及它对应的关系映射文件Mapper.xml,而在Jpa中,其实也有这样类似的接口, 我们只需要用一个接口去继承JpaRepository
这个接口,JpaRepository提供了一些基本的数据操作方法CRUD。
public interface IUserDao1 extends JpaRepository<User,Integer> { }
这样其实它已经定义好了相关接口和sql,
我们可以直接使用
/**
* @author ZSL
* @ClassName UserService
* @description
* @date 2019/8/10
*/
@Service
public class UserService {
@Autowired
IUserDao1 userDao;
public User updUser(User user){
return userDao.saveAndFlush(user);
}
public void delUser(User user){
userDao.delete(user);
}
public Integer delUserById(Integer id){
boolean flag = userDao.existsById(id);
if (flag == true){
userDao.deleteById(id);
return 1;
}else {
return 0;
}
}
}
当然我们也可以根据自己的业务需求在该自定义接口中声明相关的一些方法,但是必须符合规范。
在Spring Data中,按照规范进行方法声明,就可以不用写sql。
根据图可以发现,多以查询为主。
我们也可以自定义声明接口,然后写sql语句。
public interface IUserDao1 extends JpaRepository<User,Integer> {
@Query(value = "SELECT * FROM t_user WHERE id > ?1 and name LIKE ?2",nativeQuery = true)
List<User> selUserLike(Integer id, String str);
@Query(value = "SELECT u FROM t_user u WHERE name = :name")
List<User> selUserByName(@Param("name") String name);
@Modifying
@Query("UPDATE t_user SET name = :name WHERE id = :id")
int updUser1(@Param("name") String name,@Param("id") Integer id);
}
使用@Query注解, 自定义查询SQL,只需在@Query注解中写JPQL,记住这里不是sql而是JPQL,如果想使用原生的sql,可以在@Query注解中配置nativeQuery=true即可。
如果要使用sql进行数据的更新等DML操作时,需要加上@Modifying,这里需要注意的是,要在Service层中调用该方法的方法上必须使用事务。
Service
/**
* @author ZSL
* @ClassName UserService
* @description
* @date 2019/8/10
*/
@Service
public class UserService {
@Autowired
IUserDao1 userDao;
public User updUser(User user){
return userDao.saveAndFlush(user);
}
public void delUser(User user){
userDao.delete(user);
}
public Integer delUserById(Integer id){
boolean flag = userDao.existsById(id);
if (flag == true){
userDao.deleteById(id);
return 1;
}else {
return 0;
}
}
public List<User> selUserLike(Integer id, String str){
return userDao.selUserLike(id,str);
}
public List<User> selUserByName(String name){
return userDao.selUserByName(name);
}
@Transactional( propagation = Propagation.REQUIRES_NEW)
public int updUser1(String name,Integer id){
return userDao.updUser1(name,id);
}
}
Controller
/**
* @author ZSL
* @ClassName UserController
* @description
* @date 2019/8/10
*/
@RestController
public class UserController {
@Autowired
private UserService userService;
@GetMapping("/uu")
public void updUser(User user){
user.setName("zsl");
user.setAge(111);
User user1 = userService.updUser(user);
System.out.println(user1);
}
@GetMapping("/du")
public void delUser(User user){
user.setId(1);
user.setName("zsl");
user.setAge(111);
userService.delUser(user);
}
@GetMapping("/dub")
public void delUserById(Integer id){
Integer id1 = userService.delUserById(id);
System.out.println(id1);
}
@GetMapping("/sul")
public void selUserLike(Integer id, String str){
System.out.println(userService.selUserLike(id,str));
}
@GetMapping("/subu")
public void selUserByName(String name){
System.out.println(userService.selUserByName(name));
}
@GetMapping("/updu")
public void updUser1(String name,Integer id){
System.out.println(userService.updUser1(name,id));
}
}