ibatis介绍
iBATIS一词来源于“internet”和“abatis”的组合,是一个由Clinton Begin在2002年发起的开放源代码项目。于2010年6月16号被谷歌托管,改名为MyBatis。是一个基于SQL映射支持Java和·NET的持久层框架。
搭建ibatis环境
jar包:
<dependency>
<groupId>org.apache.ibatis</groupId>
<artifactId>ibatis-sqlmap</artifactId>
<version>2.3.0</version>
</dependency>
<dependency>
<groupId>com.mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.6-bin</version>
</dependency>
文件协同要素
- 实体类(entity)
任何一个ORM关系映射框架都需要底层的实体类支撑,如Hibernate也同样存在entity的概念。
如下例中的Student.java
类。 - Dao
同样,每一个实体类都会配备一个针对其本身的DataAccessObject(简称Dao),这也是必备的,用于定义针对该实体类的操作接口。如下例中的StudentDao.java
类。 - DaoImpl
实现对应的Dao接口,该DaoImpl与Hibernate中的DaoImpl有些许差别:ibatis中使用其自带的com.ibatis.sqlmap.client.SqlMapClient
客户端完成对SqlMapConfigure.xml的加载,因此每一个DaoImpl都需要具备一个静态的sqlMapClient,和一个静态加载SqlMapConfigure.xml的过程。
如下例中的StudentDaoImpl.java
类。 - SqlMapConfig.xml
ibatis独有的配置类xml,类似于Hibernate的hibernate-conf.xml,MySqlConfigure.xml中配置着连接数据库所用到的dataSource、操作各个实体所使用到的[Entity].xml的加载。
如下例中的MySqlConfigure.xml
。 - [Entity].xml(Entity对应实体类,即实体类的xml配置)
配置针对该实体bean的所有sql操作细节:映射实体bean,书写sql语句。如下例中的Student.xml
文件。 - SqlMap.properties
记录数据库连接信息,一般为四条:
- driver
- url
- username
- password
如下例中的SqlMap.properties
文件。
例子
Student实体
package ibatis;
import java.util.Date;
public class Student {
private int id;
private String name;
private float score;
private Date birth;
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public float getScore() {
return score;
}
public void setScore(float score) {
this.score = score;
}
public Date getBirth() {
return birth;
}
public void setBirth(Date birth) {
this.birth = birth;
}
@Override
public String toString() {
return"id=" + id + "\tname=" + name + "\tmajor=" + birth + "\tscore="
+ score + "\n";
}
}
StudentDao接口(为通俗起见,只有一个select功能,其他的同理):
package ibatis;
import java.util.List;
public interface StudentDao {
public List<Student> selectAllStudent();
}
StudentDaoImpl接口实现
package ibatis;
import java.io.IOException;
import java.io.Reader;
import java.sql.SQLException;
import java.util.List;
import com.ibatis.common.resources.Resources;
import com.ibatis.sqlmap.client.SqlMapClient;
import com.ibatis.sqlmap.client.SqlMapClientBuilder;
public class StudentDaoImpl implements StudentDao {
private static SqlMapClient sqlMapClient = null;
static{
try {
Reader reader = Resources.getResourceAsReader("ibatis/SqlMapConfig.xml");
sqlMapClient = SqlMapClientBuilder.buildSqlMapClient(reader);
reader.close();
} catch (IOException e) {
e.printStackTrace();
}
}
@SuppressWarnings("unchecked")
public List<Student> selectAllStudent() {
List<Student> students = null;
try {
students = sqlMapClient.queryForList("selectAllStudent");
} catch (SQLException e) {
e.printStackTrace();
}
return students;
}
}
【重要】SqlMapConfig.xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE sqlMapConfig PUBLIC "-//ibatis.apache.org//DTD SQL Map Config 2.0//EN"
"http://ibatis.apache.org/dtd/sql-map-config-2.dtd">
<!-- 注:SqlMapConfig.xml文件头要区别于Student.xml文件头,读者可对照该例子自行比较 -->
<sqlMapConfig>
<!-- 加载数据库配置项,resource值为该properties文件的完整路径 -->
<properties resource="ibatis/SqlMap.properties" />
<transactionManager type="JDBC">
<dataSource type="SIMPLE">
<property name="JDBC.Driver" value="${driver}"/>
<property name="JDBC.ConnectionURL" value="${url}" />
<property name="JDBC.Username" value="${username}" />
<property name="JDBC.Password" value="${password}" />
</dataSource>
</transactionManager>
<!-- 加载实体类配置项,resource值为该xml文件的完整路径 -->
<sqlMap resource="ibatis/Student.xml"/>
</sqlMapConfig>
【重要】Student.xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE sqlMap PUBLIC "-//ibatis.apache.org//DTD SQL Map 2.0//EN"
"http://ibatis.apache.org/dtd/sql-map-2.dtd">
<!-- 注意区分config.xml和当前xml头部 -->
<sqlMap>
<!-- 为实体类取别名,方便分离,type为完整的类名 -->
<typeAlias alias="Student" type="ibatis.Student"/>
<!-- sql语句,在DaoImpl中使用sqlmapClient对id进行引用调用sql执行语句 -->
<select id="selectAllStudent" resultClass="Student">
select * from student
</select>
</sqlMap>
SqlMap.properties文件
driver=com.mysql.jdbc.Driver
url=jdbc:mysql://localhost:3306/xxxx
username=xxx
password=xxxxxxxx
如下工程目录,为搞不清楚xml引用路径的读者提供参考。
对ibatis的感觉
相对于Hibernate:
轻量了很多,不需要引用其他工厂类,在config.xml中只需配置dataSource,而Hibernate中还需要sessionFactory和其他配置.
灵活了很多,sql语句完全写到配置文件中,可以随时修改移植,避免了Hibernate中为了修改sql而要修改代码的弊端。同时,sql语句可以更加灵活复杂。众所周知,Hibernate想要执行一条复杂一些的sql语句真是很费劲的,因为其HQL语句本身不支持复杂逻辑,仅仅是跟查询有关的操作。为了在Hibernate中执行sql语句还需要使用
getSession().createSQLQuery(sql)
相关语句,非常繁琐。