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

来源:互联网 发布:vb游戏代码大全 编辑:程序博客网 时间:2024/05/17 08:47

在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.Driverspring.datasource.url = jdbc:mysql://localhost:3306/testdbspring.datasource.username = rootspring.datasource.password = 123456#JPA Configuration:  spring.jpa.database=MySQLspring.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;@Transactionalpublic 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;@RestControllerpublic 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
原创粉丝点击