您的位置:首页 > 其它

MyBatis初探

2016-03-08 19:52 381 查看

简介

MyBatis是一款支持定制化SQL、存储过程以及高级映射的优秀的持久层框架。它几乎避免了所有的JDBC代码和手动设置参数以及获取结果集。MyBatis 可以对配置和原生Map使用简单的 XML 或注解,将接口和 Java 的 POJOs(Plain Old Java Objects,普通的 Java对象)映射成数据库中的记录。详见MyBatis中文网页

何为高级映射?

ORM

持久层的概念

指J2EE开发中的5层架构(表示层、控制\中介层、领域层、持久层、数据源层),持久层主要是为对象-关系数据库之间提供企业级的映射服务

MyBatis-config.xml配置说明

xml配置文件的属性目录如下:

configuration 配置

properties 属性

settings 设置

typeAliases 类型命名

typeHandlers 类型处理器

objectFactory 对象工厂

plugins 插件

environments 环境

environment 环境变量

transactionManager 事务管理器

dataSource 数据源

databaseIdProvider 数据库厂商标识

mappers 映射器

必须按照顺序来配置,否则xml配置文件保存时编译不通过。

properties 配置属性,可引入外部配置文件(如数据源配置)

settings 配置参数,如cacheEnabled、useGeneratedKeys

typeAliases 配置别名,这样在全局配置文件(xml配置、映射器配置)中均可以使用别名,最常用的就是全路径(完全限定名fully qualified name)的别名,

typeHandlers 自定义对非标准数据库字段类型的处理,将数据库字段转换成java类型

objectFactory MyBatis在创建结果对象的实例时,总是通过ObjectFactory(对象工厂)实例来完成。默认的对象工厂仅仅实例化目标类,通过该配置可自定义

plugins 自定义拦截插件,在映射语句执行过程中的某一点进行拦截

environments 环境参数,可以配置适应多种环境,这种机制有助于将 SQL 映射应用于多种数据库之中, 现实情况下有多种理由需要这么做。例如,开发、测试和生产环境需要有不同的配置;或者共享相同 Schema 的多个生产数据库, 想使用相同的 SQL 映射。许多类似的用例。 但是每一个数据库都对应一个SqlSessionFactory

transactionManager 在 MyBatis 中有两种类型的事务管理器(也就是 type=”[JDBC|MANAGED]”)(JDBC直接使用jdbc管理事务,MANAGED完全交由容器来管理,如J2EE应用服务器上下文、Spring容器等)

dataSource 数据库连接配置,有三种内建的数据源类型(也就是 type=”[UNPOOLED|POOLED|JNDI]”)

mappers 映射器配置,引入某个配置文件的位置,具体映射器配置见后文

附带一个测试项目的配置

<?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>

<!-- 属性文件配置 -->
<properties resource="myBatis_test/data/config.properties">
<property name="username" value="system" />
<property name="password" value="system" />
</properties>

<settings>
<setting name="cacheEnabled" value="true" />
<setting name="lazyLoadingEnabled" value="true" />
<setting name="multipleResultSetsEnabled" value="true" />
<setting name="useColumnLabel" value="true" />
<setting name="useGeneratedKeys" value="false" />
<setting name="autoMappingBehavior" value="PARTIAL" />
<setting name="defaultExecutorType" value="SIMPLE" />
<setting name="defaultStatementTimeout" value="25" />
<setting name="defaultFetchSize" value="100" />
<setting name="safeRowBoundsEnabled" value="false" />
<setting name="mapUnderscoreToCamelCase" value="false" />
<setting name="localCacheScope" value="SESSION" />
<setting name="jdbcTypeForNull" value="OTHER" />
<setting name="lazyLoadTriggerMethods" value="equals,clone,hashCode,toString" />
</settings>

<typeAliases>
<package name="myBatis_test.bean" />
<package name="myBatis_test.pojo" />
<!-- 上句将包下所有的pojo类统一转换为同类名的别名,如:
<typeAlias alias="AlertVo" type="myBatis_test.pojo.AlertVo" />
-->
</typeAliases>

