Mybatis,前身iBatis,引述官网的原意来说,Mybatis是支持普通SQL查询,可以更简单直接的操作SQL,存储过程和高级映射的一种优秀的持久层框架,使用它基本可以消除所有的JDBC大麦和参数的手工设置以及结果集的检索,其实主要工作都是在配置XML或者注解上,然后将接口和Java的POJO(普通Java对象映射成数据库的记录)。
这段时间学习下来,其实对Mybatis来说主要的过程无法是以下几步:
1. 从XML配置文件中获取SessionFactory,然后由SessionFactory产生相应的Session。
2. 是用Session对象对业务数据完成相应的CRUD操作(增删改查)和相应的事务控制。
3. 使用完毕后关闭相应的Session,以免过度占用资源
4. 使用配置相应的Mapper xml文件进行业务实体的JavaBean与数据库表之间做相应的Map操作
战前准备:
1. 开发环境Eclipse JavaEE IDE,JDK 1.6,数据库 sqlserver2008
2. 下载相应Jar包,以备后用
mybatis-3.2.3.zip 解压后拿出 mybatis-3.2.3.jar,=> 下载地址: http://code.google.com/p/mybatis/ (Mybatis核心包)
mybatis-generator-core-1.3.1.jar => 下载地址: http://code.google.com/p/mybatis/wiki/Generator (Mybatis自动生成配置文件包)
接下来大家可以再Eclipse下面建一个名为TestMyBatis的Java Project项目,按照如下图中所示新建相应的包结构和文件夹结构,其中config与mapper分别为文件夹,
完成后,执行下面SQL,建立所需的表结构,分别有3张表,Visitor(访问者表),Website(网站表),Channel(频道表)
(
Id INT NOT NULL,
Name VARCHAR(1000) NOT NULL,
Email VARCHAR(1000) NOT NULL,
Status INT NOT NULL DEFAULT 1,
CreateTime DateTime,
PRIMARY KEY(Id)
)
CREATE TABLE Website
(
Id INT NOT NULL PRIMARY KEY ,
Name VARCHAR(1000) NOT NULL,
VisitorId INT REFERENCES Visitor(Id),
Status INT NOT NULL DEFAULT 1,
CreateTime DateTime
)
CREATE TABLE Channel
(
Id INT NOT NULL PRIMARY KEY,
Name VARCHAR(1000) NOT NULL,
WebsiteId INT REFERENCES Website(Id),
Status INT NOT NULL DEFAULT 1,
CreateTime DateTime
)
就像开头说的,Mybatis的所有配置都源于一份XML配置文件,我们需要在config文件夹下,新建名为mybatis_config.xml的配置文件,这一份东西就是我们后面所需要操作的核心之一。
在配置这个文件千万要注意<configuration>节点内的元素都是有层级顺序的要求的,不能够随意更换次序,否则在加载xml配置文件的时候会出现异常而导致后续操作不成功。
具体的节点说明大家可以查看http://mybatis.github.io/mybatis-3/zh/configuration.html#,这里只说比较常用的节点,typeAliases,environments,mappers。
1. typeAliases => 别名节点,可以通过设置这个节点的属性,这样配置文件中其他需要实体名字的地方都可以使用此别名而不是完全限定名,例如 <typeAlias type="david.mybatis.model.Visitor" alias="Visitor" />
2. environments => 环境节点,配置数据连接相关的信息
3. mappers => 配置SQL映射语句。
最简单的配置如下:
<!DOCTYPE configuration
PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
<typeAliases>
<typeAlias type="com.yy.model.Visitor" alias="Visitor" />
</typeAliases>
<environments default="development">
<environment id="development">
<transactionManager type="JDBC"></transactionManager>
<dataSource type="POOLED">
<property name="driver" value="com.microsoft.sqlserver.jdbc.SQLServerDriver" />
<!-- ?useUnicode=true&characterEncoding=utf8为了支持中文数据的写入 -->
<property name="url"
value="jdbc:sqlserver://localhost:1433;DatabaseName=uap63_0825" />
<property name="username" value="sa" />
<property name="password" value="yy19930214" />
</dataSource>
</environment>
</environments>
<mappers>
<mapper resource="com/yy/mapper/VisitorMapper.xml" />
</mappers>
</configuration>
新建一个名为MyBatisUtils类,里面存放获取SqlSession与关闭SqlSession的方法,提炼出来方便多次复用。
import java.io.IOException;
import java.io.InputStream;
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.yy.model.CRUD_Enum;
public class MybatisUtils {
private static final String CONFIG_PATH = "com/yy/config/TestMyBatis_config.xml";
/*
* 获取数据库访问链接
*/
public static SqlSession getSqlSession() {
SqlSession session=null;
try {
InputStream stream=Resources.getResourceAsStream(CONFIG_PATH);
//可以根据配置的相应环境读取相应的数据库环境
// SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(
// stream, "development");
SqlSessionFactory factory=new SqlSessionFactoryBuilder().build(stream);
session=factory.openSession();
} catch (IOException e) {
e.printStackTrace();
}
return session;
}
/*
* 关闭数据库访问链接
*/
public static void closeSession(SqlSession session) {
session.close();
}
/*
* 返回操作记录消息
*/
public static void showMessages(CRUD_Enum type, int count) {
switch (type) {
case Add:
System.out.println("添加了" + count + "条记录。");
break;
case Delete:
System.out.println("删除了" + count + "条记录。");
break;
case Update:
System.out.println("更新了" + count + "条记录。");
break;
case Query:
System.out.println("匹配了" + count + "条记录。");
break;
case List:
System.out.println("共有" + count + "条记录。");
break;
default:
break;
}
}
}
在新建一个名为Visitor的类,用来作相应的OR Mapping。
import java.text.SimpleDateFormat;
import java.util.Date;
//访问者类;
public class Visitor {
private int id;
private String name;
private String email;
private int status;
private Date createTime;
public Visitor() {
createTime = new Date();
}
public Visitor(String name, String email) {
this.name = name;
this.email = email;
this.status = 1;
this.createTime = new Date();
}
public int getId() {
return id;
}
public void setName(String name) {
this.name = name;
}
public String getName() {
return name;
}
public void setEmail(String email) {
this.email = email;
}
public String getEmail() {
return email;
}
public Date getCreateTime() {
return createTime;
}
@Override
public String toString() {
//格式化输出;
return String.format("{Id: %d, Name: %s, CreateTime: %s}", id, name,
new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(createTime));
}
}
新建一个VisitorMapper.xml,用来映射相应SQL语句。
这里要注意namespace=>com.yy.demo.IVisitorOperation一定要与对应这个包下面的实际文件名,IVisitorOperation否则无法成功加载相应的映射文件
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.yy.demo.IVisitorOperation">
<!-- 此处的resultType就是对应刚刚你在typeAlias节点里面规定的别名 -->
<select id="basicQuery" parameterType="int" resultType="Visitor">
select * from visitor where id=#{id} and
Status>0 order by Id
</select>
</mapper>
接下来运行下面的程序
/**
* @param args
*/
public static void main(String[] args) {
SqlSession session=MybatisUtils.getSqlSession();
Visitor visitor=session.selectOne("com.yy.demo.IVisitorOperation.basicQuery",1);
MybatisUtils.closeSession(session);
System.out.println(visitor);
}
这算是Mybatis系列的HelloWord,下回会讲述关于使用接口的方式进行相应操作。
易出问题:
问题一:
解决:Visitormapper.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">
问题二:找不到driver类;
No suitable driver found for jdbc:microsoft:sqlserver://localhost:1433;DatabaseName=uap63_0825
解决:引用错了。 sql2000 com.microsoft.jdbc.sqlserver.SQLServerDriver jdbc:microsoft:sqlserver://<server>:<port>;DatabaseName=<database> 3个文件: msbase.jar mssqlserver.jar msutil.jar sql2005及以后 com.microsoft.sqlserver.jdbc.SQLServerDriver jdbc:sqlserver://<server>:<port>;DatabaseName=<database> 1个文件: sqljdbc.jar 或者 sqljdbc4.jar