NO.3 Mybatis.xml结构介绍

来源:互联网 发布:整形网络咨询师好做吗 编辑:程序博客网 时间:2024/05/29 14:31

NO.3 Mybatis.xml结构介绍

首先,我们来谈一下Mybatis.xml的configuration 配置问题
文档的顶层结构如下:

properties 属性settings 设置typeAliases 类型别名typeHandlers 类型处理器objectFactory 对象工厂plugins 插件environments 环境    environment 环境变量        transactionManager 事务管理器        dataSource 数据源databaseIdProvider 数据库厂商标识mappers 映射器

需要注意的是标签顺序固定

properties
这些属性都是可外部配置且可动态替换的,既可以在典型的 Java 属性文件中配置,亦可通过 properties 元素的子元素来传递

<properties resource="mybatis/DB.properties">    <!--将属性放在专门的property文件中,可用$引用-->    <property name="username" value="my"/></properties>

引用外部文件,可添加属性url
引入资源文件,可添加属性resource
若既引入配置文件中的值,又使用property,则以配置文件中的为准。

setting
这是 MyBatis 中极为重要的调整设置,它们会改变 MyBatis 的运行时行为,在下一篇Mybatis缓存中会提及,这里我们不做过多解释。

typeAliases
类型别名设置

<typeAliases>    <!--将单个Java类进行重命名操作 type="原名"  alias="重命名"-->    <typeAlias type="com.xt.mybatis.hi.user.entity.UserInfo" alias="userInfo"></typeAlias>    <!--批量将Java类定义别名,会将当前包下所有的Java类进行别名定义,规则将首字母变小写 name="包名"-->    <package name="com.xt.mybatis.hi.user.entity"></package> </typeAliases>

typeHandlers
类型处理器
无论是 MyBatis 在预处理语句(PreparedStatement)中设置一个参数时,还是从结果集中取出一个值时, 都会用类型处理器将获取的值以合适的方式转换成 Java 类型。

objectFactory 对象工厂
plugins 插件
我们不做过多解释

environments 环境
environment 环境变量
transactionManager 事务管理器
dataSource 数据源

<!--要想访问数据库,通过创建environments进行配置 --><!--默认的环境 ID(比如:default="xtDevelopment")--><environments default="xtDevelopment">    <!--每个 environment 元素定义的环境 ID(比如:id="xtDevelopment")-->    <environment id="xtDevelopment">        <!--事务管理器的配置(比如:type="JDBC")-->        <transactionManager type="JDBC"></transactionManager>        <!--数据源的配置(比如:type="POOLED")-->        <dataSource type="POOLED">            <!---->            <property name="driver" value="${mysql_driver}"/>                <property name="url" value="${mysql_url}"/>                <property name="username" value="${mysql_user}"/>                <property name="password" value="${mysql_passwd}"/>        </dataSource>    </environment></environments>

databaseIdProvider 数据库厂商标识
我们不做过多解释

mappers 映射器,代理对象
既然 MyBatis 的行为已经由上述元素配置完了,我们现在就要定义 SQL 映射语句了。但是首先我们需要告诉 MyBatis 到哪里去找到这些语句。 Java 在自动查找这方面没有提供一个很好的方法,所以最佳的方式是告诉 MyBatis 到哪里去找映射文件。

<mappers>    <mapper resource="com/xt/mybatis/hi/user/mapper/userMapper.xml"/>    <mapper resource="mybatis/mapper/userMapper.xml"/></mappers>

同样可以采用批量引入,package同别名配置。

这些配置会告诉了 MyBatis 去哪里找映射文件,剩下的细节就应该是每个 SQL 映射文件了,也就是接下来我们要讨论的。

下面,我们简单谈一下Mapper.xml中的SQL语句的映射问题。

在命名空间“com.xt.mybatis.hi.user.mapper.UserMapper”中定义了一个名为“queryUserInfoById”的映射语句。

<?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 namespace="com.xt.mybatis.hi.user.mapper.UserMapper">    <select id="queryUserInfoById" parameterType="int" resultMap="userInfoMap">        select user_id,user_name,passwd,tel_no,email from user_info where user_id = #{userId}    </select></mapper>

这样它就允许你使用指定的完全限定名“com.xt.mybatis.hi.user.mapper.UserMapper.queryUserInfoById”来调用映射语句:

SqlSession ss = sqlSessionFacory.openSession();        UserInfo ui = ss.selectOne("com.xt.mybatis.hi.user.mapper.UserMapper.queryUserInfoById",1);

这和使用完全限定名调用 Java 对象的方法是相似的。
除此之外,这个命名可以直接映射到在命名空间中同名的 Mapper 类,并在已映射的 select 语句中的名字、参数和返回类型匹配成方法。这样你就可以很容易地调用这个对应 Mapper 接口的方法。

UserMapper um = ss.getMapper(UserMapper.class);UserInfo ui =  um.queryUserInfoById(2));

下面我们给出一点解释:
–>配置命名空间<–
相比于简单的使用更长的完全限定名,能更进一步区分语句。命名空间使得你所见到的接口绑定成为可能,将它置于合适的 Java 包命名空间之下,使得代码更加整洁,并提高了 MyBatis 的可用性。
–>命名解析<–
为了减少输入量,MyBatis 对所有的命名配置元素(包括语句,结果映射,缓存等)使用了如下的命名解析规则:
*完全限定名(比如“com.xt.mybatis.hi.user.mapper.UserMapper.queryUserInfoById”)将被直接查找并且找到即用。
*短名称(比如“queryUserInfoById”)如果全局唯一也可以作为一个单独的引用。如果不唯一,有两个或两个以上的相同名称(比如“com.xt.mybatis.hi.user.mapper.UserMapper.queryUserInfoById ”和“com.xt.mybatis.hi.userDao.UserMapperTest.queryUserInfoById”),那么使用时就会收到错误报告说短名称是不唯一的,这种情况下就必须使用完全限定名。

依旧用如下的这个例子:

<select id="queryUserInfoById" parameterType="int" resultMap="userInfoMap">    select user_id,user_name,passwd,tel_no,email from user_info where user_id = #{userId}</select>

这个语句被称作 queryUserInfoById,接受一个 int(或 Integer)类型的参数,并返回一个 userInfoMap 类型的对象。
参数符号#{userId},这就告诉 MyBatis 创建一个预处理语句参数,通过 JDBC,这样的一个参数在 SQL 中会由一个“?”来标识,并被传递到一个新的预处理语句中。

id————-在命名空间中唯一的标识符,可以被用来引用这条语句。
parameterType————-传入SQL语句的参数类型
resultType————-SQL语句查询返回的参数类型
resultMap————-外部 resultMap 的命名引用

此时,需要在其上方定义resultMap=”userInfoMap”,resultMap一般都定义在最开始的位置,是数据字段名与输出类型属性的一个对应。

<!--type:代表输出的javaBean类型--><resultMap type="com.xt.mybatis.hi.user.entity.UserInfo" id="userInfoMap">    <!--定义主键-->    <id column="user_id" property="userId" />    <result column="user_name" property="userName"/>    <result column="tel_no" property="telNo"/></resultMap>

数据变更语句 insert,update 和 delete 的实现非常接近,属性同select。

<insert id="insertUserInfo" parameterType="com.xt.mybatis.hi.user.entity.UserInfo">        insert into user_info values (#{userId},#{userName},password(#{passwd}),#{telNo},#{email})    </insert>    <update id="updateUserInfo" parameterType="com.xt.mybatis.hi.user.entity.UserInfo">        update user_info set user_name = #{userName},tel_no = #{telNo},email = #{email} where user_id = #{userId}    </update>    <delete id="deleteUserInfoById" parameterType="int">        delete from user_info where user_id = #{value}    </delete>

接下来,我们谈一下动态SQL

动态SQL是Mybatis的核心,是对SQL语句的灵活操作。通过表达式判断,对SQL语句的灵活拼接和封装。
标签,可以根据条件动态生成where条件查询,如果有子条件封装,可以动态去掉子语句中的and关键字
将多次出现的SQL字段抽离出来,体现了去重思想

<sql id="queryUserWhere">    <where>        <if test="userName != null and userName != ''">            and user_name like '%${userName}%'        </if>        <if test="gender != null and gender !=''">            and gender = #{gender}        </if>        <if test="userIds != null">            and user_id = in            <foreach collection="userIds" item="userId" open="(" close=")" separator=",">                #{userId}            </foreach>        </if>        <if test="dept.deptId != null">            and dept_id = #{dept.deptId}        </if>    </where></sql>

SQL片段,引用的话采用

<select id="queryUserInfo" parameterType="userDTO" resultMap="userInfoMap">    select user_id,user_name,passwd,tel_no,email from user_info     <include refid="queryUserWhere"></include></select>

采用foreach 自定义方式遍历集合

<foreach collection="userIds" item="userId" open="(" close=")" separator=",">        #{userId}</foreach>

collection 表示集合名称
item表示集合元素
open表示开始位置拼接的字符
separator表示分隔符
close表示结束位置拼接的字符

原创粉丝点击