springBoot+Jpa(hibernate)数据库基本操作

本文涉及的产品
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
RDS MySQL Serverless 高可用系列,价值2615元额度,1个月
云数据库 RDS PostgreSQL,高可用系列 2核4GB
简介: springBoot+Jpa(hibernate)数据库基本操作

Jpa是什么?


JPA是一套规范,不是一套产品,那么像Hibernate,TopLink,JDO他们是一套产品,如果说这些产品实现了这个JPA规范,那么我们就可以叫他们为JPA的实现产品。


Spring-data-jpa依赖于Hibernate,具体的示例如下:


项目配置


在pom.xml中添加相关依赖,加入内容如下:

<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>

在application.xml中配置,数据库连接信息如下:

server.port=8081
spring.datasource.url = jdbc:mysql://localhost:3306/student?characterEncoding=UTF-8&zeroDateTimeBehavior=convertToNull
spring.datasource.username = root
spring.datasource.password = root
spring.datasource.driverClassName = com.mysql.jdbc.Driver
# Specify the DBMS
spring.jpa.database = MYSQL
# Show or not log for each sql query输入sql语句
spring.jpa.show-sql = true 
# Hibernate ddl auto (create, create-drop, update)
spring.jpa.hibernate.ddl-auto = update
# Naming strategy
spring.jpa.hibernate.naming-strategy = org.hibernate.cfg.ImprovedNamingStrategy
# stripped before adding them to the entity manager)
spring.jpa.properties.hibernate.dialect = org.hibernate.dialect.MySQL5Dialect

注:spring.jpa.show-sql =true 是在控制台输入sql语句


      对spring.jpa.hibernate.ddl-auto 这个属性,主要作用 是:自动创建、更新、验证数据表结构,该参数的几种配置如下:


  • create:每次加载hibernate时都会删除上一次的生成的表,然后根据你的model类再重新来生成新表,哪怕两次没有任何改变也要这样执行,这就是导致数据库表数据丢失的一个重要原因。
  • create-drop:每次加载hibernate时根据model类生成表,但是sessionFactory一关闭,表就自动删除。
  • update:最常用的属性,第一次加载hibernate时根据model类会自动建立起表的结构(前提是先建立好数据库),以后加载hibernate时根据model类自动更新表结构,即使表结构改变了但表中的行仍然存在不会删除以前的行。要注意的是当部署到服务器后,表结构是不会被马上建立起来的,是要等应用第一次运行起来后才会。
  • validate:每次加载hibernate时,验证创建数据库表结构,只会和数据库中的表进行比较,不会创建新表,但是会插入新值。


创建实体bean如下:

@Entity
@Table(name = "t_bank_account")
public class BankAccount extends JpaRepositoriesAutoConfiguration{

    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    private String cardno;
    private String name;
    private Long id;
    private BigDecimal money;
    public Long getId() {
        return id;
    }
    public void setId(Long id) {
        this.id = id;
    }
    public String getCardno() {
        return cardno;
    }
    public void setCardno(String cardno) {
        this.cardno = cardno;
    }
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public BigDecimal getMoney() {
        return money;
    }
    public void setMoney(BigDecimal money) {
        this.money = money;
    }
}

创建服务访问数据库的DAO:

public interface BankAccountDao extends CrudRepository<BankAccount, Long> {

    //根据编号查询
    public BankAccount findById(Long id);


    @Query(value = "select * from t_bank_account where name like %?1%",nativeQuery = true)
    @Modifying
    public List<BankAccount> findByNameLike(String name);//NotLike --- 等价于 SQL 中的 "not like",比如 findByNameNotLike(String name);

    public Page<BankAccount> findAll(Pageable pageable);

    //联合查询数据
    @Query(value = "SELECT b.id,a.name as name,b.name,a.age,b.cardno,b.money from user a LEFT JOIN t_bank_account b on a.id=b.id and b.id=?1",nativeQuery = true)
    @Modifying
    public List<BankAccount> findOrderById(Integer id);

    //源生sql插入
    @Query(value = "insert into t_bank_account(cardno,name,money) value(?1,?2,?3)",nativeQuery = true)
    @Modifying
    @Transactional
    public void insertBank_account(String cardNo, String name, BigDecimal money);

    //源生sql修改
    @Query(value = "update t_bank_account set name = ?2 where id=?1",nativeQuery = true)
    @Modifying
    @Transactional
    public  void updateOne(Long id,String name);

    //源生sql 删除
    @Query(value = "delete from t_bank_account where id = ?1",nativeQuery = true)
    @Modifying
    @Transactional
    public void deteteBankAccountById(Long id);
}

该类继承CrudRepository,通过查看CrudRepository接口的API文档,可以看到该接口本身实现了创建(save),更新(save),删除(delete),查询(findId,findAll)等基本的操作函数,因此我们在开发过程中,就没有必要在继续进行开发定义了


上面还有使用源生的sql进行查询,注意的是提交的时候@Trancational是必须要写的。


Controller控制台示例如下:

public class BankAccountController{

    @Resource
    BankAccountDao accountDao;

    @ApiOperation(value = "查找银行用户")
    @RequestMapping(value = "/findById" , method = RequestMethod.GET)
    public Object findById(@RequestParam(value = "id",required = false) Long id){

        Iterable<BankAccount> bList;
        if(id!=null){
            BankAccount user = accountDao.findById(id);
            if(user == null){
                return "该数据项不存在";
            }else{
                return "cardNo:" + user.getCardno() + " , name:" + user.getName()+",money:"+user.getMoney();
            }
        }else{
            bList = accountDao.findAll();

        }
        return bList;
    }
    @ApiOperation(value = "姓名查询银行用户信息")
    @RequestMapping(value = "findName",method = RequestMethod.GET)
    public List<BankAccount> findName(@RequestParam(value = "name")String name){

        List<BankAccount> bList = accountDao.findByNameLike(name);
        return bList;
    }
    @ApiOperation(value = "查询银行用户数据")
    @RequestMapping(value = "findIds",method = RequestMethod.GET)
    public List<BankAccount> findIds(@RequestParam(value = "id")Integer id){

        List<BankAccount> bList = accountDao.findOrderById(id);
        return bList;
    }

