阅读本文前,请您先点击上面的蓝色字体,再点击“关注”,这样您就可以继续免费收到最新文章了。每天都有分享。完全是免费订阅,请放心关注。注:本文转载自网络,不代表本平台立场,仅供读者参考,著作权属归原创者所有。我们分享此文出于传播更多资讯之目的。如有侵权,请在后台留言联系我们进行删除,谢谢!

"

目录

  • ORM

  • Spring ORM

  • Spring ORM 同时集成JPA与Mybatis一、创建一个SpringBoot项目二、建立用户信息登记表三、Web应用项目集成mysql四、添加Spring Data JPA和Mybatis依赖五、添加数据表映射实体类六、创建数据接口层6.1 声明JPA接口6.2 声明MyBatis接口七、创建业务服务层八、创建控制器九、设计视图模板9.1 设计一个用户列表的视图模板9.2 设计一个提交用户信息的表单模板9.3 设计一个用户模糊查找页面模板十、运行应用10.1用户列表10.2增加用户10.3查找用户

ORM

  • ORM的出现,使得关系型数据库映射成了对象;简单来说,有了ORM之后,JAVA程序员从面向JDBC编程转化成面向JAVA对象编程。

Spring ORM

  • Spring对ORM的解决方案主要体现在以下方面:统一的资源管理方式与异常管理:Spring使用各种ORM框架,资源管理及使用方式都是统一的;同时Spring会将各个ORM框架的异常转移到Spring异常体系下。统一的事务管理:Spring通过IoC和AOP技术,形成了事务管理抽象层,接管了各种ORM框架下的数据访问的事务管理。

  • 随着版本的升级,Spring核心包中对ORM的各种解决方案也越来越精炼。本文我们重点将介绍同时集成Spring Data JPA和Mybatis两个ORM框架。

Spring ORM 同时集成JPA与Mybatis

  • 在同一个项目中一般只会单独集成Spring Data JPA,或者单独集成Mybatis。但两者也可以混合使用(一般没这个必要),本文为了更加深入探索Spring ,将通过一个DEMO应用两者的并展示相似点与不同之处。

一、创建一个SpringBoot项目

  1. 在IntelliJ IDEA中创建新项目

  2. 通过地址https://start.spring.io/初始化项目;

  3. 指定项目通用信息:

  4. 选择项目依赖Starter:

  5. 生成的项目结构:

二、建立用户信息登记表

  • 根据用户信息模型类,设计用户信息登录表

DROP DATABASE IF EXISTS user_info;

CREATE DATABASE user_infotDEFAULT CHARACTER SET utf8tDEFAULT COLLATE utf8_general_ci;

use user_info;

SET NAMES utf8mb4;SET FOREIGN_KEY_CHECKS = 0;

-- ------------------------------ Table structure for user-- ----------------------------DROP TABLE IF EXISTS `user`;CREATE TABLE `user`  (  `id` bigint(20) NOT NULL AUTO_INCREMENT,  `name` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL,  `email` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL,  PRIMARY KEY (`id`) USING BTREE) ENGINE = InnoDB CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = Dynamic;

SET FOREIGN_KEY_CHECKS = 1;

三、Web应用项目集成mysql

  • 增加依赖

 mysqlmysql-connector-java5.1.47runtime

com.alibabadruid-spring-boot-starter1.1.10
  • Spring数据源配置

###数据源配置spring:  datasource:    type: com.alibaba.druid.pool.DruidDataSource    username: root    password: root    driver-class-name: net.sf.log4jdbc.sql.jdbcapi.DriverSpy    url: jdbc:log4jdbc:mysql://localhost:3306/user_info?serverTimezone=Asia/Shanghai&characterEncoding=utf8&useSSL=false&allowPublicKeyRetrieval=true

四、添加Spring Data JPA和Mybatis依赖

ttorg.springframework.bootspring-boot-starter-data-jpa

org.mybatis.spring.bootmybatis-spring-boot-starter1.3.2

五、添加数据表映射实体类

