简介 :
MyBatis 是比较优秀的持久层框架(DAO),支持SQL,存储过程以及高级映射
如 JDBC中 我们需要有繁琐的流程,和设置参数,并且获取结果集的时候也需要循环遍历,并且手动封装到实体类对象中
MyBatis避免了几乎所有的 JDBC代码和手动设置参数以及获取结果集
MyBatis可以使用简单XML或注解来配置和映射 接口和java的实体类
MyBatis 有两种用法
1 XML形式
2 注解
注解 : 方便,灵活,看上去也比较好看,但是需要代码和SQL在一起
如果 SQL比较复杂的话,注解就很吃力
XML : 把SQL语句存放到XML文件中,java代码会比较简洁干净,并且使用XML形式,写一些复杂的SQL的时候,比较方便,也能统一管理
所以一般情况,常用的是XML,可以做到SQL分离.有时候也混用,简单的就用注解,复杂的就用XML
与同样作为持久化层框架的Hibernate之间,最常见的问题,就是
MyBatis与Hibernate的区别
整体分析 :
MyBatis 不是一个完全ORM框架,什么是ORM?
ORM : Object Relational Mapping 对象关联映射
而Hibernate就是ORM框架
ORM就是将java中的类对象和数据库表关联映射起来
Hibernate : 相对MyBatis来说,Hibernate更加复杂沉重,它有QBC/QBE,SQL,HQL三种查询方式,也就意味着在SQL语句优化时会有一定困难
而学习MyBatis成本低于Hibernate很多,我们只需要掌握原生的SQL就可以,比较灵活,因为控制器在我们手里掌握,上手比较快
但是 在数据移植时,会比较麻烦,如将MySQL移植到oracle,那么sql会发生相应的变化
而hibernate不同,配置文件中可以指定数据库,会根据指定数据库自动生成对应的SQL语句
抽象区别 :
1 hibernate是全自动,而mybatis属于半自动
前者可以完全通过对象关系模型对数据库进行操作,拥有完整的JavaBean对象与数据库映射的结构来自动生成SQL
后者 仅有基本的字段映射,对象数据以及对象实际关系,仍然需要手动SQL完成管理
2 hibernate拥有完整的日子系统,mybatis欠缺一些
3 SQL直接优化上,mybatis要比hibernate方便很多
因为语句是自己写的,hibernate是自动生成
MyBatis :
1 入门快,即学即用,提供了数据库查询的自动对象绑定
2 可以进行更细致的SQL优化,可以,减少字段操作
3 缺点框架有些简陋,功能尚有缺失
4 二级缓存机制不是很好
小巧,方便,高效,简单,直接(SQL),半自动
Hibernate :
1 功能强大,数据库绑定性能比较好,对象关系(O/R)映射能力强
2 有更好的二级缓存机制,可以使用第三方缓存
3 缺点学习门槛高,要精通的门槛也高
6.使用场景
操作持久化层(Dao),和JDBC一样,操作数据库的
当我们要写动态页面(jsp)和用户进行交互的时候,就需要操作数据库,
而MyBatis就是负责操作数据库的
创建一个MyBatis项目,了解用法
我们以 用户和 地址 为例,比如淘宝,一个账号可以添加多个收货地址
所以 他们的关系应该是一对多,用户是1,地址是多
环境搭建
MyBatis开发环境
1 导包 mybatis-3.3.0.jar
2 数据库包 mysql-connector-java-5.1.38-bin.jar
3 配置文件 mybatis-config.xml
User.java
Address.java
添加MyBatis的配置文件 mybatis-config.xml
<?xml version="1.0" encoding="UTF-8" ?>Jdbc配置文件
Init.sql 因为要操作数据库,所以需要有示例数据
drop database IF exists test;
create database test;
use test;
create table t_user (
id int(11) primary key auto_increment,
username varchar(100),
password varchar(100),
nickname varchar(100),
type int(2)
);
create table t_address (
id int(11) primary key auto_increment,
addr varchar(100),
phone varchar(100),
postcode varchar(100),
user_id int (11),
constraint foreign key(user_id) references t_user(id)
);
insert into t_user (username , password , nickname , type) value (‘admin’,‘123’,‘帅气多汁社会你张老师’,1);
insert into t_address (addr , phone , postcode , user_id) value (‘石家庄’,‘123’,‘111’,1);
然后创建对应的User.xml
<?xml version="1.0" encoding="UTF-8" ?><insert id="add" parameterType="User">
<!-- #{username} 等于是用 ? 的方式进行的设置,
等方法调用的时候,会传递一个 参数,就会自动映射到对象的username属性,设置?的值-->
insert into t_user(username,password,nickname,type)
values(#{username},#{password},#{nickname},#{type});
</insert>
写完SQL语句之后,测试是否成功,如何使用
创建test,并创建类TestMyBatisDao.java
并导入Junit包
测试结果
功能没问题了,但是控制台什么都没有打印,没有一个日志记录
比如说,我想看一下执行的SQL,
这时候 就需要 log4j
1 导包 log4j-1.2.17.jar
2 log4j.properties 配置文件
再运行测试
Sql语句和 参数值 都会显示
基本环节测试没问题之后,测试一下mapper的三种形式
先创建IUserDao.java接口
一般我们的User.xml中,不会写对应的实体类的名字
1 首先 User.xml 应该和dao的方法功能对应
2 既然和DAO对应,方法也应该对象,dao的方法名,和 xml中的id的值
3 如果两者都是对应的话,可以用另外一种调用方式
更改User.xml
然后去弄测试,查看怎么调用使用
数据也会被插入到数据库中,但是容易拼错,字符串太长,所以我们可以用getName()代替
这样就不容易拼错了
依旧没问题
看另外一种调用方式
依然没有问题
这个时候,调用的add()方法 其实是IUserDao中声明的add()方法
但是 实际执行的,是User.xml中的 id为add的方法
想要这样使用,id的值 必须和IUserDao中的方法的名字一致才行
测试另外一种方式,注解
首先 mybatis-config.xml 配置文件中的xml映射 需要更改 , 因为注解形式不需要xml文件
但是 需要告诉mybatis 你的注解加在哪个类上面
然后去IUserDao中加入对应的注解
然后运行测试
依然没有问题
7.总结
MyBatis环境搭建流程
1 导包,因为需要操作数据库,所以数据库包也需要有
2 默认执行的时候,控制台没有任何日志记录操作,所以我们需要导入对应的日志包
3 日志对应的配置文件
log4j.properties
4 MyBatis的配置文件
mybatis-config.xml
5 如果不想把数据库配置,直接写死在mybatis-config.xml 配置文件中,就需要手动指定一个配置文件
创建jdbc.properties文件
手动指定
注意 :
这里的名字 需要和 jdbc.properties文件 的属性名字一致
6 编写每个dao对应的xml文件
User.xml
7 调用 6 步