MyBatis基于代理机制,让我们无需再编写Dao的实现。
传统Dao接口,现在名称统一以Mapper结尾:
使用步骤:
1:创建接口:IUserDao变成UserMapper:DomainMapper
接口内容和普通的一样
UserMapper:
public interface ProductMapper {
Product findOne(Long id);
}
2:不再写UserDaoImpl:直接定位到DomainMapper.xml:
namespace:能够链接到mapper接口,就是DomainMapper的权限定名
sql:和接口的方法对应起来.
注意:DomainMapper接口的方法名和id要完全一致
<?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">
<!--
这个Mapper的主要功能就是写sql
mapper:根
namespace:命令空间 (用来确定唯一) 以前这个是可以不加的,现在必需加
namespace的值,规则的:映射文件XxxMapper.xml所在的包+domain类名+Mapper
-->
<mapper namespace="cn.shuhan.mapper.ProductMapper">
<!--id 要跟接口方法一样 最好是copy
Product findOne(Long id);
parameterType :参数类型
resultType:返回值类型 要是没设置别名就写权限定名
-->
<select id="findOne" parameterType="long" resultType="cn.shuhan.mapper.Product">
select * from product where id =#{id}
</select>
</mapper>
3.将DomainMapper.xml映射设置到MyBatis-config.xml中
MyBatis-config.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>
<!--
引入classpath下的db的配置文件
-->
<properties resource="db.properties">
</properties>
<!--
二级缓存:可以不写
-->
<settings>
<setting name="cacheEnabled" value="true"/>
</settings>
<!--给类型加上别名
要加在引入配置文件下 环境搭建上
type:原数据类型
alias:别名
要是不写alias 会默认是类的简单类名 首字母大小写都可以 建议大写 大写一看就知道是一个类
先配置别名再使用别名
-->
<typeAliases>
<!-- <typeAlias type="cn.itsource.mybatis.domain.Product" alias="product"></typeAlias>-->
<!--<typeAlias type="cn.itsource.mybatis.domain.Product" ></typeAlias>-->
<!--扫描包 一个包里的全部类都可以用简单类名
<package name="cn.shuhan.mapper"></package>-->
</typeAliases>
<!--
环境们:多个环境
development:开发
-->
<environments default="development">
<!--
一个环境的配置
-->
<environment id="development">
<!--事务的管理:-->
<transactionManager type="JDBC"/>
<!--数据源的排至-->
<dataSource type="POOLED">
<property name="driver" value="${jdbc.driver}"/>
<property name="url" value="${jdbc.url}"/>
<property name="username" value="${jdbc.username}"/>
<property name="password" value="${jdbc.password}"/>
</dataSource>
</environment>
</environments>
<mappers>
<!--
引入写sql语句的mapper配置文件:
<mapper resource="org/mybatis/example/BlogMapper.xml"/>
-->
<!--mapper映射器配置-->
<mapper resource="cn/shuhan/mapper/ProductMapper.xml"/>
</mappers>
</configuration>
4.测试: 通过工具类获取sqlSession,再通过sqlSession获取到指定mapper接口的代理接口:调用方法;
public class ProductMapperTest {
@Test
public void findOne() {
SqlSession sqlSession = null;
try {
//工具类得到sqlsession
sqlSession = MybatisUtil.getSqlSession();
//获取映射
ProductMapper productMapper = sqlSession.getMapper(ProductMapper.class);
//打印确认一下productMapper不是原来的对象 而是是被映射处理过的对象
System.out.println(productMapper);
//映射对象调用方法
System.out.println(productMapper.findOne(3L));
} catch (Exception e) {
e.printStackTrace();
} finally {
//关闭sqlSession
if (sqlSession != null) {
sqlSession.close();
}
}
}
}
5.工具类MyBatisUtil:因为SqlSessionFactory对象是一个重量级的,加载费性能,而且加载一次可以一直用 所以封装一下
public class MybatisUtil {
static SqlSessionFactory factory;
static {
try {
//通过配置文件获得一个Reader
Reader reader = Resources.getResourceAsReader("mybatis-config.xml");
//获取SqlSessionFactory 对象
factory= new SqlSessionFactoryBuilder().build(reader);
} catch (IOException e) {
e.printStackTrace();
}
}
//提供获取sqlsession的公共方法
public static SqlSession getSqlSession(){
return factory.openSession();
}
}