MyBatis 本是apache的一个开源项目iBatis, 2010年这个项目由apache software foundation 迁移到了google code,并且改名为MyBatis 。2013年11月迁移到Github。
iBATIS一词来源于“internet”和“abatis”的组合,是一个基于Java的持久层框架。iBATIS提供的持久层框架包括SQL Maps和Data Access Objects(DAO)。MyBatis是支持普通SQL查询,存储过程和高级映射的优秀持久层框架。MyBatis使用简单的XML或注解用于配置和原始映射,可将接口和Java的POJOs(Plan Old Java Objects,普通的Java对象)映射成数据库中的记录。
如果学习了Hibernate,你会发现它们非常相似,它们都让我们对数据库的访问变得简单。
MyBatis和Hibernate的优势对比
Mybatis优势
- MyBatis可以进行更为细致的SQL优化,可以减少查询字段。
- MyBatis容易掌握,而Hibernate门槛较高。
- Hibernate的DAO层开发比MyBatis简单,Mybatis需要维护SQL和结果映射。
- Hibernate对对象的维护和缓存要比MyBatis好,对增删改查的对象的维护要方便。
- Hibernate数据库移植性很好,MyBatis的数据库移植性不好,不同的数据库需要写不同SQL。
- Hibernate有更好的二级缓存机制,可以使用第三方缓存。MyBatis本身提供的缓存机制不佳。
接下来我们在Myeclipse中创建一个项目,了解如何使用MyBatis
一、准备好包,Myeclipse中没有MyBatis功能的支持,需要我们自己导入包
【mybatis】
mybatis-3.3.0.jar
【MYSQL驱动包】
mysql-connector-java-5.1.38-bin.jar
mybatis-3.3.0.jar
【MYSQL驱动包】
mysql-connector-java-5.1.38-bin.jar
二、在src文件夹中新建配置文件(名字自定义,比如Configuration.xml)
<!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Config 3.0//EN" "http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
<!-- 创建pojo类的别名 -->
<typeAliases>
<typeAlias alias="province" type="demo.model.Province" />
</typeAliases>
<environments default="development">
<environment id="development">
<!-- 配置事务管理和数据源 -->
<transactionManager type="JDBC" />
<dataSource type="POOLED">
<property name="driver" value="com.mysql.jdbc.Driver" />
<property name="url" value="jdbc:mysql://127.0.0.1:3306/news" />
<property name="username" value="root" />
<property name="password" value="" />
</dataSource>
</environment>
</environments>
<!-- 配置映射文件 -->
<mappers>
<mapper resource="demo/model/Province.xml" />
</mappers>
</configuration>
三、新建model类(对应hibernate的pojo类)
package demo.model;
public class Province {
private Integer id;
private String provinceId;
private String privince;
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getProvinceId() {
return provinceId;
}
public void setProvinceId(String provinceId) {
this.provinceId = provinceId;
}
public String getPrivince() {
return privince;
}
public void setPrivince(String privince) {
this.privince = privince;
}
@Override
public String toString() {
return "Province [id=" + id + ", provinceId=" + provinceId
+ ", privince=" + privince + "]";
}
}
四、为model类配置映射文件Province.xml
<?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,namespace的值习惯上设置成
包名+sql映射文件名,保证namespace的值是唯一的 -->
<mapper namespace="demo.mapper.ProvinceMapper">
<!--
select放置查询语句,id名唯一,调用这条sql语句用到,
parameterType属性指明查询时使用的参数类型,
resultType属性指明查询返回的结果集类型
-->
<select id="selectOne" parameterType="int" resultType="province">
select * from hat_province where id=#{id}
</select>
</mapper>
五、数据库创表
create database news;
use news;
create table hat_province(id int PRIMARY KEY AUTO_INCREMENT, provinceID varchar(20), province varchar(20));
insert into hat_province(provinceID,province) values('110000','北京市');
insert into hat_province(provinceID,province) values('120000','天津市');
insert into hat_province(provinceID,province) values('130000','河北市');
insert into hat_province(provinceID,province) values('140000','山西市');
insert into hat_province(provinceID,province) values('150000','山东市');
insert into hat_province(provinceID,province) values('160000','内蒙古自治区');
insert into hat_province(provinceID,province) values('170000','辽宁市');
六、配置sessionFactory类(生成session)
package demo.util;
import java.io.IOException;
import java.io.Reader;
import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
public class MyBatisUtil {
//session的工厂类
private static SqlSessionFactory factory;
//一个读取配置文件的reader
private static Reader reader;
//配置文件的路径
private static final String PATH = "Configuration.xml";
//创建一个管理session的线程管理者
private static ThreadLocal<SqlSession> threadLocal = new ThreadLocal<SqlSession>();
static {
try {
//读取配置文件
reader = Resources.getResourceAsReader(PATH);
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
//创建session工厂
factory = new SqlSessionFactoryBuilder().build(reader);
}
/**
* 创建一个session
* @return
*/
public static SqlSession getSession(){
SqlSession session = threadLocal.get();
if(session == null){
//通过session工厂类来创建一个session
session = factory.openSession();
threadLocal.set(session);
}
return session;
}
/**
* 关闭session
*/
public static void closeSession(){
SqlSession session = threadLocal.get();
threadLocal.set(null);
if(session!=null){
session.close();
}
}
}
七、测试,执行定义的sql语句
package demo.test;
import org.apache.ibatis.session.SqlSession;
import org.junit.Test;
import demo.model.Province;
import demo.util.MyBatisUtil;
public class MyBatisTest {
@Test
public void test(){
SqlSession session = MyBatisUtil.getSession();
//查询一条记录,第一个参数是映射文件中的namespace.id,第二个是sql语句的参数
Province p = session.selectOne("demo.mapper.ProvinceMapper.selOne", 3);
System.out.println(p);
}
}
结果