什么是mybatis呢?它是一个优秀的对象关系映射持久层框架。
MyBatis 是支持定制化 SQL、存储过程以及高级映射的优秀的持久层框架。MyBatis 避免了几乎所有的 JDBC 代码和手动设置参数以及获取结果集。MyBatis 可以对配置和原生Map使用简单的 XML 或注解,将接口和 Java 的 POJOs(Plain Old Java Objects,普通的 Java对象)映射成数据库中的记录。
来源:http://www.mybatis.org/mybatis-3/zh/index.html
采用maven方式引入jar包
<dependency>
<groupId>org.mybatisgroupId>
<artifactId>mybatisartifactId>
<version>3.2.2version>
dependency>
<dependency>
<groupId>com.oraclegroupId>
<artifactId>ojdbc14artifactId>
<version>10.2.0.3version>
dependency>
如果需要使用junit测试,则还需引入:
<dependency>
<groupId>junitgroupId>
<artifactId>junitartifactId>
<version>4.9version>
<scope>testscope>
dependency>
-- Create table
create table BASE_55DEMO.DEMO_DEPT
(
D_ID NUMBER not null,
D_NAME VARCHAR2(50) not null,
D_ADDRESS VARCHAR2(100)
)
默认为Configuration.xml文件在classpath路径下
MyBatis-config.xml
<configuration>
<properties resource="jdbc.properties" />
<typeAliases>
<typeAlias alias="Dept" type="com.wm.mybatis.POJO.Dept"/>
typeAliases>
<environments default="development">
<environment id="development" >
<transactionManager type="JDBC" />
<dataSource type="POOLED">
<property name="driver" value="${jdbc.driverClass}"/>
<property name="url" value="${jdbc.url}"/>
<property name="username" value="${jdbc.username}"/>
<property name="password" value="${jdbc.password}"/>
dataSource>
environment>
environments>
<mappers>
<mapper resource="mapper/Dept.xml" />
mappers>
configuration>
1、如使用常量形式来定义数据库配置,则需引入配置:
<properties resource="jdbc.properties" />
就可以导入properties文件
2、使用typeAliases来配置别名,在配置文件下文就可以使用别名Dept,来代替全名称com.wm.mybatis.POJO.Dept,方便了、简化了配置文件。
<typeAliases>
<typeAlias alias="Dept" type="com.wm.mybatis.POJO.Dept"/>
typeAliases>
3、environment 元素体中包含了事务管理和连接池的配置。mappers 元素则是包含一组 mapper 映射器(这些 mapper 的 XML 文件包含了 SQL 代码和映射定义信息)。
4、jdbc.properties文件
jdbc.driverClass = oracle.jdbc.driver.OracleDriver
jdbc.url = jdbc:oracle:thin:@10.5.1.50:1521:cddev
jdbc.username = base_55demo
jdbc.password = crm_12345
type:
mybatis支持两种类型的事务管理器,jdbc和managed(托管)
jdbc:应用程序管理数据库连接的生命周期
managed:由应用服务器负责管理数据库连接的生命周期(一般商业服务器才有此功能,如JBOSS WebLogic)
type:用来配置数据源,类型有:UNPOOLED、POOLED、JNDI
UNPOOLED:没有连接池,每次数据库操作,mybatis都会创建一个新的连接,用完后,关闭:适合小并发项目
POOLED:有连接池
JNDI:使用应用服务器配置JNDI数据源获取数据库连接
public class TestMyBatis {
private Reader resource = null;
private SqlSessionFactory sqlSessionFactory = null ;
private SqlSession sqlSession = null ;
@Before
public void init(){
try {
resource = Resources.getResourceAsReader("MyBatis-config.xml");
sqlSessionFactory = new SqlSessionFactoryBuilder().build(resource);
sqlSession = sqlSessionFactory.openSession();
} catch (Exception e) {
e.printStackTrace();
}
}
}
package com.wm.mybatis.POJO;
import java.util.List;
public class Dept {
private int id ;
private String name ;
private String address ;
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 String getAddress() {
return address;
}
public void setAddress(String address) {
this.address = address;
}
}
POJO类与数据库表的映射文件mapping
dept.xml
<mapper namespace="com.wm.mybatis.dao.IDeptMapperDao">
<resultMap type="Dept" id="resultDept">
<result property="id" column="d_id" />
<result property="name" column="d_name" />
<result property="address" column="d_address" />
resultMap>
<select id="findById" parameterType="int" resultMap="resultDept">
select>
mapper>
如果数据库字段与pojo类不一样,则可以定义resultMap,来匹配。
<resultMap type="Dept" id="resultDept">
<result property="id" column="d_id" />
<result property="name" column="d_name" />
<result property="address" column="d_address" />
resultMap>
result 中property为pojo类的属性,column为数据库的字段,要一一对应,如果有主键,则用id来对应。
自定义了resultMap,则下面返回类型resultMap就为上面自定义的map的Id。
package com.wm.mybatis.Test;
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.wm.mybatis.POJO.Dept;
public class MainTest {
public static void main(String[] args) throws IOException {
Reader resource = null;
SqlSessionFactory sqlSessionFactory = null ;
SqlSession sqlSession = null ;
try {
resource = Resources.getResourceAsReader("MyBatis-config.xml");
sqlSessionFactory = new SqlSessionFactoryBuilder().build(resource);
sqlSession = sqlSessionFactory.openSession();
// 1、使用selectOne方式获取 mapper (命名空间+操作id,参数)
Dept dept = (Dept)sqlSession.selectOne("com.wm.mybatis.dao.IDeptMapperDao.findById", 19);
System.out.println(dept);
} catch (Exception e) {
e.printStackTrace();
}finally{
sqlSession.close();
}
}
}
首先定义一个DAO的接口,编写方法
package com.wm.mybatis.dao;
import com.wm.mybatis.POJO.Dept;
public interface IDeptMapperDao {
public Dept findById(int id);
}
相当于原先的DAO层
dept.xml映射文件mapping不变,但是是有限制的:
<mapper namespace="com.wm.mybatis.dao.IDeptMapperDao">
命名空间必须是接口的全类路径,并且select的ID必须是接口定义的方法名。
<select id="findById" parameterType="int" resultMap="resultDept">
package com.wm.mybatis.Test;
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.wm.mybatis.POJO.Dept;
import com.wm.mybatis.dao.IDeptMapperDao;
public class MainTest {
public static void main(String[] args) throws IOException {
Reader resource = null;
SqlSessionFactory sqlSessionFactory = null ;
SqlSession sqlSession = null ;
try {
resource = Resources.getResourceAsReader("MyBatis-config.xml");
sqlSessionFactory = new SqlSessionFactoryBuilder().build(resource);
sqlSession = sqlSessionFactory.openSession();
// 2、获取接口层 接口类 getmapper 方式 --此方式 这mapper.xml文件中的命名空间要与接口路径一样
IDeptMapperDao mapper = sqlSession.getMapper(IDeptMapperDao.class);
Dept dept = mapper.findById(20);
System.out.println(dept);
} catch (Exception e) {
e.printStackTrace();
}finally{
sqlSession.close();
}
}
}
获取映射是通过接口方法来获取的。测试结果和上面一样的。
只是获取方式有selectOne变成getMapper了。
测试结果与数据库的数据一致。