上篇讲述了Spring Boot数据访问相关知识,这篇结合项目实战Spring Boot的数据连接,体会其强大与快捷性。
我们采用之前的简单项目demo,不了解的可跳转前往查看,跟随文章可 10分钟快速搭建 ( 之前文章:1分钟搭建、web开发
目前项目结构如下:
项目结构采用MVC的web目录结构,简单解释下:
domain层:这一层是用来管理javaBean实体对象的;
dao层:数据访问层,对数据库进行访问;
service层:业务逻辑层,通过调用dao层来对数据库进行访问;一般将接口 xxservice 与实现 xxserviceImpl 分开,便于代码阅读和管理。
controller层:Controller控制器,与界面进行交互,调用service层方法实现与底层交互
依赖引入与属性配置
Spring Boot提供多种数据库连接,我们这里选用mysql数据库。
在pom.xml中引入mysql依赖和hibernate依赖:
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<scope>runtime</scope>
</dependency>
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-validator</artifactId>
<version>5.2.4.Final</version>
</dependency>
在application.propertiex中配置自己本地的mysql数据库:
spring.datasource.url=jdbc:mysql://127.0.0.1:3306/demo?useUnicode=true&characterEncoding=UTF-8
spring.datasource.username=xxxxxx
spring.datasource.password=xxxxxx
spring.datasource.driver-class-name=com.mysql.jdbc.Driver
在本地mysql中建立库demo,建立表person,加入几条测试数据:
数据库数据Hibernate映射
-
hibernate可以帮助我们快速建立实体类,并通过注解进行关联。
菜单中选择Project Structure进行配置:
菜单 -
选择Modules-> add“+” -> Hibernate 进行添加:
hibernate注入 -
生成hibernate.cfg.xml配置文件:
生成xml配置文件 -
这时候IDEA左下角出现Persistence左侧快捷栏,点击选中项目demo,然后选择Generate Persistence Mapping -> By Database Schema,进行数据库中表到实体类的自动转换连接。
Persistence - 自动生成实体类 Person
自动生成实体类
Entity实体类
我们看到自动生成了实体类Person,代码如下:
package com.weber.demo.domain;
import javax.persistence.Basic;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.Id;
/**
* Created by weber on 2017/8/31.
*/
@Entity
public class Person {
private int id;
private String name;
private String sexy;
@Id
@Column(name = "id")
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
@Basic
@Column(name = "name")
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
@Basic
@Column(name = "sexy")
public String getSexy() {
return sexy;
}
public void setSexy(String sexy) {
this.sexy = sexy;
}
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
Person person = (Person) o;
if (id != person.id) return false;
if (name != null ? !name.equals(person.name) : person.name != null) return false;
if (sexy != null ? !sexy.equals(person.sexy) : person.sexy != null) return false;
return true;
}
@Override
public int hashCode() {
int result = id;
result = 31 * result + (name != null ? name.hashCode() : 0);
result = 31 * result + (sexy != null ? sexy.hashCode() : 0);
return result;
}
}
注解@Entity表明这是一个实体类,注解@Id表明主键,@Column表明与数据库表列一一对应,通过注解实现与数据库对应。
dao层Repository类:
这里给出的都是上一节中讲述过的示例方法,我们只使用一个作为展示:
package com.weber.demo.dao;
import com.weber.demo.domain.Person;
import org.springframework.data.jpa.domain.Specification;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.jpa.repository.JpaSpecificationExecutor;
import org.springframework.data.jpa.repository.Query;
import org.springframework.data.repository.query.Param;
import javax.persistence.criteria.CriteriaBuilder;
import javax.persistence.criteria.CriteriaQuery;
import javax.persistence.criteria.Predicate;
import javax.persistence.criteria.Root;
import java.util.List;
/**
* Created by weber on 2017/9/1.
*/
public interface PersonRepository extends JpaRepository<Person,Integer>,JpaSpecificationExecutor<Person> {
//按照性别计数
Long countBySexy(String sexy);
//按照id删除
void deleteById(int id);
//按照姓名和性别查询
List<Person> findByIdAndName(int id,String name);
//前10个此名的人
List<Person> findFirst10ByName(String name);
List<Person> findTop10ByName(String name);
@Query("select p from Person p where p.id=?1")
List<Person> findStudentById(int id);
@Query("select p from Person p where p.id=:stuId")
List<Person> findStudentByStuId(@Param("stuId")int stuId);
public static Specification<Person> personIsWeber(){
return new Specification<Person>() {
@Override
public Predicate toPredicate(Root<Person> root, CriteriaQuery<?> criteriaQuery, CriteriaBuilder criteriaBuilder) {
return criteriaBuilder.equal(root.get("name"),"weber");
}
};
}
List<Person> findByName(String name);
}
service层方法:
service接口:
package com.weber.demo.service;
import com.weber.demo.domain.Person;
import java.util.List;
/**
* Created by weber on 2017/9/8.
*/
public interface PersonService {
List<Person> findByName(String name);
}
i
其实现:
package com.weber.demo.service.Impl;
import com.weber.demo.dao.PersonRepository;
import com.weber.demo.domain.Person;
import com.weber.demo.service.PersonService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.util.List;
/**
* Created by weber on 2017/9/8.
*/
@Service
public class PersonServiceImpl implements PersonService {
@Autowired
PersonRepository personRepository;
@Override
public List<Person> findByName(String name) {
List<Person> people = personRepository.findByName(name);
return people;
}
}
Controller类:
调用Service的方法,这里简单执行一次查询,查到所有叫weber的人,并返回前端显示出来。
package com.weber.demo.controller;
import com.weber.demo.domain.Person;
import com.weber.demo.service.PersonService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.domain.Page;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;
import java.util.List;
/**
* Created by weber on 2017/8/31.
*/
@Controller
@RequestMapping("/")
public class PersonController {
@Autowired
private PersonService personService;
@RequestMapping("")
public String index(Model model) {
List<Person> people = personService.findByName("weber");
model.addAttribute("people", people);
return "index";
}
}
入口Application:
这里需要删掉之前的@EnableAutoConfiguration注解,使其能够正常调用数据库
package com.weber.demo;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
@SpringBootApplication
public class DemoApplication {
public static void main(String[] args) {
SpringApplication.run(DemoApplication.class, args);
}
}
启动项目
run demoapplicaiton,访问 http://localhost:8080/ 我们看到数据库中的一条数据已经被成功调用并展示到前端,效果如图:
前端显示效果小结
至此,我们已成功在demo中将数据库与后端,后端与前端连通。
- Hibernate可以让我们快速生成实体类,并添加到配置文件中自动与数据库对应。
- Spring Boot 中,Spring Data JPA 的使用,使得之前繁琐的查找操作变得非常快捷高效,可以轻松通过如:findByName的方法,自动在dao层生成查询语句,让其数据访问避免了繁琐的sql语句的问题。
- 沿用Spring MVC的分层结构进行web开发,目录结构清晰且便于有旧框架经验的人进行开发学习,起到了留其精华去其糟粕的作用。
网友评论