/** * 用户类--映射表user * * @author zhuhuix */@Entity@Table(name="user_info")public class User implements Serializable {    // 用户id    @Id    @GeneratedValue(strategy = GenerationType.IDENTITY)    private Long id;    // 用户名    @NotBlank(message = "用户名称不能为空")    @Column(name="name")    private String name;    // 邮箱    @Column(name="email")    @Pattern(message ="邮箱格式不符", regexp = "^[A-Za-z0-9一-龥]+@[a-zA-Z0-9_-]+(.[a-zA-Z0-9_-]+)+$")    private String email;

    public User(Long id, String name, String email) {        this.id = id;        this.name = name;        this.email = email;    }

    public Long getId() {        return id;    }

    public void setId(Long id) {        this.id = id;    }

    public String getName() {        return name;    }

    public void setName(String name) {        this.name = name;    }

    public String getEmail() {        return email;    }

    public void setEmail(String email) {        this.email = email;    }}

六、创建数据接口层

6.1 声明JPA接口

  • 借助Spring Data JPA,我们可以通过继承CrudRepository接口,快速定义应用的数据层。CrudRepository定义并实现了很多用于crud(创建、读取、更新、删除)操作的方法,我们根本就不用编写实现类!当应用启动的时候,Spring Data JPA会在运行期自动生成实现类。

/** * 基于SpringMVC框架开发web应用--数据操作层 */public interface UserRepository extends CrudRepository {}
  • CrudRepository的一些默认实现

public interface CrudRepository extends Repository { S save(S var1); Iterable saveAll(Iterable var1);    Optional findById(ID var1);    boolean existsById(ID var1);    Iterable findAll();    Iterable findAllById(Iterable var1);    long count();    void deleteById(ID var1);    void delete(T var1);    void deleteAll(Iterable extends T> var1);    void deleteAll();}

6.2 声明MyBatis接口

  • 虽然强大的Spring Data JPA已经帮我们封装了多种数据操作,但由于业务逻辑的复杂度及自定义 SQL的需求,我们仍然可以运用MyBatis框架完成ORM的处理。

