Spring Boot 学习第二步 配置MySQL数据库+JPA

xiaoxiao2021-02-28  92

Spring Boot 学习第二步 配置MySQL数据库+JPA

标签: springmysqlmavenjpa   11860人阅读  评论(1)  收藏  举报   分类: Spring Boot(2) 

目录(?)[+]

在web服务器中少不了的是与数据库打交道,这里我们采用的是MySQL数据库,也许你对于在spring中如何进行mysql数据库配置非常熟悉,这里我们介绍一下如何在Spring Boot环境下配置,并感受一下它的优越性。

Maven pom.xml文件的配置

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

application.properties配置文件

如果看过Spring Boot学习第一步(配置环境)的话,就会发现整个工程里面是找不到application.properties这个配置文件的,所以我们要做的就是在src/main/resources这个文件夹下面新建一个application.properties,并把相应的配置代码写进去。

#DB Configuration: spring.datasource.driverClassName = com.mysql.jdbc.Driver spring.datasource.url = jdbc:mysql://localhost:3306/testdb spring.datasource.username = root spring.datasource.password = 123456 #JPA Configuration: spring.jpa.database=MySQL spring.jpa.show-sql=true spring.jpa.generate-ddl=true spring.jpa.hibernate.ddl-auto=update #spring.jpa.database-platform=org.hibernate.dialect.MySQL5Dialect spring.jpa.hibernate.naming_strategy=org.hibernate.cfg.ImprovedNamingStrategy #spring.jpa.database=org.hibernate.dialect.MySQL5InnoDBDialect #spring.jpa.properties.hibernate.dialect=org.hibernate.dialect.MYSQL5Dialect 123456789101112131415 123456789101112131415

编写Model里面的UserLogin.java

package cn.springboot.SpringBootFirst.model; import javax.persistence.Column; import javax.persistence.Entity; import javax.persistence.GeneratedValue; import javax.persistence.GenerationType; import javax.persistence.Id; import javax.persistence.Table; import javax.validation.constraints.NotNull; @Entity @Table(name="logintable") public class UserLogin { @Id @NotNull @GeneratedValue(strategy = GenerationType.AUTO) private long id; @NotNull @Column(name="login_name") private String loginName; @NotNull @Column(name="login_password") private String loginPassword; public UserLogin(){} public UserLogin(String a, String b){ this.loginName = a; this.loginPassword = b; } //Getter and Setter } 123456789101112131415161718192021222324252627282930313233343536 123456789101112131415161718192021222324252627282930313233343536

这个实体类是与数据库中的表进行一一对应的,在这个实体类的编写上面有很多需要注意的地方:  1:要知道什么能少,什么不能少 比如@Id就不能少

错误1:com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException: Unknown column ‘userlogin0_.login_name’ in ‘field list’  新手一般会犯上面的错误:经过多番尝试,发现jpa会有很多的命名规范,第一点就是对于MySQL数据库中的属性的大小写有要求。在MySQL数据库中,如果属性名中包含大写字母就会出这个错,比如loginName但是如果全是小写字母如username 或者 user_name就没有这个错误。

编写DAO里面的 UserLoginDao.java

package cn.springboot.SpringBootFirst.dao; import javax.transaction.Transactional; import org.springframework.data.repository.CrudRepository; import cn.springboot.SpringBootFirst.model.UserLogin; @Transactional public interface UserLoginDao extends CrudRepository<UserLogin, Long>{ UserLogin findByloginName(String loginName); } 1234567891011 1234567891011

看完上面的Dao中的代码,就会发现函数体里面异常简单,找不到丝毫的持久层应该出现的代码。这就是Spring Date Repository所做的事情。那下面我们就来简单的学习一下Spring Data Repository的相关知识(当然最后的目的是学好JAP)。

持久层代码的如何编写:通常我们会在持久层声明一个接口(如上面代码中的interface UserLoginDao),然后让该接口来继承接口Repository(此接口是Spring Data JPA)中最为核心的接口,但是它只是一个标记型接口,其中包含任何方法,当然如果有需要,Spring Data也提供了很多它的子接口,其中封装了常用的增删改查和分页相关的方法。

正如上面我的代码中所写的那样,我实现的是CrudRepository接口。  如果持久层接口较多,且每一个接口都需要声明相似的增删改查方法,直接继承 Repository 就显得有些啰嗦,这时可以继承CrudRepository,它会自动为域对象创建增删改查方法,供业务层直接使用。开发者只是多写了 “Crud” 四个字母,即刻便为域对象提供了开箱即用的十个增删改查方法。

但是,使用 CrudRepository也有副作用,它可能暴露了你不希望暴露给业务层的方法。比如某些接口你只希望提供增加的操作而不希望提供删除的方法。针对这种情况,开发者只能退回到 Repository 接口,然后到 CrudRepository 中把希望保留的方法声明复制到自定义的接口中即可。分页查询和排序是持久层常用的功能,Spring Data 为此提供了 PagingAndSortingRepository 接口,它继承自 CrudRepository 接口,在 CrudRepository 基础上新增了两个与分页有关的方法。但是,我们很少会将自定义的持久层接口直接继承自 PagingAndSortingRepository,而是在继承 Repository 或 CrudRepository 的基础上,在自己声明的方法参数列表最后增加一个 Pageable 或 Sort 类型的参数,用于指定分页或排序信息即可,这比直接使用 PagingAndSortingRepository 提供了更大的灵活性。

JpaRepository 是继承自 PagingAndSortingRepository 的针对 JPA 技术提供的接口,它在父接口的基础上,提供了其他一些方法,比如 flush(),saveAndFlush(),deleteInBatch() 等。如果有这样的需求,则可以继承该接口。

上述四个接口,开发者到底该如何选择?其实依据很简单,根据具体的业务需求,选择其中之一。笔者建议在通常情况下优先选择 Repository 接口。因为 Repository 接口已经能满足日常需求,其他接口能做到的在 Repository 中也能做到,彼此之间并不存在功能强弱的问题。只是 Repository 需要显示声明需要的方法,而其他则可能已经提供了相关的方法,不需要再显式声明,但如果对 Spring Data JPA 不熟悉,别人在检视代码或者接手相关代码时会有疑惑,他们不明白为什么明明在持久层接口中声明了三个方法,而在业务层使用该接口时,却发现有七八个方法可用,从这个角度而言,应该优先考虑使用 Repository 接口。

编写Controller中的UserLoginController.java

package cn.springboot.SpringBootFirst.controller; import java.util.Iterator; import javax.annotation.Resource; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.ResponseBody; import org.springframework.web.bind.annotation.RestController; import cn.springboot.SpringBootFirst.model.UserLogin; import cn.springboot.SpringBootFirst.dao.UserLoginDao; @RestController public class UserLoginController { @Resource UserLoginDao userLoginDAO; @RequestMapping("/userLogin") @ResponseBody public String login(String userName, String password){ UserLogin ul = userLoginDAO.findByloginName(userName); /*String result = ""; Iterable<UserLogin> it = userLoginDAO.findAll(); for(UserLogin ul:it){ result += ul.getLogin_name(); }*/ if(ul==null) { return "Login Error"; } else { return ul.getLoginName()+" "+ul.getLoginPassword(); } //return result; } } 123456789101112131415161718192021222324252627282930313233343536373839404142 123456789101112131415161718192021222324252627282930313233343536373839404142

最后在浏览器中输入:http://localhost:8080/userLogin?userName=wang&password=123456

转载请注明原文地址: https://www.6miu.com/read-53547.html

最新回复(0)