zoukankan      html  css  js  c++  java
  • SpringBoot 05_集成SpringDataJpa

    你还在为项目的集成头疼吗?你还在为管理大量的配置文件烦恼吗?如果是,用SpringBoot吧!今天主要介绍如果在SpringBoot的基础上创建一个集成了SpringDataJpa的项目,至于SpringDataJpa是什么,如果用过Hibernate的同学想必都在为不用写sql在庆幸吧,想要了解SpringDataJpa的话,我以后会写相关的博客分享给大家。

    下面就带大家来创建一个SpringBoot + SpringDataJpa的项目,创建的环境:

    开发工具 :IDEA

    SpringBoot版本:SpringBoot1.5.6

    Maven版本:Maven3.5.0

    JDK版本:1.8

    Mysql版本:5.6

    创建方式:Spring Initializr

    1:打开IDEA,File –> New project –> Spring Initializr –> Next

    image

    2:输入项目相关信息 –-> Next

    这里的信息根据实际情况自动填写,这里的是项目默认的。

    image

    3:添加项目依赖,这里添加两个依赖 –> Next。

    如果是web项目,则Web –> Web

    image

    添加JPA依赖;SQL —> JPA

    image

    添加完了之后,可以在右侧看到这个项目集成了哪些依赖,目前是Web和JPA。之后选择 Next

    4:输入项目名之后点击完成

    至此关于JPA的集成就集成好了,但是想真正的运行起来还是缺东西,下面我们就开始让项目跑起来吧。

    5:添加mysql jdbc连接依赖

    <!-- https://mvnrepository.com/artifact/mysql/mysql-connector-java -->
    <dependency>
        <groupId>mysql</groupId>
        <artifactId>mysql-connector-java</artifactId>
        <version>6.0.6</version>
    </dependency>

    6:在application.properties/application.yml中配置连接信息,使用Spring Initializr默认生成的是application.properties


    ########################################################
    ###数据库连接信息
    ########################################################
    #连接地址
    spring.datasource.url=jdbc:mysql://localhost:3306/testJPA
    #数据库账户
    spring.datasource.username=root
    #数据库密码
    spring.datasource.password=root
    #数据库驱动
    spring.datasource.driver-class-name=com.mysql.jdbc.Driver
    ########################################################
    ### Java Persistence Api JPA相关配置
    ########################################################
    #指定数据库类型
    spring.jpa.database=mysql
    #控制台打印sql
    spring.jpa.show-sql=true
    #建表策略,这里用update,即根据实体更新表结构
    spring.jpa.hibernate.ddl-auto=update
    #表中字段命名策略,这里要引入hibernate的核心包,不然这个命名策略会报错
    spring.jpa.hibernate.naming.implicit-strategy=org.hibernate.boot.model.naming.ImplicitNamingStrategyLegacyJpaImpl
    spring.jpa.hibernate.naming.physical-strategy=org.hibernate.boot.model.naming.PhysicalNamingStrategyStandardImpl
    spring.jpa.hibernate.naming.strategy=org.hibernate.cfg.ImprovedNamingStrategy
    #方言
    spring.jpa.properties.hibernate.dialect=org.hibernate.dialect.MySQL5Dialect

    7:在这里运行可能会出现Bug:Caused by: java.lang.NoSuchMethodError: org.hibernate.engine.spi.SessionFactoryImplementor.getProperties()Ljava/util/Properties;

    • 出现原因。理论上SpringBoot集成SpringDataJpa是不需要加入hibernate-core依赖的,但是就是因为字段命名策略的引用导致了需要加入hibernate5.x之间的版本。而SpringBoot-jpa-starter的版本脚底
    • 解决方案,参考:http://www.cnblogs.com/homeword/p/7456372.html

    8:实战


    • 创建实体类
    @Data
    @Entity
    @Table(name = "t_user")
    public class User {
    
        @Id
        @GeneratedValue(strategy = GenerationType.AUTO)
        private Long id;
    
        @Column
        private String userName;
    
        @Column(columnDefinition = "varchar(255) comment '居住地址'")
        private String homeAddress;
    
        private Long homeTel;
    
    }
    • 创建UserRepository.java

    @Repository
    public interface UserRepository extends JpaRepository<User, Long> {
    
    }
    • 创建UserController.java使用UserRepository
    @RequestMapping("/api")
    @RestController
    public class UserController {
    
        @Autowired
        private UserRepository userRepository;
    
        /**
         * 添加用户
         * @param user 用户信息
         * @return 添加成功后的用户id
         */
        @PostMapping("/users")
        public ServerResult saveUser(@RequestBody User user){
            User saveUser = userRepository.save(user);
            return new ServerResult("添加成功",saveUser.getId());
        }
    
        /**
         * 更新用户信息
         * @param user 用户信息
         * @param id 用户id
         * @return 更新结果
         */
        @PutMapping("/users/{id}")
        public ServerResult updateUserById(@RequestBody User user,@PathVariable Long id){
            user.setId(id);
            userRepository.save(user);
            return new ServerResult("修改成功",id);
        }
    
        /**
         * 获取用户信息
         * @param id 用户id
         * @return 用户信息
         */
        @GetMapping("/users/{id}")
        public ServerResult findUserById(@PathVariable Long id){
            User user = userRepository.findOne(id);
            return new ServerResult("查找成功",user);
        }
    
        /**
         * 删除用户信息
         * @param id 用户id
         * @return 删除结果
         */
        @DeleteMapping("/users/{id}")
        public ServerResult deleteUserById(@PathVariable Long id){
            userRepository.delete(id);
            return new ServerResult("删除成功",null);
        }
    
    }

    9:启动项目


    • 查看项目启动日志,发现会创建一张表,之前数据库中是不存在user表的

    Hibernate: create table t_user (id bigint not null auto_increment, home_address varchar(255) comment '居住地址', home_tel bigint, user_name varchar(255), primary key (id)) engine=MyISAM

    • 查看数据库

    image

    • 测试接口,用postman
      • 添加接口:localhost:8080/api/users                请求方式:POST

                image

    sql:Hibernate: insert into t_user (home_address, home_tel, user_name) values (?, ?, ?)

    image

      • 更新接口:localhost:8080/api/users/1              请求方式:PUT

                   image

    sql:

    Hibernate: select user0_.id as id1_0_0_, user0_.home_address as home_add2_0_0_, user0_.home_tel as home_tel3_0_0_, user0_.user_name as user_nam4_0_0_ from t_user user0_ where user0_.id=?

    Hibernate: update t_user set home_address=?, home_tel=?, user_name=? where id=?

    image

    备注:

    Hibernate的更新是先查询,再更新,为什么这么做是和对象的四种状态有关。

      • 查找接口:localhost:8080/api/users/1                 请求方式:GET

                    image

    sql:
    Hibernate: select user0_.id as id1_0_0_, user0_.home_address as home_add2_0_0_, user0_.home_tel as home_tel3_0_0_, user0_.user_name as user_nam4_0_0_ from t_user user0_ where user0_.id=?

    这个就不截图了,查询数据库没变化

      • 删除接口:localhost:8080/api/users/1            请求方式:DELETE

                   image

    sql:

    Hibernate: delete from t_user where id=?

    image

    备注:

    你可能会发现更新,获取,删除的接口都是一样的,其实更新还带了请求体的,而在字面上这获取和删除的接口是一样的,你可能会在实验的时候出错,那多半是因为你没注意到请求方式的问题,也就是我在删除中用红框标记的部分。

    我这里用的是Restful的请求方式,对于请求接口,请结合上下文进行理解,比如说删除:localhost:8080/api/users/1,删除的请求方式是DELETE,则说明我要删除编号为1的用户。

    10:小结

    终于写完了,欢迎阅读,指出文中不足,大家共同进步。

  • 相关阅读:
    scala学习手记7
    scala学习手记6
    scala学习手记5
    scala学习手记4
    scala学习手记3
    scala学习手记2
    Scala学习手记1
    Java实现的一个小说采集程序
    Java的值传递和引用传递
    java 使用反射
  • 原文地址:https://www.cnblogs.com/homeword/p/7442116.html
Copyright © 2011-2022 走看看