/** * mybatis数据层接口 * */@Repositorypublic interface UserMapper {

    // 自定义添加通过用户名称模糊查找用户信息    List findByName(String name);}
  • Mybatis Mapper映射

<?xml version="1.0" encoding="UTF-8" ?>br  />        PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"        "http://mybatis.org/dtd/mybatis-3-mapper.dtd">

t        select * from user where name like concat('%',#{name},'%')
  • Spring添加MyBatis配置
    修改application.yml配置文件:定位mapper文件扫描路径

#MyBatis扫描mapper文件配置mybatis:  mapper-locations: classpath:mapper/*Mapper.xml

  • 在启动类里加上注解用于给出需要扫描的mapper文件路径

@SpringBootApplication@MapperScan(basePackages = "com.example.demo.register")public class DemoApplication {

    public static void main(String[] args) {        SpringApplication.run(DemoApplication.class, args);    }}

七、创建业务服务层

  • 创建UserService服务层直接调用由Spring Data JPA及Mybatis接口各自提供的数据操作方法,以实现用户信息的增删改查。

/** * 调用Spring Data JPA和Mybatis接口进行业务处理 */@Servicepublic class UserService {

    // Spring Data JPA    @Autowired    private UserRepository userRepository;    // Mybatis    @Autowired    private UserMapper userMapper;

    // 返回所有的用户    public List listUsers() {        return (List) userRepository.findAll();    }    // 保存用户    public User saveUser(User user) {        return userRepository.save(user);    }    // 删除用户    public void deleteUser(Long id) {        userRepository.deleteById(id);    }    // 查找用户    public User findUser(Long id) {        return userRepository.findById(id).get();    }    // 根据名称查找用户--Mybatis    public List searchUser(String name) {        return userMapper.findByName(name);    }}

八、创建控制器

  • 控制器的主要职责是处理HTTP请求传递给视图以便于渲染浏览器展现。

  • SpirngMVC的请求注解

注解描述@RequestMapping通用的请求@GetMapping处理HTTP GET请示@PostMapping处理HTTP POST请示@PutMapping处理HTTP PUT请示@DeleteMapping处理HTTP DELETE请示

/** * 用户控制器 */@RestController@RequestMapping("/user")public class UserController {    @Autowired    private UserService userService;

    // 保存用户并返回到用户列表页面    @PostMapping    public ModelAndView saveUser(@Valid User user, Errors errors, Model model) {        if (errors.hasErrors()) {            model.addAttribute("user", user);            if (errors.getFieldError("name") != null) {                model.addAttribute("nameError", errors.getFieldError("name").getDefaultMessage());            }            if (errors.getFieldError("email") != null) {                model.addAttribute("emailError", errors.getFieldError("email").getDefaultMessage());            }            return new ModelAndView("register", "userModel", model);        }        userService.saveUser(user);        //重定向到list页面        return new ModelAndView("redirect:/user");    }

    // 获取用户操作表单页面    @GetMapping("/form")    public ModelAndView createForm(Model model, @RequestParam(defaultValue = "0") Long id) {        if (id > 0) {            model.addAttribute("user", userService.findUser(id));        } else {            model.addAttribute("user", new User());        }        return new ModelAndView("register", "userModel", model);    }

    // 获取用户列表显示页面    @GetMapping    public ModelAndView list(Model model) {        model.addAttribute("userList", userService.listUsers());        return new ModelAndView("userlist", "userModel", model);    }

    // 模糊查找输入页面    @GetMapping("/index")    public ModelAndView index(Model model) {        model.addAttribute("user", new User());        return new ModelAndView("index", "userModel", model);    }

    // 查找提交并跳转用户列表    @PostMapping("/search")    public ModelAndView search(@ModelAttribute User user, Model model) {        model.addAttribute("userList", userService.searchUser(user.getName()));        return new ModelAndView("userlist", "userModel", model);    }

    // 删除用户    @RequestMapping(path = "/del")    public ModelAndView del(@RequestParam(name = "id") Long id) {        userService.deleteUser(id);        return new ModelAndView("redirect:/user");    }}

九、设计视图模板

9.1 设计一个用户列表的视图模板

  • Thymeleaf提供了一个属性th:each,它会迭代一个元素集合,为集合中的每个条目渲染HTML,我们可以利用这个属性,设计出用户的列表视图。

      xmlns:layout="http://www.ultrag.net.nz/thymeleaf/layout">

用户列表

创建用户查找用户
ID 邮箱 名称 操作
没有用户信息!
修改 删除

9.2 设计一个提交用户信息的表单模板

  • 用户通过这个视图,录入名称与邮箱地址,提交保存新用户的信息。

      xmlns:layout="http://www.ultrag.net.nz/thymeleaf/layout">

登记用户

名称:
邮箱:

9.3 设计一个用户模糊查找页面模板



Title

查找用户

名称:

十、运行应用

  • 到目前为止,我们已经开发了User用户类、JPA数据接口、Mybatis数据接口、UserService用户服务类、UserController控制器、用户列表视图模板、用户登记视图模板、用户模糊查找页面模板,接下来我们尝试启动程序,并进行操作测试。

10.1用户列表

10.2增加用户

  • 点击页面上的创建用户,登记新用户,并提交

10.3查找用户

"

java 邮箱模板_Java:Spring同时集成JPA与Mybatis相关推荐

  1. spring jpa 多数据源_Spring同时集成JPA与Mybatis

    ORM ORM的出现,使得关系型数据库映射成了对象:简单来说,有了ORM之后,JAVA程序员从面向JDBC编程转化成面向JAVA对象编程. Spring ORM Spring对ORM的解决方案主要体现 ...

  2. Spring Boot集成JPA的Column注解命名字段无效的问题

    偶然发现,Spring Boot集成jpa编写实体类的时候,默认使用的命名策略是下划线分隔的字段命名. Spring Boot版本:1.5.4.release 数据表: id int, userNam ...

  3. Jpa第一话 -- Springboot集成Jpa和Mybatis以及Jpa的最全使用

    本文主要记录spring-boot-starter-data-jpa的详细使用. 在做一些小型无并发的项目时,说实话第一个想到的就是Jpa,一个Entity走天下. 1.Spring Jpa的使用 基 ...

  4. java beetl模板引擎_Spring Boot集成beetl模板引擎 个人总结

    1. Spring boot快速集成beetl模板引擎 查看官方文档:http://ibeetl.com/guide/#beetl 可参看官方文档 4.6. Spring Boot集成 增加beetl ...

  5. java注释模板_Java注释模板设置

    Java注释模板设置 eclipse中设置Java注释模板 eclipse设置注释模板的入口: Window->Preference->Java->Code Style->Co ...

  6. java邮件模板_java创建邮件模板

    一直在整发送邮件,由于发送的邮件格式比较固定,是一个固定的表格,我就想能不能做一个邮件的模板,这样在发送邮件的时候只需要将内容填充上去,而不需要像之前一样,每次都要重新拼邮件的内容. 下面先来看一下邮 ...

  7. java 持久化线程_java – Spring Hibernate Envers多线程 – 会话关...

    我们使用Hibernate(使用JPA)和Hibernate Envers来持久化对象的历史. Web应用程序运行许多线程,其中一些是通过其他应用程序的RMI方法调用创建的,其中一些是由应用程序本身创 ...

  8. java包含关系图_Java——Spring框架完整依赖关系图!再复习了解加工一下吧?

    因为spring-core依赖了commons-logging,而其他模块都依赖了spring-core,所以整个spring框架都依赖了commons-logging,如果有自己的日志实现如log4 ...

  9. java 微信模板_java开发微信模板消息推送

    概述 微信公众平台开始支持前端网页,大家可能看到很多网页上都有分享到朋友圈,关注微信等按钮,点击它们都会弹出一个窗口让你分享和关注,这个是怎么实现的呢?今天就给大家讲解下如何在微信公众平台前端网页上添 ...

  10. java邮箱发送_java邮箱发送报错

    展开全部 package com.gpt.util.email; import java.io.FileOutputStream; import java.util.List; import java ...

最新文章

  1. 「翻译」SAP零售预测和补货–简要概述
  2. web.py——运行错误【AttributeError: ‘StaticApp‘ object has no attribute ‘directory‘】
  3. oracle fnd file.log,OracleEBSWIP模块DebugLog收集方法
  4. ILP32和LP64数据模型
  5. PAT乙级 1013 数素数
  6. python2020未来前景_2020年Python发展前景如何呢?
  7. 【vue开发问题-解决方法】(五)vue Element UI 日期选择器获取日期格式问题 t.getTime is not a function
  8. python伪装浏览器https_Python3 伪装浏览器的方法示例
  9. Java集合——TreeMap源码详解
  10. linux将数字转为科学计数法,Linux下科学计数法(e)转化为数字的方法
  11. Mac教程——创建txt文件、设置新建txt的快捷键方法
  12. 用js把数字转化成为大写金额
  13. linux+3d建模软件,拿走不谢!10款最适合初学者和高级用户的3D设计软件
  14. 360浏览器如何设置默认极速模式
  15. 如何导出计算机硬盘重数据,硬盘对拷教程,100%保存原硬盘数据
  16. 第3章-2 查验身份证
  17. 使用ffmpeg合成哔哩哔哩m4s格式的音视频流为mp4
  18. 基于机器学习的车牌识别系统(Python实现基于SVM支持向量机的车牌分类)
  19. php 实现保留两位小数
  20. #c语言计算某年某月的天数

热门文章

  1. avalon2学习教程14动画使用
  2. Android Studio工程中添加移动广告平台广告条代码教程
  3. 查看系统端口是否被占用
  4. 关于session应用(2)--JAVA中怎么使用session
  5. LibSVM文本分类之结果统计
  6. FLASH缓动导航制作方法.
  7. 2月12 CNN结构特征+Faster R-CNN
  8. 查看anaconda环境下各个包的版本
  9. Android studio 的那些坑
  10. 【18.40%】【codeforces 631D】Messenger