    @ApiOperation(value = "新增银行数据")
    @RequestMapping(value = "saveBankAccount",method = RequestMethod.POST)
    public String addBankAccount(@RequestParam(value ="cardNo") String cardNo, @RequestParam(value = "name") String name,
                                 @RequestParam(value = "money")BigDecimal money){
        BankAccount account = new BankAccount();
        account.setMoney(money);
        account.setName(name);
        account.setCardno(cardNo);
        accountDao.insertBank_account(cardNo,name,money);
        //accountDao.save(account);
        return " Add success!";//
    }

    @ApiOperation(value = "修改银行数据")
    @RequestMapping(value = "updateBankAccount",method = RequestMethod.POST)
    public String updateBankAccount(@RequestParam(value ="id") Long id, @RequestParam(value = "name") String name){
        accountDao.updateOne(id,name);
        return " update success!";
    }

    @ApiOperation(value = "删除银行数据")
    @RequestMapping(value = "delAccountId",method = RequestMethod.POST)
    public String delBankAccount(@RequestParam(value = "id") Long id){

       BankAccount user = accountDao.findById(id);
       if(user==null){
            return "该数据项不存在!";
       }else{
          // accountDao.delete(id);//jar自带的删除方法
           accountDao.deteteBankAccountById(id);//源生的删除方法
       }
        return "success!";
   }

具体的源码可以在这里进行下载如有需要的

http://download.csdn.net/download/juanmiao/10113527

相关实践学习
如何快速连接云数据库RDS MySQL
本场景介绍如何通过阿里云数据管理服务DMS快速连接云数据库RDS MySQL,然后进行数据表的CRUD操作。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助 &nbsp; &nbsp; 相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
目录
相关文章
|
19天前
|
Java API 数据库
JPA简介:Spring Boot环境下的实践指南
上述内容仅是JPA在Spring Boot环境下使用的冰山一角,实际的实践中你会发现更深更广的应用。总而言之,只要掌握了JPA的规则,你就可以借助Spring Boot无比丰富的功能,娴熟地驾驶这台高性能的跑车,在属于你的程序世界里驰骋。
63 15
|
7月前
|
Java 数据库连接 测试技术
SpringBoot入门 - 添加内存数据库H2
SpringBoot入门 - 添加内存数据库H2
314 3
SpringBoot入门 - 添加内存数据库H2
|
2月前
|
SQL Java 编译器
深入理解 Spring Data JPA 的导入与使用:以 UserRepository为例
本文深入解析了 Spring Data JPA 中 `UserRepository` 的导入与使用。通过示例代码,详细说明了为何需要导入 `User` 实体类、`JpaRepository` 接口及 `@Repository` 注解。这些导入语句分别用于定义操作实体、提供数据库交互方法和标识数据访问组件。文章还探讨了未导入时的编译问题,并展示了实际应用场景,如用户保存、查询与删除操作。合理使用导入语句,可让代码更简洁高效,充分发挥 Spring Data JPA 的优势。
134 0
|
5月前
|
JavaScript NoSQL Java
基于SpringBoot+Vue实现的大学生就业服务平台设计与实现(系统源码+文档+数据库+部署等)
面向大学生毕业选题、开题、任务书、程序设计开发、论文辅导提供一站式服务。主要服务:程序设计开发、代码修改、成品部署、支持定制、论文辅导,助力毕设!
|
5月前
|
JavaScript NoSQL Java
基于SpringBoot+Vue的班级综合测评管理系统设计与实现(系统源码+文档+数据库+部署等)
✌免费选题、功能需求设计、任务书、开题报告、中期检查、程序功能实现、论文辅导、论文降重、答辩PPT辅导、会议视频一对一讲解代码等✌
|
5月前
|
JavaScript NoSQL Java
基于SpringBoot+Vue实现的大学生体质测试管理系统设计与实现(系统源码+文档+数据库+部署)
面向大学生毕业选题、开题、任务书、程序设计开发、论文辅导提供一站式服务。主要服务:程序设计开发、代码修改、成品部署、支持定制、论文辅导,助力毕设!
|
5月前
|
前端开发 Java 数据库连接
Java后端开发-使用springboot进行Mybatis连接数据库步骤
本文介绍了使用Java和IDEA进行数据库操作的详细步骤,涵盖从数据库准备到测试类编写及运行的全过程。主要内容包括: 1. **数据库准备**:创建数据库和表。 2. **查询数据库**:验证数据库是否可用。 3. **IDEA代码配置**:构建实体类并配置数据库连接。 4. **测试类编写**:编写并运行测试类以确保一切正常。
215 2
|
5月前
|
JavaScript NoSQL Java
基于SpringBoot+Vue实现的冬奥会科普平台设计与实现(系统源码+文档+数据库+部署)
面向大学生毕业选题、开题、任务书、程序设计开发、论文辅导提供一站式服务。主要服务:程序设计开发、代码修改、成品部署、支持定制、论文辅导,助力毕设!
|
7月前
|
Java 关系型数据库 数据库连接
使用 Spring Boot 执行数据库操作:全面指南
使用 Spring Boot 执行数据库操作:全面指南
818 1
|
7月前
|
Java 数据库连接 测试技术
SpringBoot入门(4) - 添加内存数据库H2
SpringBoot入门(4) - 添加内存数据库H2
139 4