美文网首页程序员Spring-BootSpring Boot
Spring Boot总结(6)---数据连接Web实战

Spring Boot总结(6)---数据连接Web实战

作者: 18587a1108f1 | 来源:发表于2017-09-08 11:12 被阅读453次

上篇讲述了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&amp;characterEncoding=UTF-8
spring.datasource.username=xxxxxx
spring.datasource.password=xxxxxx
spring.datasource.driver-class-name=com.mysql.jdbc.Driver

在本地mysql中建立库demo,建立表person,加入几条测试数据:

数据库数据

Hibernate映射

  1. hibernate可以帮助我们快速建立实体类,并通过注解进行关联。
    菜单中选择Project Structure进行配置:


    菜单
  2. 选择Modules-> add“+” -> Hibernate 进行添加:


    hibernate注入
  3. 生成hibernate.cfg.xml配置文件:


    生成xml配置文件
  4. 这时候IDEA左下角出现Persistence左侧快捷栏,点击选中项目demo,然后选择Generate Persistence Mapping -> By Database Schema,进行数据库中表到实体类的自动转换连接。


    Persistence
  5. 自动生成实体类 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开发,目录结构清晰且便于有旧框架经验的人进行开发学习,起到了留其精华去其糟粕的作用。

相关文章

网友评论

    本文标题:Spring Boot总结(6)---数据连接Web实战

    本文链接:https://www.haomeiwen.com/subject/hlkgjxtx.html