关于springboot:Spring-Boot同时使用hibernate和mybatis

背景

web课的我的项目开发中, 有一项是用 mybatis 进行我的项目开发。

而目前的写好的后盾仓库层是用 hibernate 进行的全自动化。

为了满足实验报告要求, 决定用mybatis改一下目前的代码, 使这两个ORM框架共存。

hibernate和mybatis

两者都是ORM框架。 ORM全称是:Object Relational Mapping(对象关系映射)

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

目前最风行的次要有两个,一个是声称能够不必写一句 SQL 的 hibernate,一个是能够灵便调试动静 sql 的 mybatis。

两者区别

hibernate

hibernate 属于全自动的 ORM 框架,着力点在于 POJO 和数据库表之间的映射,实现映射即可主动生成和执行 sql。

Hibernate封装了很多有用的API给开发者,升高了操作数据库的难度和复杂度,但Hibernate留给开发者可操作的空间绝对Mybatis少了很多;

mybatis

mybatis 相对来说属于半自动的 ORM 框架,着力点在于 POJO 和 SQL 之间的映射,本人编写 sql 语句。

Mybatis框架应用起来很灵便,开发者能够自定义查问语句,但看起来没有Hibernate那么便捷。比方,须要编写mapper和xml文件。

两种框架在便捷与灵便两个指标上做出了取舍与斗争。

没有最好的框架, 适宜业务自身就是最好的框架。

为了学习mybatis, 以及练习sql语句的编写,这里引入mybatis.

pom.xml

增加Spring Data JPA和Mybatis依赖

<!-- JPA -->
  <dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-data-jpa</artifactId>
  </dependency>

<!-- mybatis-->
  <dependency>
    <groupId>org.mybatis.spring.boot</groupId>
    <artifactId>mybatis-spring-boot-starter</artifactId>
    <version>2.1.0</version>
  </dependency>

配置application.yml

spring:
  # hibernate 数据库 验证级别
  jpa:
    hibernate:
      ddl-auto: update
    show-sql: ${show-sql:false}
  # 配置数据源
  datasource:
    url: jdbc:mysql://${datasource.url:127.0.0.1}:${datasource.port:3306}/${datasource.dbname:equipment_management}?createDatabaseIfNotExist=true&useUnicode=true&characterEncoding=utf-8&allowPublicKeyRetrieval=true&useSSL=false&serverTimezone=Asia/Shanghai
    username: ${datasource.username:root}
    password: ${datasource.password:}

server:
  # 配置端口
  port: ${port:8002}
  servlet:
    session:
      timeout: 60m

# mybatis配置
mybatis:
  mapper-locations: classpath:mapper/*.xml    # mapper映射文件地位
  type-aliases-package: equipmentManagementSystem.entity    # 实体类所在的地位
  configuration:
    log-impl: org.apache.ibatis.logging.stdout.StdOutImpl   #用于控制台打印sql语句

建设Spring Data JPA的Entity类

@Entity
public class User implements Serializable {

    @Id
    @GeneratedValue(strategy= GenerationType.IDENTITY)
    private Long id;

    /**
     * 姓名
     */
    private String name;

    private String phone;

    /**
     * 明码
     */
    @Column(nullable = false)
    @JsonView(PasswordJsonView.class)
    private String password;

    /**
     * 用户名
     */
    @Column(nullable = false)
    private String username;

创立数据接口层

申明JPA接口

public interface UserRepository extends CrudRepository<User,Long> {

}

借助Spring Data JPA,咱们能够通过继承CrudRepository接口,疾速定义利用的数据层。CrudRepository定义并实现了很多用于crud(创立、读取、更新、删除)操作的办法,当利用启动的时候,Spring Data JPA会在运行期主动生成实现类。

CrudRepository的一些默认实现:

public interface CrudRepository<T, ID> extends Repository<T, ID> {
    <S extends T> S save(S var1);

    <S extends T> Iterable<S> saveAll(Iterable<S> var1);

    Optional<T> findById(ID var1);

    boolean existsById(ID var1);

    Iterable<T> findAll();

    Iterable<T> findAllById(Iterable<ID> var1);

    long count();

    void deleteById(ID var1);

    void delete(T var1);

    void deleteAll(Iterable<? extends T> var1);

    void deleteAll();
}

申明MyBatis接口

新建UserMapper接口

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

     List<User> findByName(String name);

    List<User> findAll();

    void deleteById(Long id);
}

新建UserMaper.xml文件

在resourse目录下,新建mapper文件夹,以及xml文件

留神和方才在 application.yml的地位统一

# mybatis配置
mybatis:
  mapper-locations: classpath:mapper/*.xml    # mapper映射文件地位
  type-aliases-package: equipmentManagementSystem.entity    # 实体类所在的地位
  configuration:
    log-impl: org.apache.ibatis.logging.stdout.StdOutImpl   #用于控制台打印sql语句

内容:

namespace: 命名空间, 惟一

留神各个操作的id, 须要和mapper里定义的办法名统一

resultType: 后果类型

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
        PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
        "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="equipmentManagementSystem.Mybatis.UserMapper">
    <!-- 留神id和mapper层定义的办法统一-->
    <select id="findByName" resultType="equipmentManagementSystem.entity.User">
        select * from user where name like concat('%',#{name},'%')
    </select>

    <select id="findAll" resultType="equipmentManagementSystem.entity.User">
        select * from user
    </select>

    <delete id="deleteById" parameterType="Long">
        delete from user where id=#{id}
    </delete>
</mapper>

新建配置类,退出对自定义Mapper的扫描注解

@MapperScan(basePackages = "equipmentManagementSystem.Mybatis")

参数是方才新建的mapper的地位

应用

想用 jpa 就用 userRepository,,

想用 mybatis 的话就用 userMapper 里定义好的办法。

@Service
public class UserServiceImpl implements UserService{

    @Autowired
    private UserMapper userMapper;

   @Autowired
   private final UserRepository userRepository;

    @Override
    public void delete(Long id) {
        this.userMapper.deleteById(id);
       // 或者 this.UserRepository.deleteById(id);
    }

    @Override
    public List<User> findAllUser() {
       List<User> users =  this.userMapper.findAll();
       // 或者 this.UserRepository.findAll();
      return users;
    }
}

总结

通过打断点测试, mapper和hibernate都运行良好。

示例的mapper里的办法还很简略, 没有加上非凡查问,以及resultMap等。
以及如何编写其余办法的sql语句, 还须要查问并学习。

【腾讯云】轻量 2核2G4M,首年65元

阿里云限时活动-云数据库 RDS MySQL  1核2G配置 1.88/月 速抢

本文由乐趣区整理发布,转载请注明出处,谢谢。

您可能还喜欢...

发表回复

您的电子邮箱地址不会被公开。 必填项已用*标注

此站点使用Akismet来减少垃圾评论。了解我们如何处理您的评论数据