背景
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类
@Entitypublic 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数据层接口 * */@Repositorypublic 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 里定义好的办法。
@Servicepublic 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语句, 还须要查问并学习。