一、Mybatis的全局配置文件

1、SqlMapConfig.xml是mybatis的全局配置文件,配置内容如下:

properties(属性)

settings(全局配置参数)

typeAliases(类型别名)

typeHandlers(类型处理器)

objectFactory(对象工厂)

plugins(插件)

environments(环境集合属性对象)

--environment(环境子属性对象)

----transactionManager(事务管理)

----dataSource(数据源)

mappers(映射器)





2、properties

将数据库连接参数单独配置在db.properties中,放在类路径下。这样只需要在SqlMapConfig.xml中加载db.properties的属性值。这样在SqlMapConfig.xml中就不需要对数据库连接参数硬编码。

将数据库连接参数只配置在db.properties中,原因:方便对参数进行统一管理,其它xml可以引用该db.properties。

使用示例:

db.properties

jdbc.driver=com.mysql.jdbc.Driver
jdbc.url=jdbc:mysql://localhost:3306/mybatis
jdbc.username=root
jdbc.password=root

相应的SqlMapConfig.xml

<properties resource="db.properties"/>
<environments default="development">
<environment id="development">
<transactionManager type="JDBC"/>
<dataSource type="POOLED">
<property name="driver" value="${jdbc.driver}"/>
<property name="url" value="${jdbc.url}"/>
<property name="username" value="${jdbc.username}"/>
<property name="password" value="${jdbc.password}"/>
</dataSource>
</environment>
</environments>

注意: MyBatis 将按照下面的顺序来加载属性:

首先在properties标签中指定的属性文件首先被读取。 

然后会读取properties元素中resource或 url 加载的属性,它会覆盖已读取的同名属性。 

最后读取parameterType传递的属性,它会覆盖已读取的同名属性。

常用做法:

不要在properties元素体内添加任何属性值,只将属性值定义在外部properties文件中。

在properties文件中定义属性名要有一定的特殊性,如:XXXXX.XXXXX.XXXX的形式,就像jdbc.driver。这样可以防止和parameterType传递的属性名冲突,从而被覆盖掉。





3、settings

mybatis全局配置参数,全局参数将会影响mybatis的运行行为。比如:开启二级缓存、开启延迟加载。具体可配置情况如下:





配置示例:

<settings>
<setting name="cacheEnabled" value="true"/>
<setting name="lazyLoadingEnabled" value="true"/>
<setting name="multipleResultSetsEnabled" value="true"/>
</settings>

4、typeAliases

typeAliases可以用来自定义别名。在mapper.xml中,定义很多的statement,而statement需要parameterType指定输入参数的类型、需要resultType指定输出结果的映射类型。如果在指定类型时输入类型全路径,不方便进行开发,可以针对parameterType或resultType指定的类型定义一些别名,在mapper.xml中通过别名定义,方便开发。

例如:

<typeAliases>
<!-- 单个别名定义 -->
<typeAlias alias="user" type="com.kang.pojo.User"/>
<!-- 批量别名定义,扫描整个包下的类,别名为类名(首字母大小写都可以) -->
<package name="com.kang.pojo"/>
<package name="其它包"/>
</typeAliases>

mapper.xml的引用形式

<select id="findUserById" parameterType="int" resultType="user">
SELECT * FROM USER WHERE id=#{value}
</select>

5、typeHandlers

mybatis中通过typeHandlers完成jdbc类型和java类型的转换。通常情况下,mybatis提供的类型处理器满足日常需要,不需要自定义。这里不作详述,具体可参考Mybatis的官方文档。





6、environments

MyBatis 可以配置多种环境。这会帮助你将 SQL 映射应用于多种数据库之中。但是要记得一个很重要的问题:你可以配置多种环境,但每个数据库对应一个 SqlSessionFactory。

所以,如果你想连接两个数据库,你需要创建两个 SqlSessionFactory 实例,每个数据库对应一个。而如果是三个数据库,你就需要三个实例,以此类推。

为了明确创建哪种环境,你可以将它作为可选的参数传递给 SqlSessionFactoryBuilder。

可以接受环境配置的两个方法签名是:

SqlSessionFactory factory = sqlSessionFactoryBuilder.build(reader, environment);

SqlSessionFactory factory = sqlSessionFactoryBuilder.build(reader,environment,properties);

如果环境被忽略,那么默认环境将会被加载,按照如下方式进行:

SqlSessionFactory factory = sqlSessionFactoryBuilder.build(reader);

SqlSessionFactory factory = sqlSessionFactoryBuilder.build(reader,properties);

配置示例:

<environments default="development">
<environment id="development">
<!-- 使用jdbc事务管理,事务控制由mybatis-->
<transactionManager type="JDBC" />
<!-- 数据库连接池,由mybatis管理-->
<dataSource type="POOLED">
<property name="driver" value="${jdbc.driver}" />
<property name="url" value="${jdbc.url}" />
<property name="username" value="${jdbc.username}" />
<property name="password" value="${jdbc.password}" />
</dataSource>
</environment>
</environments>

注意:

---默认的环境 ID(比如: default=”development”)。

---每个 environment 元素定义的环境 ID(比如: id=”development”)。

---事务管理器的配置(比如: type=”JDBC”)。

默认的环境和环境 ID 是自我解释的。你可以使用你喜欢的名称来命名,只要确定默认

的要匹配其中之一。





7、mappers

Mapper配置的几种方法:

第一种(常用)

<mapper resource=" " />

resource指向的是相对于类路径下的目录

如:<mapper resource="sqlmap/User.xml" />

第二种

<mapper url=" " />

使用完全限定路径

如:<mapper url="file:///D:\workspace\mybatis1\config\sqlmap\User.xml" />

第三种

<mapper class=" " />

使用mapper接口类路径

如:<mapper class="cn.kang.mapper.UserMapper"/>

注意:此种方法要求mapper接口名称和mapper映射文件名称相同,且放在同一个目录中。

第四种(推荐)

<package name=""/>

注册指定包下的所有mapper接口

如:<package name="cn.kang.mapper"/>

注意:此种方法要求mapper接口名称和mapper映射文件名称相同,且放在同一个目录中。

使用示例:

<mappers>
<mapper resource="sqlmap/User.xml"/>
<package name="cn.kang.mapper"/>
</mappers>

二、POJO的映射文件

Mapper.xml映射文件中定义了操作数据库的sql,每个sql是一个statement,映射文件是mybatis的核心。

1、parameterType(输入类型)

通过parameterType指定输入参数的类型,类型可以是简单类型、hashmap、pojo的包装类型。

#{}实现的是向prepareStatement中的预处理语句中设置参数值,sql语句中#{}表示一个占位符即?。

例如:

<select id="findUserById" parameterType="int" resultType="user">
select * from user where id = #{id}
</select>

使用占位符#{}可以有效防止sql注入,在使用时不需要关心参数值的类型,mybatis会自动进行java类型和jdbc类型的转换。#{}可以接收简单类型值或pojo属性值,如果parameterType传输单个简单类型值,#{}括号中可以是value或其它名称。

${}和#{}不同,通过${}可以将parameterType 传入的内容拼接在sql中且不进行jdbc类型转换, ${}可以接收简单类型值或pojo属性值,如果parameterType传输单个简单类型值,${}括号中只能是value。使用${}不能防止sql注入,但是有时用${}会非常方便,如下的例子:

<select id="selectUserByName" parameterType="string" resultType="user">
select * from user where username like '%${value}%'
</select>

使用#{}则传入的字符串中必须有%号,而%是人为拼接在参数中,显然有点麻烦,如果采用${}在sql中拼接为%的方式则在调用mapper接口传递参数就方便很多。

如果使用${}原始符号则必须人为在传参数中加%。

List<User> list = userMapper.selectUserByName("%管理员%");

如果使用%${value}%则不用人为在参数中加%。

List<User>list = userMapper.selectUserByName("管理员");





parameterType也可以传递pojo对象。Mybatis使用ognl表达式解析对象字段的值,如下例子:

<!—传递pojo对象综合查询用户信息 -->
<select id="findUserByUser" parameterType="user" resultType="user">
select * from user where id=#{id} and username like '%${username}%'
</select>

上边%${username}%中的username就是user对象中对应的属性名称。



parameterType还可以传递pojo包装对象(也就是将多个对象包装为一个对象)。开发中通过pojo传递查询条件 ,查询条件是综合的查询条件,不仅包括用户查询条件还包括其它的查询条件(比如将用户购买商品信息也作为查询条件),这时可以使用包装对象传递输入参数。

例如下面的包装对象:

public class QueryVo {
private User user;
private UserCustom userCustom;
}

在映射文件中的使用

<!—传递pojo包装对象综合查询用户信息 -->
<select id="findUserByUser" parameterType="queryVo" resultType="user">
select * from user where id=#{user.id} and username like '%${user.username}%'
</select>

可以看出通过使用类似java中对象访问属性的形式来进行参数传递。



parameterType也可以传递hashmap类型的参数

在xml映射文件中使用形式如下:

<select id="findUserByHashmap" parameterType="hashmap" resultType="user">
select * from user where id=#{id} and username like '%${username}%'
</select>

在代码中的调用形式如下:

Public void testFindUserByHashmap()throws Exception{
//获取session
SqlSession session = sqlSessionFactory.openSession();
//获限mapper接口实例
UserMapper userMapper = session.getMapper(UserMapper.class);
//构造查询条件Hashmap对象
HashMap<String, Object> map = new HashMap<String, Object>();
map.put("id", 1);
map.put("username", "管理员"); //传递Hashmap对象查询用户列表
List<User>list = userMapper.findUserByHashmap(map);
//关闭session
session.close();
}

这样,可以把参数以key-value的形式传给Mybatis。如果传递的map中的key和xml映射文件的sql语句中解析的key不一致,系统不会报错,但是通过key获取值为空。



2、resultType

使用resultType可以进行输出映射,只有查询出来的列名和pojo中的属性名一致,才可以映射成功。如果查询出来的列名和pojo中的属性名全部不一致,就不会创建pojo对象。但是只要查询出来的列名和pojo中的属性有一个一致,就会创建pojo对象。

resultType可以输出简单类型。例如查询用户信息的综合查询列表总数,通过查询总数和上边用户综合查询列表才可以实现分页。

<!-- 获取用户列表总数 -->
<select id="findUserCount" parameterType="user" resultType="int">
select count(*) from user
</select>

resultType可以输出pojo对象和pojo列表。当使用动态代理时,输出pojo对象和输出pojo列表在xml映射文件中定义的resultType是一样的,而生成的动态代理对象中是根据mapper方法的返回值类型确定是调用selectOne(返回单个对象调用)还是selectList (返回集合对象调用 )。





3、resultMap

mybatis中可以使用resultMap完成高级输出结果映射。如果查询出来的列名和定义的pojo属性名不一致,就可以通过定义一个resultMap对列名和pojo属性名之间作一个映射关系。然后使用resultMap作为statement的输出映射类型。resultMap可以实现将查询结果映射为复杂类型的pojo,比如在查询结果映射对象中包括pojo和list实现一对一查询和一对多查询。这里先不做具体详述,有兴趣的可以参看Mybatis的官方文档。

Mybatis的配置文件和映射文件详解的更多相关文章

  1. Hibernate配置文件和映射文件详解

    Hibernate是一个彻底的ORM(Object Relational Mapping,对象关系映射)开源框架. 我们先看一下官方文档所给出的,Hibernate 体系结构的高层视图: 其中PO=P ...

  2. MyBatis的SQL语句映射文件详解

    SQL 映射XML 文件是所有sql语句放置的地方.需要定义一个workspace,一般定义为对应的接口类的路径.写好SQL语句映射文件后,需要在MyBAtis配置文件mappers标签中引用 < ...

  3. MyBatis的SQL语句映射文件详解(三)----多参数传递的几种方式

    1.单一基本类型参数(String,int等) 单一的基本类型参数,将对应语句中的parameterType的值与参数的类型相同.然后直接 用“#{参数名}” 来获取 java代码 //String类 ...

  4. MyBatis的SQL语句映射文件详解(二)----增删改查

    1.select语句 public List<User> findUser() {  // TODO Auto-generated method stub    List users= ( ...

  5. Mybatis SQL映射文件详解

    Mybatis SQL映射文件详解 mybatis除了有全局配置文件,还有映射文件,在映射文件中可以编写以下的顶级元素标签: cache – 该命名空间的缓存配置. cache-ref – 引用其它命 ...

  6. MyBatis 映射文件详解(六)

    MyBatis 配置文件类型 MyBatis配置文件有两种类型,如下: 全局配置文件(如 mybatis-config.xml) Mapper XML 映射文件(如 UserMapper.xml) 上 ...

  7. Mybatis学习(三)————— 映射文件详解

    前面说了全局配置文件中内容的详解,大家应该清楚了,现在来说说这映射文件,这章就对输入映射.输出映射.动态sql这几个知识点进行说明,其中高级映射(一对一,一对多,多对多映射)在下一章进行说明. 一.输 ...

  8. Mybatis(三) 映射文件详解

    前面说了全局配置文件中内容的详解,大家应该清楚了,现在来说说这映射文件,这章就对输入映射.输出映射.动态sql这几个知识点进行说明,其中高级映射(一对一,一对多,多对多映射)在下一章进行说明. 一.输 ...

  9. MyBatis 映射文件详解

    1. MyBatis 映射文件之<select>标签 <select>用来定义查询操作; "id": 唯一标识符,需要和接口中的方法名一致; paramet ...

随机推荐

  1. AC日记——文艺平衡树 洛谷 P3391

    文艺平衡树 思路: splay翻转操作模板: 虚拟最左最右端点,然后每次都把l翻转到root,r+2翻转到root的右节点: 然后在r+2的左节点上打标记: 标记需要在旋转,rank,print时下放 ...

  2. Python: Write UTF-8 characters to csv file

    To use codecs, we can write UTF-8 characters into csv file import codecs with open('ExcelUtf8.csv', ...

  3. Jenkins里邮件插件触发器配置和Send to Developers到底是什么意思(转)

    邮件触发类型介绍(Triggers) By default, the onlytrigger configured is the "Failure" trigger.  To ad ...

  4. XCode设置竖屏

    选中你的项目,在General这个标签内,Deoployment info的这个分组,有一个Device Orientation 标签,内有一个Portrait的选项,选中是竖屏,取消选中是横屏

  5. 安全 -- mysql参数化查询,防止Mysql注入

    参数化查询(Parameterized Query 或 Parameterized Statement)是指在设计与数据库链接并访问数据时,在需要填入数值或数据的地方,使用参数(Parameter) ...

  6. VS中Debug模式和Release模式的区别

    一.Debug 和 Release 编译方式的本质区别 Debug 通常称为调试版本,它包含调试信息,并且不作任何优化,便于程序员调试程序.Release 称为发布版本,它往往是进行了各种优化,使得程 ...

  7. OpenCV头文件包含问题

    opencv从2.2版本以后<opencv root>include下有两个文件夹 opencv 和opencv2.从官方的意思来看,它逐渐喜欢用opencv2里面的那种包含头文件的方式. ...

  8. 2017.2.15 开涛shiro教程-第二十一章-授予身份与切换身份(一) table、entity、service、dao

    原博客地址:http://jinnianshilongnian.iteye.com/blog/2018398 根据下载的pdf学习. 第二十一章 授予身份与切换身份(一) 1.使用场景 某个领导因为某 ...

  9. vuex mapState使用

    <template> <div> {{count}} <button @click="handleIncrease">+5</button ...

  10. vue key 的另外一个用法 过度

    key也可以用于强制替换元素/组件而不是重复使用它.当你遇到如下场景时它可能会很有用: 完整地触发组件的生命周期钩子 触发过渡 例如: <transition> <span :key ...