背景
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 语句,还须要查问并学习。