1. MyBatis简介
MyBatis 本是apache的一个开源项目 iBatis , 2010年这个项目由apache software foundation 迁移到了googlecode,并且改名为MyBatis.
MyBatis 是支持普通SQL查询,存储过程和高级映射的优秀持久层框架。MyBatis 消除 了几乎所有的 JDBC 代码和参数的手工设置以及结果集的检索。MyBatis 使用简单的 XML 或注解用于配置和原始映射,将接口和 Java 的POJOs(Plain Old Java Objects,普通的 Java 对象)映射成数据库中的记录。 每个MyBatis应用程序主要都是使用SqlSessionFactory实例的,一个SqlSessionFactory实例可以通过SqlSessionFactoryBuilder获得。SqlSessionFactoryBuilder可以从一个xml配置文件或者一个预定义的配置类的实例获得。 用xml文件构建SqlSessionFactory实例是非常简单的事情。推荐在这个配置中使用类路径资源(classpath resource),但你可以使用任何Reader实例,包括用文件路径或file://开头的url创建的实例。MyBatis有一个实用类----Resources,它有很多方法,可以方便地从类路径及其它位置加载资源。
2.初识MyBatis
我们学过ibatis以后,再来学习MyBatis就会觉得很简单了。现在我们来初步了解下MyBatis的基本配置和使用。
(1).首先是导入jar包。师兄这里用的是,mybatis-3.1.1.jar。你们可以下载最新的jar包,在看前必读里有链接,也可以上网找……当然数据库驱动jar包是必不可少的.
(2). 写mybatis.xml配置文件
<?xml version="1.0"encoding="UTF-8" ?>
<!DOCTYPE configuration PUBLIC
"-//mybatis.org//DTD Config 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
<typeAliases>
<typeAlias alias="dept" type="com.siqi.po.Dept"/> //定义别名
</typeAliases>
<environments default="development">
//<environments>属性是数据源环境配置,可以配置多个数据源配置。每个//<environment>属性代表一种配置方式。
<environment id="development"> //环境配置,可以配置多个
<transactionManager type="JDBC" />//配置事务管理
<dataSource type="POOLED"> //配置数据源
<property name="driver" value="oracle.jdbc.driver.OracleDriver"/>
<property name="url" value="jdbc:oracle:thin:@localhost:1521:orcl"/>
<property name="username" value="scott"/>
<property name="password" value="tiger"/>
</dataSource>
</environment>
</environments>
<mappers>
<mapper resource="com/siqi/po/dept.xml" />
</mappers>
</configuration>
注意:上面代码中,我为了方便理解加上注释,真实编码时,不能加注释!
(3).接下来,我们要书写Dept类和dept.xml配置文件
注意:在dept.xml配置中:
下面是dept.xml的部分参考代码:
<?xml version="1.0"encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTDMapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.siqi.po">
<resultMap type="com.siqi.po.Dept" id="siqi">
<id property="deptno"column="deptno" />
<result property="dname"column="dname" />
<result property="loc"column="loc" javaType="string"jdbcType="VARCHAR" />
</resultMap>
<select id="find" parameterType="dept"resultMap="siqi">
select * from dept
</select>
<select id="findById" parameterType="dept"resultMap="siqi">
select * from dept where deptno=#{deptno}
</select>
<insert id="insertDept" parameterType="dept">
insert into dept values (#{deptno},#{dname},#{loc})
</insert>
<update id="merge"parameterType="dept">
update dept set
dname=#{dname},loc=#{loc} where deptno=#{deptno}
</update>
<delete id="delete"parameterType="dept" >
delete from dept where deptno=#{deptno}
</delete>
</mapper>
3.测试
上面我们已经完成了配置工作,现在我们书写Test类,进行测试。代码如下:
publicclass Test {
publicstaticvoid main(String[] args) {
String rs="mybatis.xml";
Reader reader=null;
try {
reader=Resources.getResourceAsReader(rs);
} catch (IOException e) {
// TODO Auto-generatedcatch block
e.printStackTrace();
}
SqlSessionFactory sqlSessionFactory=newSqlSessionFactoryBuilder().build(reader);
SqlSession session = sqlSessionFactory.openSession();
Dept d=new Dept();
List list=session.selectList("find", d);
for(int i=0;i<list.size();i++){
Dept dept=(Dept)list.get(i);
System.out.println(dept.getDname());
}
session.commit();
session.close();
}
}
上面代码我们进行了查询工作。经测试可以查询出数据。
(1)。增加数据,部分代码如下
Dept d=new Dept();
d.setDeptno(80);
d.setDname("hello");
d.setLoc("world");
session.insert("insertDept", d); //insert方法增加数据,参数中的//insertDept对应配置文件中的insert标签的id
(2).修改数据,部分代码如下:
Dept d=new Dept();
d.setDeptno(80);
d.setDname("haungpu");
d.setLoc("siqi");
session.insert("merge", d);
(3).删除数据,部分代码如下:
Dept d=new Dept();
d.setDeptno(80);
session.insert("delete", d);
经过测试,上述代码无误!!
4.拓展
(1)一对多我们以dept和emp表为例
首先,先在po包中写上Emp类。
然后,在Dept类,加上泛型为Emp的集合
然后,在dept.xml配置文件中,加上一下代码:
查询方法中,也要注意,加上:
同样,经过上述配置,也就成功了。我们可以测试一下,测试部分代码如下:
Dept d=new Dept();
d.setDeptno(30);
List list=session.selectList("findById", d);
Dept dept=(Dept)list.get(0);
List li=dept.getList();
System.out.println("部门名称为:"+dept.getDeptno());
for(int i=0;i<li.size();i++){
Emp e=(Emp)li.get(i);
System.out.println("员工为:"+e.getEname());
}
测试结果如下:
(2)。一对一,我们以人和档案为例,一个人对应一份档案。
1.首先写好Person,DangAn类,然后在person.xml映射文件中,配置如下代码:
参考代码如下:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTDMapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.siqi.po">
<resultMap type="com.siqi.po.Person" id="hello">
<id property="perid"column="perid" />
<result property="pername"column="pername" />
<association property="dangAn"column="perid" javaType="com.siqi.po.DangAn">
<id property="perid"column="perid" />
<result property="perage"column="perage" />
<result property="peraddr"column="peraddr" />
</association>
</resultMap>
<select id="selectById" parameterType="com.siqi.po.Person" resultMap="hello">
select * from tb_person d join tb_dangan p on d.perid =p.perid where d.perid =#{perid}
</select>
</mapper>
(3)测试
Person p=new Person();
p.setPerid(77);
List list=session.selectList("selectById",77);
System.out.println(list.size());
p=(Person)list.get(0);
System.out.println(p.getDangAn().getPerage());
经测试,上述代码无误!!