亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定

springData Jpa 快速入門

標簽:
SpringBoot

前言:

数据持久化的操作,一般都要由我们自己一步步的去编程实现,mybatis通过我们编写xml实现,hibernate也要配置对应的xml然后通过创建session执行crud操作。那么有没有这样一种技术,就是把底层的这些crud操作都封装好了,我们直接调用方法就行了,答案是有的,通过springData Jpa 就可以实现。点可下载本案例源码。

一、简介:

springData,显然也是spring家族的,data,顾名思义,它就是操作数据的一个框架。jpa,全称为Java persistence api,是用来管理java ee 或Java se环境中的持久化、以及对象关系映射的api,hibernate就是它的一个实现。当jpa遇上springData,就是见证奇迹的时候!它们俩在一起,dao层我们基本上无需再写代码,只需定义接口就可以了,一般的实现都不用我们写了,我们只需调用即可。

二、JPA核心概念:

1、实体:
实体表示关系数据库中的表,每个实体实例对应该表中的一条记录,实体类应该有标识其为实体的注解,还应该有唯一的对象标识符,简单主键或复合主键。

2、关系:
关系无外乎一下几种:
一对一:  @OneToOne
一对多:  @OneToMany
多对一:  @ManyToOne
多对多:  @ManyToMany

3、EntityManager:
这个就相当于hibernate的session、mybatis的sqlsessionFactory,定义用于与持久性上下文进行交互的方法。

三、springboot集成jpa案例:

本案例使用gradle构建,前端使用thymeleaf,数据库用到了H2和mysql,使用jpa完成crud操作。
1、添加依赖:
build.gradle:

buildscript {
    ext {
        springBootVersion = '1.5.2.RELEASE'
    }    //自定义版本
    ext['thymeleaf.version'] = '3.0.3.RELEASE'
    ext['thymeleaf-layout-dialect.version'] = '2.2.0'
    ext['hibernate.version'] = '5.2.8.Final'
    repositories {
        mavenCentral()
    }
    dependencies {
        classpath("org.springframework.boot:spring-boot-gradle-plugin:${springBootVersion}")
    }
}

apply plugin: 'java'apply plugin: 'eclipse'apply plugin: 'org.springframework.boot'apply plugin: 'io.spring.dependency-management'group = 'com.zhu'version = '0.0.1-SNAPSHOT'sourceCompatibility = 1.8repositories {
    mavenCentral()
}


dependencies {    //jpa依赖
    compile('org.springframework.boot:spring-boot-starter-data-jpa')
    compile('org.springframework.boot:spring-boot-starter-web')    //thymeleaf依赖
    compile('org.springframework.boot:spring-boot-starter-thymeleaf')    //mysql驱动
    compile('mysql:mysql-connector-java:6.0.5')    //H2数据库
    runtime('com.h2database:h2:1.4.193')
    testCompile('org.springframework.boot:spring-boot-starter-test')
}

2、配置thymeleaf、H2和jpa:
application.properties:

#thymeleaf相关配置spring.thymeleaf.encoding=UTF-8
spring.thymeleaf.cache=falsespring.thymeleaf.mode=HTML5#启用h2控制台spring.h2.console.enabled=true#jpa相关配置spring.jpa.show-sql=truespring.jpa.hibernate.ddl-auto=update

注意:
这里没有配置mysql,先演示H2数据库的用法;
spring.jpa.hibernate.ddl-auto的值有以下几个:
create       ----  每次运行该程序,没有表格会新建表格,表内有数据会清空;

create-drop  ----  每次程序结束的时候会清空表;

update  ----  每次运行程序,没有表格会新建表格,表内有数据不会清空,只会更新;

validate  ----  运行程序会校验数据与数据库的字段类型是否相同,不同会报错。
所以一般情况下用update就行了。

3、实体层:
User.java:

import javax.persistence.Entity;import javax.persistence.GeneratedValue;import javax.persistence.GenerationType;import javax.persistence.Id;@Entity // 标识这个类是实体public class User {    @Id // 标识主键
    @GeneratedValue(strategy=GenerationType.IDENTITY) //自增策略
    private Long id;    private String name;    private String email;
}

注意:
这里省略了set、get方法以及构造方法;
这样自动建表时表中字段与属性名一致,比如name属性对应数据库表中字段也是name,如果要自定义,可以用在属性上用@Column()注解;
表名默认与实体类名一致,可以在类上加@Table()注解来自定义。

