java technology --SpringBoot integration JPA to access MySQL (06)

1.JPA full name of the Java Persistence API, it is not a framework, but rather a set of specifications

(1)JPA通过JDK5.0注解或XML描述对象-关系表的映射关系,并将运行期的实体对象持久化到数据库中
(2)JPA的目标之一是制定一个可以由很多供应商实现的API,并且开发人员可以编码来实现该API,而不是使用私有供应商特有的API
(3)JPA是需要Provider来实现其功能的,Hibernate就是JPA Provider中很强的一个
(4)从功能上来说,JPA就是Hibernate功能的一个子集

2. Create Project

1)引入数据库操作相关依赖:
    <!--引入spring-boot-starter-data-jpa的依赖-->
    <dependency>
	  <groupId>org.springframework.boot</groupId>
	  <artifactId>spring-boot-starter-data-jpa</artifactId>
	</dependency>
    <!--引入MySQL Driver驱动包-->
	<dependency>
	  <groupId>mysql</groupId>
	  <artifactId>mysql-connector-java</artifactId>
	  <scope>runtime</scope>
    </dependency>2)配置相关文件
   <1>在application.yml:(需注意配置格式)文件配置mysql相关信息
     spring:
     datasource:
       url: jdbc:mysql://localhost:3306/user_manage?serverTimezone=GMT%2B8
       username: root
       password: 123
       driver-class-name: com.mysql.cj.jdbc.Driver
    jpa:
    hibernate:
      #更新或创建数据库表结构(第一次简表create,后面用update)
      ddl-auto: update
      #输出执行sql
      show-sql: true
   <2>如果通过jpa在数据库中建表,将jpa.hibernate,ddl-auto改为create,建完表之后,要改为update,要不然每次重启工程会删除表并新建
   <3>spring-boot-start-data-jpa默认的数据库连接池tomcat-jdbc

3. Specific coding

1)创建实体类
   @Entity//表明是一个映射的实体类
   @Table(name = "user")//表名
   public class User{
      @Id//表明主键id
     @GeneratedValue(strategy=GenerationType.IDENTITY)//主键自增
      private int id ;
      private String name ;
      private String passWord;
...  省略getter setter}2)dao层
    1.数据访问层,通过编写一个继承自 JpaRepository 的接口就能完成数据访问
    2.JpaRepository接口中已经封装了创建(save)、更新(save)、删除(delete)、查询(findAll、findOne)等基本操作的函数
    <1>dao层接口:
      public interface UserDAO extends JpaRepository<User,Integer> {
        //根据姓名查询
        User findByName(String name);
        //查询所有
        List<User> findAll();
        //对于复杂查询可以使用@Query 编写sql
        @Query("from User u where u.name=:name")
        User findUser(@Param("name") String name);}
    <2>dao层接口的实现类:
      1.接口类继承JpaRepository后,不管简单的,复杂的操作都不需要实现类,只需要传入相关的参数即可
      2.对于高级复杂的sql操作,自定义方法只要遵循一定的规范,就不需要实现接口
      3.只要程序能够认识这个方法名的意思就回自动执行
        举例:
        3.1.要根据name模糊查找,sql语句就是xxx where name like 'x%',关键字就是like
        3.2.方法名就是findByNameLike(String name),括号里就是要传进去的条件,相当于'x%'
        3.3.底层会解析方法名,拼接成sql语句,向数据库发送sql语句进行操作,本质上,一个方法就是一条sql语句
        3.4.还有一些关键词,And,Or,Between,OrderBy等等,都可以用于方法名
      4.如果想不符合规范的方法名,也可以通过注解编写sql语句
        4.1.通过@Query注解实现:里面的语句是hql语句,操作的是实体类
        4.2.要写原生sql语句,在@Query里面要加个属性:nativeQuery=true,就可以写原生sql语句了
        4.3.如果使用@Query注解,那么方法名就可以随意
        4.4.查询只要@Query一个注解就可以了,但是增加,修改,删除还需要另外一个注解@Modifying3)service层
    <1>service层接口:
    public interface UserService {
        List<User> findAll();}
    <2>service层接口的实现类:
    @Service
    public class UserServiceImpl implements UserService {
    @Autowired
    private UserDAO userDAO;
    @Override
    public List<User> findAll() {
        // 这里即使没有实现该方法也可以直接使用 findAll 方法
        return userDAO.findAll();}4)controller层:构建一组restful api来展示
     @RestController
     @RequestMapping("/user")
     public class UserController {
        @Autowired
        private UserService userService;
        private UserDAO userDAO;
        @RequestMapping(value = "/list", method = RequestMethod.GET)
        public List<Account> getAccounts() {
          return userService.findAll();}
        @RequestMapping(value = "/{id}", method = RequestMethod.GET)
        public Account getAccountById(@PathVariable("id") int id) {
          return userDAO.findOne(id);}
        @RequestMapping(value = "/{id}", method = RequestMethod.PUT)
        public String updateAccount(@PathVariable("id") int id,    @RequestParam(value = "name", required = true) String name){
        User user= new User();
        user.setName(name);
        user.setId(id);
        User user1 = userDao.saveAndFlush(user);
        return user1.toString();}

4 can be tested by Postman, attention restful api build style
5. General SpringBoot + JPA development project with relatively small
6. Springboot2.X connection pool in the official version, the database is recommended HikariCP (default database connection pool)

(1)HikariCP的性能和并发性。如果有HikariCP,总是选择它
(2)否则,如果Tomcat池数据源可用,将使用它
(3)如果HikariCP和Tomcat池数据源都不可用,如果Commons DBCP2可用,将使用它
(4)如果springboot版本是2.X,当使用spring-boot-starter-data-jpa依赖,springboot就会自动引入HikariCP的依赖了
(5)如果需要使用指定的数据库连接池
   5.1.需要在application.properties中配置:spring.datasource.type
   5.2.引入第三方数据库连接池依赖
Published 143 original articles · won praise 10 · views 7517

Guess you like

Origin blog.csdn.net/qq591009234/article/details/104229469