Spring Boot 学习第二步 配置MySQL数据库+JPA
2016-12-02 19:31
477 查看
在web服务器中少不了的是与数据库打交道,这里我们采用的是MySQL数据库,也许你对于在spring中如何进行MySQL数据库配置非常熟悉,这里我们介绍一下如何在Spring
Boot环境下配置,并感受一下它的优越性。
2
3
4
1
2
3
4
如果看过Spring Boot学习第一步(配置环境)的话,就会发现整个工程里面是找不到application.properties这个配置文件的,所以我们要做的就是在src/main/resources这个文件夹下面新建一个application.properties,并把相应的配置代码写进去。
2
3
4
5
6
7
8
9
10
11
12
13
14
15
1
2
3
4
5
6
7
8
9
10
11
1213
14
15
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
这个实体类是与数据库中的表进行一一对应的,在这个实体类的编写上面有很多需要注意的地方:
1:要知道什么能少,什么不能少 比如@Id就不能少
错误1:com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException: Unknown column ‘userlogin0_.login_name’ in ‘field list’
新手一般会犯上面的错误:经过多番尝试,发现jpa会有很多的命名规范,第一点就是对于MySQL数据库中的属性的大小写有要求。在MySQL数据库中,如果属性名中包含大写字母就会出这个错,比如loginName但是如果全是小写字母如username 或者 user_name就没有这个错误。
2
3
4
5
6
7
8
9
10
11
1
2
3
4
5
6
7
8
9
10
11
看完上面的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 接口。
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
最后在浏览器中输入:http://localhost:8080/userLogin?userName=wang&password=123456
Boot环境下配置,并感受一下它的优越性。
Maven pom.xml文件的配置
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-jpa</artifactId> </dependency>1
2
3
4
1
2
3
4
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.MYSQL5Dialect1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
1
2
3
4
5
6
7
8
9
10
11
1213
14
15
编写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 }1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
这个实体类是与数据库中的表进行一一对应的,在这个实体类的编写上面有很多需要注意的地方:
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); }1
2
3
4
5
6
7
8
9
10
11
1
2
3
4
5
6
7
8
9
10
11
看完上面的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; d218 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; } }1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
最后在浏览器中输入:http://localhost:8080/userLogin?userName=wang&password=123456
相关文章推荐
- spring cloud学习第二步:spring boot配置mybatis
- spring boot 学习--07---配置文件处理-02
- SpringBoot学习(4) 配置log4j2
- SpringBoot学习笔记(3) Spring Boot 运行原理,自动配置
- SpringBoot学习2之配置文件
- Spring Boot 学习31--Spring Boot导入XML配置
- SpringBoot学习笔记(5) Spring Boot集成Redis实现自动配置
- SpringBoot学习——使用logback配置日志
- Spring的配置相关知识(学习spring boot的预备知识)
- Spring Boot学习总结(6)——SpringBoot解决ajax跨域请求问题的配置
- Spring Boot 学习18--配置ContextPath
- Spring Boot 基础知识学习(二)——配置文件多环境配置
- spring boot 学习(四)Druid连接池的使用配置
- SpringBoot学习笔记(四) SpringBoot Web相关的自动配置
- spring boot 学习--06---常用配置文件
- SpringBoot学习(3) 配置MyBatis
- SpringBoot学习-第二章 常用配置方式-<Spring Boot 实战>
- Spring Boot学习笔记-项目属性的简单配置
- Spring Boot学习笔记-零xml配置jpa
- Spring Boot 学习笔记(五) 配置Servlet容器