Spring同时集成JPA与Mybatis

目录

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项目

在IntelliJ IDEA中创建新项目

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

指定项目通用信息:

选择项目依赖Starter:

生成的项目结构:

二、建立用户信息登记表

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

DROPDATABASEIFEXISTSuser_info;

CREATEDATABASEuser_info

DEFAULTCHARACTERSETutf8

DEFAULTCOLLATEutf8_general_ci;

useuser_info;

SETNAMESutf8mb4;

SETFOREIGN_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

增加依赖

mysql

mysql-connector-java

5.1.47

runtime

com.alibaba

druid-spring-boot-starter

1.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依赖

org.springframework.boot

spring-boot-starter-data-jpa

org.mybatis.spring.boot

mybatis-spring-boot-starter

1.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\\u4e00-\\u9fa5]+@[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应用--数据操作层

*/

publicinterfaceUserRepositoryextendsCrudRepository{

}

CrudRepository的一些默认实现

publicinterfaceCrudRepositoryextendsRepository{

Ssave(S var1);

IterablesaveAll(Iterable var1);

OptionalfindById(ID var1);

booleanexistsById(ID var1);

IterablefindAll();

IterablefindAllById(Iterable var1);

longcount();

voiddeleteById(ID var1);

voiddelete(T var1);

voiddeleteAll(Iterable var1);

voiddeleteAll();

}

6.2 声明MyBatis接口

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

/**

* mybatis数据层接口

*

*/

@Repository

publicinterfaceUserMapper {

// 自定义添加通过用户名称模糊查找用户信息

    List findByName(String name);


}

Mybatis Mapper映射

PUBLIC"-//mybatis.org//DTD Mapper 3.0//EN"

"http://mybatis.org/dtd/mybatis-3-mapper.dtd">

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 {publicstaticvoidmain(String[] args) {

SpringApplication.run(DemoApplication.class, args);

}}

七、创建业务服务层

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

/**

* 调用Spring Data JPA和Mybatis接口进行业务处理 */

@Service

public 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);

    }

}

加Q群:927953692   欢迎讨论交流,另外可免费领取一份(Java学习视频,技术文档,电子书籍,基础面试题)

八、创建控制器

控制器的主要职责是处理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查找用户

你可能感兴趣的:(Spring同时集成JPA与Mybatis)