4、dao层:
UserDao.java:

public interface UserDao extends CrudRepository<User, Long> {
}

注意:
第一:
这个就是简单的实现crud操作,所以继承CrudRepository即可,其它接口如下:
(1)、Repository:
标记型接口,表示任何继承它的类都是仓库接口类。
(2)、CrudRepository:
包含了10种crud方法。
(3)、PagingAndSortingRepository:
除了10中crud方法外,多了分页和排序。
(4)、JpaRepository:
比(3)又多了一些其他的常用方法。
所以在项目开发中继承JpaRepository就行了。

第二:
springData Jpa 还可以自定义方法,只要符合命名规范,就不用我们自己实现。比如要根据用户名和密码查询用户,就可以定义一个findByNameAndPwd()方法,直接调用就行,不需要自己实现。命名规范如下图:

webp

image.png


webp

image.png


第三:
其实这里取名UserDao不太好,daoData Access Objects的缩写,意思为数据访问对象,这里使用Jpa,根据命名规范应该叫做UserRepository,就像mybatis中应该叫做UserMapper一样。

第四:
jpa没有直接提供分页方法,若是要分页,请看下面的例子:
接口中的方法:

Page<User> findByAge(int age, Pageable pageable);

调用时:

 Pageable pageable = PageRequest.of(page,size);
 Page<User> result = UserRepository.findByAge(20,pageable);

上述代码表示分页查询age为20的的User。先要构建一个Pageable对象,传入分页信息,再把pageable对象传入查询方法中。

5、service层:
因为本案例service层并无其他逻辑,所以直接省略。

6、controller层:
UserController.java:

@RestController@RequestMapping("/users")public class UserController {    @Autowired
    private UserDao userDao;    /**
     * 查询所有用户
     * 
     * @param model
     * @return
     */
    @GetMapping
    public ModelAndView list(Model model) {
        model.addAttribute("userList", userDao.findAll());
        model.addAttribute("title", "用户管理");        return new ModelAndView("user/list", "userModel", model);
    }    /**
     * 根据id查询用户
     * 
     * @param id
     * @param model
     * @return
     */
    @GetMapping("{id}")    public ModelAndView view(@PathVariable("id") Long id, Model model) {
        User user = userDao.findOne(id);
        model.addAttribute("user", user);
        model.addAttribute("title", "查看用户");        return new ModelAndView("user/view", "userModel", model);
    }    /**
     * 获取创建表单页面
     * 
     * @param model
     * @return
     */
    @GetMapping("/form")    public ModelAndView createForm(Model model) {
        model.addAttribute("user", new User());
        model.addAttribute("title", "创建用户");        return new ModelAndView("user/form", "userModel", model);
    }    /**
     * 保存或更新用户
     * 
     * @param user
     * @return
     */
    @PostMapping
    public ModelAndView saveOrUpdateUser(User user) {
        user = userDao.save(user);        return new ModelAndView("redirect:/users");
    }    /**
     * 删除用户
     * 
     * @param id
     * @return
     */
    @GetMapping("/delete/{id}")    public ModelAndView delete(@PathVariable("id") Long id) {
        userDao.delete(id);        return new ModelAndView("redirect:/users");// 重定向到list页面
    }    /**
     * 获取修改用户的界面
     * 
     * @param id
     * @param model
     * @return
     */
    @GetMapping("/modify/{id}")    public ModelAndView modify(@PathVariable("id") Long id, Model model) {
        User user = userDao.findOne(id);
        model.addAttribute("user", user);
        model.addAttribute("title", "修改用户");        return new ModelAndView("user/form", "userModel", model);
    }

}



作者:贪挽懒月
链接:https://www.jianshu.com/p/70bcc3953d84


點擊查看更多內容
TA 點贊

若覺得本文不錯,就分享一下吧!

評論

作者其他優質文章

正在加載中
  • 推薦
  • 評論
  • 收藏
  • 共同學習,寫下你的評論
感謝您的支持,我會繼續努力的~
掃碼打賞,你說多少就多少
贊賞金額會直接到老師賬戶
支付方式
打開微信掃一掃,即可進行掃碼打賞哦
今天注冊有機會得

100積分直接送

付費專欄免費學

大額優惠券免費領

立即參與 放棄機會
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號

舉報

0/150
提交
取消