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

在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
  • 12
  • 13
  • 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;
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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值