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(); }
相关文章推荐
- Html5-Video标签以及字幕subtitles和captions的区别
- git提交代码步骤
- 使用BufferedInputStream的好处
- centos72开启远程xwindow
- UICollectionView如果在数据不够一屏时上下滚动
- JAVA基础(二)面向对象思想
- Android开发之实现强制下线功能(上)
- USB原理简单叙述
- 类似于 合唱队形 —— hdu 1257 最少拦截系统
- 强大的vim配置文件
- 剑指offer:字符串的排列
- BZOJ1433假期的宿舍
- 蓝桥杯练习系统历届试题 错误票据
- 【iOS问题】The file “XXX.app” couldn’t be opened because you don’t have permission to view it.
- 如何解决double和float精度问题
- C++中new与malloc的10点区别
- 【LeetCode】217. Contains Duplicate
- online_judge_1389
- 如何在执行raw_input()之前清除输入缓冲区的数据
- 创建一个自己的动态HTML-备