您的位置:首页 > 编程语言 > Java开发

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

2016-12-02 19:31 477 查看
在web服务器中少不了的是与数据库打交道,这里我们采用的是MySQL数据库,也许你对于在spring中如何进行MySQL数据库配置非常熟悉,这里我们介绍一下如何在Spring
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.MYSQL5Dialect
1
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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: