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表示结束位置拼接的字符
- NO.3 Mybatis.xml结构介绍
- mybatis-config.xml文件标签介绍
- MyBatis中XML 映射配置文件的简单介绍
- mybatis,xml
- MyBatis.xml
- mybatis xml
- XML基础3(XML 树结构)
- Mybatis介绍
- mybatis介绍
- Mybatis介绍
- mybatis介绍
- mybatis介绍
- mybatis--介绍
- Mybatis介绍
- MyBatis 介绍
- Mybatis介绍
- 【Mybatis】--介绍
- Mybatis介绍
- 堆
- LeetCode--Unique Binary Search Trees II
- 大小写字母的转换
- 知识点
- Android --- 常用的系统服务(一)
- NO.3 Mybatis.xml结构介绍
- Http状态码总结大全(200,404,500 etc)
- Win10 64位下用minGW编译64位FFMpeg
- spring-激活profile(java)
- SDNUOJ1099前缀判断(set)
- Unity Shader 学习笔记(4)Unity Shader内置变量、函数,Shader Model
- 习题6 6.3
- Java面试题全集(上)
- CSS 万能的 sticky-footer 写法