MyBatis初探

简介

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


  1. 何为高级映射?
    ORM
  2. 持久层的概念
    指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,'&amp;',ip_fetch) as char) as key_v,  
        <!-- xml对&符号做了预定义,使用&amp;代替&符号 -->
        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();
        }
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值