1. MyBatis介绍及基本环境搭建
1.1 MyBatis介绍:
MyBatis 世界上流行最广泛的基于SQL语句的ORM框架,由Clinton Begin 在2002 年创建,其后,捐献给了Apache基金会,成立了iBatis 项目。2010 年5 月,将代码库迁致Google Code,并更名为MyBatis。
1.2 与Hibernate比较
a. 学习成本:MyBatis简单易学(特别是有SQL语法基础的人),较接近JDBC
b. 程序灵活性:MyBatis直接使用SQL,灵活性高
c. 程序执行效律:MyBatis效律高
d. 可移植性:hibernate较好(与数据库关联在配置中完成,HQL语句与数据库无关)
1.3 适用场合
MyBatis是一个灵活的DAO层解决方案,满足较高的性能要求,可以在很多场合使用,但一般以下场合不建议使用:
- 需要支持多种数据库或数据库有移植要求
- 完全动态SQL,例如:字段都要动态生成
- 使用的不是关系型数据库
1.4 开发步骤(推荐)
新建JAVA项目或WEB项目
部署jar包(包括数据库驱动包):使用MyBatis需要先下载jar包:下载地址http://code.google.com/p/mybatis
编写主配置文件
创建数据库及表(如已创建,可省略)
创建实体类及SQL映射文件
编写数据库接口及实现
编写测试类及测试
1.5 开发示例
1.5.1 新建项目
新建java项目或web 项目。
1.5.2 导入JAR包
导入mybatis和数据库驱动包、日志包。
![](https://img.haomeiwen.com/i16823531/2c49890ec818b847.png)
1.5.3 创建数据库
![](https://img.haomeiwen.com/i16823531/76bb87c2556dee87.png)
drop database if exists mybatis;
create database mybatis CHARACTER SET UTF8;
use mybatis;
create table dept(
dept_id int primary key auto_increment,
dept_name varchar(50),
dept_address varchar(50)
);
insert into dept(dept_name,dept_address) values('研发部一部','北京');
insert into dept(dept_name,dept_address) values('研发部二部','上海');
insert into dept(dept_name,dept_address) values('研发部三部','广州');
select * from dept;
1.5.4 创建实体类:Dept.java
package com.demo.entity;
public class Dept {
private Integer deptId; //部门编号
private String deptName;//部门名称
private String deptAddress;//部门地址
public Integer getDeptId() {
return deptId;
}
public void setDeptId(Integer deptId) {
this.deptId = deptId;
}
public String getDeptName() {
return deptName;
}
public void setDeptName(String deptName) {
this.deptName = deptName;
}
public String getDeptAddress() {
return deptAddress;
}
public void setDeptAddress(String deptAddress) {
this.deptAddress = deptAddress;
}
@Override
public String toString() {
return "Dept [deptId=" + deptId + ", deptName=" + deptName
+ ", deptAddress=" + deptAddress + "]";
}
}
1.5.5 创建config.xml
在src下,创建mybatis配置文件,导入,可以参考mybatis用户手册
![](https://img.haomeiwen.com/i16823531/85e7615ec90f541a.png)
配置文件信息如下:
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configuration PUBLIC "-//[mybatis.org//DTD](http://mybatis.org//DTD) Config 3.0//EN"
"[http://mybatis.org/dtd/mybatis-3-config.dtd](http://mybatis.org/dtd/mybatis-3-config.dtd)">
<configuration>
<!-- 引用db.properties配置文件 -->
<properties resource="db.properties"/>
<!--environments指定数据源环境,default指的是使用哪个数据源 -->
<environments default="development">
<!--environment定义数据源的信息 -->
<environment id="development">
<!-- type="JDBC"表示事务由jdbc连接管理,type="MANAGED"表示事务由容器来管理 -->
<transactionManager type="JDBC" />
<!-- type="POOLED"表示使用连接池, type="UNPOOLED"表示不使用连接池 -->
<dataSource type="POOLED">
<property name="driver" value="com.mysql.jdbc.Driver" />
<!-- 如果数据库设置为UTF-8,则URL参数连接需要添加?useUnicode=true&characterEncoding=UTF-8,如下 -->
<property name="url" value="jdbc:mysql://localhost:3306/mybatis?useUnicode=true&characterEncoding=UTF-8" />
<property name="username" value="root" />
<property name="password" value="" />
</dataSource>
</environment>
</environments>
</configuration>
写xml文件需要对一些字符进行转义:
下面是五个在 XML 文档中预定义好的转义实体:
< < 小于号
> > 大于号
& &
' ' 单引号
" " 双引号
小于等于“<=”,其转义为:<=
大小等于“>=”,转义为:>=
使用 CDATA 部件
CDATA 部件以"<![CDATA[" 标记开始,以"]]>"标记结束。在"<![CDATA["和"]]>"之间 的特殊字符的意义都不起作用,而转变为普通字符串内容。
在 MyBatis 的 XML 映射语句配置文件中,如果 SQL 语句有特殊字符,使用CDTA 部件括起来,如:
<select id= "selectBlog_use_collection" resultMap= "blogResult" >
<![CDATA[ SELECT id , title, author_id as authored FROM BLOG WHERE ID > 0 and ID < 10 ]]>
</select>
1.5.6 创建SQL映射文件及修改主配置文件
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper PUBLIC "-//[mybatis.org//DTD](http://mybatis.org//DTD) Mapper 3.0//EN" "[http://mybatis.org/dtd/mybatis-3-mapper.dtd](http://mybatis.org/dtd/mybatis-3-mapper.dtd)">
<!-- 命名空间可以任选命名,但最好要定义一定规则,便于后继的使用 -->
<mapper namespace="com.demo.entity.DeptMapper">
<!-- type指定的是对应的实体类 -->
<resultMap type="com.demo.entity.Dept" id="deptResultMap">
<!-- id用来配置表的主键与类的属性的映射关系 ,column指定的是表的字段名; property指定的是类的属性名-->
<id column="dept_id" property="deptId"/>
<!-- result用来配置 普通字段与类的属性的映射关系 ,column指定的是表的字段名; property指定的是类的属性名-->
<result column="dept_name" property="deptName"/>
<result column="dept_address" property="deptAddress"/>
</resultMap>
</mapper>
修改config.xml,加入映射文件信息
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configuration PUBLIC "-//[mybatis.org//DTD](http://mybatis.org//DTD) Config 3.0//EN"
"[http://mybatis.org/dtd/mybatis-3-config.dtd](http://mybatis.org/dtd/mybatis-3-config.dtd)">
<configuration>
<environments default="development">
…………
</environments>
<mappers>
<mapper resource="com/demo/mapping/DeptMapper.xml" />
</mappers>
</configuration>
1.5.7 编写数据库操作
包括操作接口及实现,接口略,实现类为:DeptDaoImpl.java
package com.demo.dao.imp;
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;
import com.demo.entity.Dept;
public class DeptDaoImpl {
/**
* 用于插入数据到dept表。
* @param dept 部门信息
* @return 表示受影响的行数
*/
public int insert(Dept dept){
/*
* 1.读取配置信息
* 2.构建session工厂
* 3.创建session
* 4.启动事务(可选)
* 5.数据处理
* 6.提交事务、回滚事务(可选)
* 7.关闭session
*/
int i=0;
SqlSession session = null;
String config="config.xml";
Reader reader = null;
try {
reader = Resources.getResourceAsReader(config);
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(reader);
session=sqlSessionFactory.openSession();
//事务默认自动启动
//SQL映射文件定义的命名空间+SQL语句的ID定位SQL语句,例如下的:cn.itcast.entity.DeptMapper.insert
i=session.insert("com.demo.entity.DeptMapper.insert",dept);
session.commit();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
session.rollback();
}finally{
//关闭reader对象,这里略
session.close();
}
return i;
}
}
1.5.8 编写测试类
需要导入junit包
![](https://img.haomeiwen.com/i16823531/7c21e00f3bca0a24.png)
![](https://img.haomeiwen.com/i16823531/c87fe76436a2e23a.png)
![](https://img.haomeiwen.com/i16823531/cc6d6cd2be43b577.png)
在 DeptMapper.xml添加sql语句
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper PUBLIC "-//[mybatis.org//DTD](http://mybatis.org//DTD) Mapper 3.0//EN" "[http://mybatis.org/dtd/mybatis-3-mapper.dtd](http://mybatis.org/dtd/mybatis-3-mapper.dtd)">
<!-- 命名空间可以任选命名,但最好要定义一定规则,便于后继的使用 -->
<mapper namespace="com.demo.entity.DeptMapper">
<!-- type指定的是对应的实体类 -->
<resultMap type="com.demo.entity.Dept" id="deptResultMap">
<!-- id用来配置表的主键与类的属性的映射关系 ,column指定的是表的字段名; property指定的是类的属性名-->
<id column="dept_id" property="deptId"/>
<!-- result用来配置 普通字段与类的属性的映射关系 ,column指定的是表的字段名; property指定的是类的属性名-->
<result column="dept_name" property="deptName"/>
<result column="dept_address" property="deptAddress"/>
</resultMap>
<!-- 定义插入的sql语句,通过命名空间+id方式被定位 -->
<insert id="insert" parameterType="com.demo.entity.Dept">
insert into dept(dept_name,dept_address) values(#{deptName},#{deptAddress});
</insert>
</mapper>
测试类,DeptTest.java
package com.demo.test;
import org.junit.AfterClass;
import org.junit.BeforeClass;
import org.junit.Test;
import com.demo.dao.imp.DeptDaoImpl;
import com.demo.entity.Dept;
public class DeptTest {
private static DeptDaoImpl deptDaoImpl;
@BeforeClass
public static void setUpBeforeClass() throws Exception {
//在整个类初始化之后调用,一般用来做测试准备工作
deptDaoImpl = new DeptDaoImpl();
}
@AfterClass
public static void tearDownAfterClass() throws Exception {
//在整个类结束之前调用,一般作测试的清理工作
deptDaoImpl = null;
}
@Test
public void test() {
Dept dept=new Dept();
dept.setDeptName("市场部");
dept.setDeptAddress("沈阳");
int i=deptDaoImpl.insert(dept);
System.out.println("受影响行数:"+i);
}
}
运行效果:
![](https://img.haomeiwen.com/i16823531/52a4fa2ccd796308.png)
![](https://img.haomeiwen.com/i16823531/710fde9529e9a232.png)