1.数据库操作
在spring boot中操作数据库很方便,这里我们使用jpa,jpa是利用Hibernate生成各种自动化sql,增删改查都能简单实现
1.1 添加maven jpa依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
</dependency>
1.2 定义实体类
package com.mp.prj;
import javax.persistence.*;
import java.io.Serializable;
@Entity
@Table(name = "person_test")
public class Person implements Serializable {
private static final long serialVersionUID = 1L;
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
/**
* 指定name,则为数据库中的列名,这里做个映射
*/
@Column(name = "uname",length = 32,nullable = false,unique = true)
private String name;
/**
* 省略默认列名就是属性名
*/
@Column(length = 32)
private String passwd;
/*
* @Transient 注解不会映射成表的字段 ,如果字段不写注解,则默认为@Column
* */
@Transient
private String time;
public String getTime() {
return time;
}
public void setTime(String time) {
this.time = time;
}
public static long getSerialVersionUID() {
return serialVersionUID;
}
public Long getId() {
return id;
}
public void setId(Long id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getPasswd() {
return passwd;
}
public void setPasswd(String passwd) {
this.passwd = passwd;
}
public Person(String name,String passwd){
this.name = name;
this.passwd = passwd;
}
public Person(String name){
this.name = name;
}
public Person(){}
}
注解说明:
(1)@Entity:是一个必选的注解,声明这个类对应了一个数据库表
(2)@Table(name=“person_test”) :是一个可选的注解,声明了数据库表和实体的映射信息,如果没有指定,则代表表名和实体名一致
(3)@Id:声明了实体中唯一标识对应的属性
(4)@GeneratedValue(strategy = GenerationType.IDENTITY):自增长
(5) @Column(name = “uname”,length = 32,nullable = false,unique = true) :用来声明属性所对应的字段,指定name代表着实体中字段和表的字段不一致,默认代表着实体和表字段一致
(6)@Transient 注解不会映射成表的字段 ,如果字段不写注解,则默认为@Basic
注:这里必须要指定一个默认的构造函数
1.3 实现持久化接口服务
package com.mp.prj;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.jpa.repository.Query;
import org.springframework.data.repository.query.Param;
import org.springframework.stereotype.Repository;
import java.util.List;
@Repository
public interface PersonRepository extends JpaRepository<Person,Long> {
// Person findbyName(String name);
/*
* 自定义查询, @Query 注解中增加一个 nativeQuery = true 的属性,就可以采用原生 SQL 语句的方式来编写查询
* */
@Query(nativeQuery = true, value = "select * from person_test where uname=:name and passwd = :passwd")
List<Person> findPersonByNameAndPasswd(@Param("name") String name,@Param("passwd") String passwd);
}
注解说明:
(1)@Repository:所有标注了@Repository的类都将被注册为Spring Bean
(2)默认情况下,Jpa提供了基本的增删改查操作,都可以满足需求
(3)这里我另外写了一个方法,在不能满足我们的需求的情况下使用,这里使用了@Query 注解,可以自定义sql查询
1.4 实现Controller
package com.mp.prj;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
import java.util.List;
@RestController
@RequestMapping("/person")
public class PersonController {
@Autowired
PersonRepository personRepository;
@RequestMapping("/insert")
public String insertPerson(@RequestParam(value = "name") String name,
@RequestParam(value = "passwd") String passwd){
personRepository.save(new Person(name,passwd));
return "add person success";
}
@RequestMapping("/add/{name}")
public String addPerson(@PathVariable("name") String name){
personRepository.save(new Person(name));
return "add person ok";
}
@RequestMapping("/findbyid/{id}")
public Person findById(@PathVariable("id") String id){
return personRepository.findById(Long.valueOf(id)).get();
}
@RequestMapping("/list")
public List<Person> list(){
return personRepository.findAll();
}
@RequestMapping("/find2/{name}/{passwd}")
public List<Person> find2(@PathVariable("name") String name,
@PathVariable("passwd") String passwd){
return personRepository.findPersonByNameAndPasswd(name,passwd);
}
}
注解说明:
(1)@Autowired:按照类型(byType)装配依赖对象
(2)@PathVariable 和 @RequestParam
很容易理解,再次不详细介绍
1.6 数据库配置文件
在main路径下,新建resources文件夹,指定为Root Resources,新建文件application.yaml
spring:
datasource:
url: jdbc:mysql://10.1.0.9:3306/test?useUnicode=true&characterEncoding=UTF-8&useSSL=false
username: test
password: 123456
driver-class-name: com.mysql.jdbc.Driver
jpa:
hibernate:
ddl-auto: update
naming:
physical-strategy: org.springframework.boot.orm.jpa.hibernate.SpringPhysicalNamingStrategy
show-sql: true
ddl-auto参数说明:
(1)create: 每次加载 hibernate 时都会删除上一次的生成的表,然后根据你的 model 类再重新来生成新表,哪怕两次没有任何改变也要这样执行,这就是导致数据库表数据丢失的一个重要原因。
(2)create-drop :每次加载 hibernate 时根据 model 类生成表,但是 sessionFactory 一关闭,表就自动删除。
(3)update:最常用的属性,第一次加载 hibernate 时根据 model 类会自动建立起表的结构(前提是先建立好数据库),以后加载 hibernate 时根据 model 类自动更新表结构,即使表结构改变了但表中的行仍然存在不会删除以前的行。要注意的是当部署到服务器后,表结构是不会被马上建立起来的,是要等 应用第一次运行起来后才会 。
(4)validate :每次加载 hibernate 时,验证创建数据库表结构,只会和数据库中的表进行比较,不会创建新表,但是会插入新值。
1.7 启动服务
(1)新增用户:http://localhost:8080/person/insert?name=zhangsan1&passwd=123456
即会成功往数据库插入一条数据
(2)使用PathVariable 方式新增用户:
http://localhost:8080/person/add/zhangsan2
(3)查找用户:
http://localhost:8080/person/list
其他的就不再详细介绍了…
1.8 注解加载详解
以后专题进行分析