hibernate 和 MyBatis 两者区别:
首先我们要知道,hibernate 与 MyBatis 都是持久层框架,都是用来连接数据库的,所以,不管是 Maven 项目还是 JAVA 项目,它都能用。而且都是 ORM 框架,也就是都可以把对象映射到数据库,也可以把数据库的表映射到对象,只不过 hibernate 比 MyBatis 更强大,强大到我们直接放对象, SQL 语句都不用写,但是 MyBatis 里面充满了 inset into ,select * 等等,所以,有一种说法叫 hibernate 是全自动,MyBatis 是半自动。
一,概述:
MyBatis 是一个支持普通 SQL 查询,存储过程和高级映射的优秀持久层框架。MyBatis 本是 apache 的一个开源项目 iBatis, 2010 年这个项目由 apache software foundation 迁移到了 google code(谷歌),并且改名为 MyBatis 。说白了,老版本叫 iBatis 新版本叫 MyBatis ,所以有的叫 SSM 或者 SSI 而已。 MyBatis 消除了几乎所有的 JDBC 代码和参数的手工设置(赋值操作)以及对结果集的检索封装(也就是说对结果集进行处理,通过反射将结果集封装成一个对象,说白了,也是对 jdbc 做了封装)。MyBatis 可以使 用简单的 XML 或注解用于配置和原始映射,将接口和 Java 的 POJO(Plain Old Java Objects, 普通的 Java 对象)映射成数据库中的记录。
注:只要是关系型数据库,发 SQL 的,那就绝大多数支持存储过程,存储过程你可以认为是多条 SQL 命令的一个组合,但是也有问题(弊端),就是在它迁移的时候,MySQL 存储过程只能在 MySQL 里面用,Oracle 只能在 Oracle 里面用,除非遇见复杂的,性能要求比较高的做存储过程。
二,MyBatis 的特点:
简单易学:小,jar 包就一个,没有第三方依赖
灵活:直接控制 SQL 语句
解除 sql 与程序代码的耦合:将代码与 SQL 分开,提高了可维护性
提供映射标签,支持对象与数据库的 orm 字段关系映射(对结果集封装)
提供 xml 标签,支持编写动态 sql。
Mybatis 与 Hibernate 对比:
Mybatis 优势:
① MyBatis 可以进行更为细致的 SQL 优化,可以减少查询字段。
② MyBatis 容易掌握,而 Hibernate 门槛较高。
Hibernate 优势:
① Hibernate 的 DAO 层开发比 MyBatis 简单,Mybatis 需要维护 SQL 和结果映射。
② Hibernate 对对象的维护和缓存要比 MyBatis 好,对增删改查的对象的维护要方便。
③ Hibernate 数据库移植性很好,MyBatis 的数据库移植性不好,不同的数据库需要写不 同 SQL。
④ Hibernate 有更好的二级缓存机制,可以使用第三方缓存。MyBatis 本身提供的缓存机 制不佳。
⑤ Hibernate 功能强大,数据库无关性好,O/R 映射能力强。
三,创建数据库表:
因为 MyBatis 不能根据实体类自动生成表结构所以需要手动到数据库中新建表。
注:虽然 MyBatis 不能给我们建表,但有人给它进行了封装,像 “票牛”这个技术团队,写了个 pndao ,大家有兴趣的查一下
那我们搭建一个配置文件:
①首先是 Pom.xml:
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.4.5</version>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.20</version>
</dependency>
②然后你需要在 resources 搭建一个 mybatis-conf.xml
--------以下直接覆盖之前的,全粘-------
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE configuration
PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
<environments default="development">
<environment id="development">
<transactionManager type="JDBC"/>
<dataSource type="POOLED">
//value内是驱动
<property name="driver" value="com.mysql.jdbc.Driver"/>
//url 后的 value 需要写:列如我的:
<property name="url" value="jdbc:mysql://localhost:3306/数据库名?useUnicode=true&characterEncoding=UTF8"/>
//username 为数据库用户名
<property name="username" value="root"/>
//password 为数据库密码
<property name="password" value="123"/>
</dataSource>
</environment>
</environments>
<mappers>
加载的Mapper.xml文件的路径
<mapper resource="mapper/StudentMapper.xml"/>
</mappers>
</configuration>
当然,我们需要写一个方法测试以下
在src 下的 java 目录下创建一个类,写一个方法,详细的写法如下:
然后在APP类的页面内点击鼠标右键找到 Run As 下的 Java Application
然后在控制台输出如下便完成了配置文件的基本搭建:
接下来配置映射文件:
先在数据库建张表,列如我的:
有了表肯定要有实体类,这是我的实体类:
因为映射是对接口的映射,所以我们需要写一个 Dao 的接口:
然后在 src 下的 resources 文件下创建一个文件夹 并创建一个 BranchMapper.xml 因为我们的实体类就叫做 Branch ,结构如下:
内容如下:
代码如下:
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<!-- namespace 写的是 Dao 接口的路径 -->
<mapper namespace="com.fh.dao.BranchDao">
<!-- id 是接口的名; resultType 是实体类的路径 -->
<select id="queryBranchs" resultType="com.fh.entity.Branch">
select * from t_branch
</select>
</mapper>
在 mybatis-conf.xml 里再配置映射:
代码如下:
<mappers>
<mapper resource="mapper/StudentMapper.xml"/>
</mappers>
然后还要在测试类中也要稍作改动:
然后按照之前的再运行一遍就能在控制台得到值了。。。
简略总结:
当我们获取 session 后,我们要用 BranchDao 这个接口里面的 queryBranchs ,所以调用 session.getMapper 就能拿到 BranchDao 里面对应的映射,找到 BranchMapper.xml 文件,它会根据 BranchMapper.xml 文件里面的 namespace 返回 BranchDao 的对象,所以接口不能实例化!但是又返回了一个对象,说明了用到代理设计模式和反射机制,它用反射机制给你生成了一个我们写的 BranchDao 这个接口的代理类,通过代理类来调用里面的 queryBranchs 方法,所以我们真正调用的已经是反射生成的代理类的对象然后调里面的方法。
注:在dao层还有一种写法
是直接将SQL语句写到上面的,这只是一种写法,写单表的还好说,一旦遇见稍微复杂的就乱了,所以,不推荐使用。