<plugins>
<plugin interceptor="myBatis_test.plugins.MyPlugin">
<property name="someProperty" value="100" />
</plugin>
</plugins>

<environments default="development">
<environment id="development">
<transactionManager type="JDBC" />
<dataSource type="POOLED">
<property name="driver" value="${driverClass}" />
<property name="url" value="${jdbcUrl}" />
<property name="username" value="${user}" />
<property name="password" value="${password}" />
</dataSource>
</environment>
</environments>

<mappers>
<mapper resource="myBatis_test/data/testMapper.xml" />
</mappers>
</configuration>


映射器xml配置

Mapper xml是映射的核心,也是构建MyBatis强大映射威力的基础,列举出它的顶级元素(按照应该被定义的顺序):

cache – 给定命名空间的缓存配置。

cache-ref – 其他命名空间缓存配置的引用。

resultMap – 是最复杂也是最强大的元素,用来描述如何从数据库结果集中来加载对象。

parameterMap – 已废弃!老式风格的参数映射。内联参数是首选,这个元素可能在将来被移除,这里不会记录。

sql – 可被其他语句引用的可重用语句块。

insert – 映射插入语句

update – 映射更新语句

delete – 映射删除语句

select – 映射查询语句

主要介绍resultMap,以一个案例入手,查询某张表,不要返回list实体集合,要求返回Map实体(value为bean实例,key为bean的id)。

这时候就要求定义一个resultMap,封装bean实例作为其map的value类型,beanid为其key类型,然后将这个resultMap设置为查询返回的resultMap值,上代码:

<?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">

<!-- 命名空间,MyBatis强制要求声明,方便动态代理声明代理接口 -->
<mapper namespace="myBatis_test.data.IMapper">
<!-- 测试sql -->
<select id="testMapper1" parameterType="int" resultType="AlertVo">
<!-- resultType="hashmap" mybatis内置了java类型的别名(大小写不敏感), 直接返回HashMap集合 -->
select * from t_alert where id=#{id}
</select>

<!-- AlarmProcessTool模块SQL -->
<resultMap id="allDevMap" type="DeviceBean">
<id property="key_v" column="key_v" javaType="String"/>
<result property="id" column="id"/>
<result property="corpId" column="corpid"/>
<result property="ip" column="ip"/>
<result property="name" column="name"/>
<result property="fetchIp" column="ip_fetch"/>
<result property="showName" column="showname"/>
</resultMap>
<select id="queryAllDevices" resultMap="allDevMap" parameterType="map">
select
cast(concat(ip,'&',ip_fetch) as char) as key_v,
<!-- xml对&符号做了预定义,使用&代替&符号 -->
id,
corpid,
ip,
name,
ip_fetch,
showname
from t_device
</select>

</mapper>


此时,若要查询获得Map实体,通过动态代理的接口类直接调用接口方法查找不太好实现,但直接使用SqlSession.selectMap(String statement, Object parameter, String mapKey)方法方便,上代码:

SqlSession session = null;
try {
String resource = "myBatis_test/data/mybatis-config.xml";
InputStream inputStream;
inputStream = Resources.getResourceAsStream(resource);
fac = new SqlSessionFactoryBuilder().build(inputStream);
// 开启session
session = fac.openSession();
//因查找返回的map<String,DeviceBean>实体类,在接口中声明后,声明的接口中没有传递mapkey的参数列,采用直接调用xml配置列的语句,可实现返回map实体类的方法。
Map<String, DeviceBean> map = session.selectMap("queryAllDevices", null,"key_v");
int i=1;
for(Entry<String, DeviceBean> e : map.entrySet()) {
System.out.println(i++ +"   value:"+e.getValue().getFetchIp()+"  key值:"+e.getKey());
}
} catch (Exception e){
e.printStackTrace();
} finally {
// 关闭session
session.close();
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: