Mybatis(三):配置XML、ResultMap
Mybatis(三):配置文件
一、核心配置文件
核心配置文件属性罗列
configuration(配置)
properties(属性)
settings(设置)
typeAliases(类型别名)
typeHandlers(类型处理器)
objectFactory(对象工厂)
plugins(插件)
environments(环境配置)
environment(环境变量)
transactionManager(事务管理器)
dataSource(数据源)
databaseIdProvider(数据库厂商标识)
mappers(映射器)
environments元素
<environments default="development">
<environment id="development">
</environment>
</environments>
- 配置MyBatis的多套运行环境,将SQL映射到多个不同的数据库上,必须指定其中一个为默认运行环境(通过default指定)
- 子元素节点(environment)是具体的一套环境,通过设置id进行区别,id保证唯一!
mappers元素
-
映射器:定义映射sql语句文件
-
引用资源方式
-
<!-- 使用相对于类路径的资源引用 --> <mappers> <mapper resource="org/mybatis/builder/PostMapper.xml"/> </mappers>
-
<!-- 使用完全限定资源定位符(URL) --> <mappers> <mapper url="file:///var/mappers/AuthorMapper.xml"/> </mappers>
-
<!-- 使用映射器接口实现类的完全限定类名 需要配置文件名称和接口名称一致,并且位于同一目录下 --> <mappers> <mapper class="org.mybatis.builder.AuthorMapper"/> </mappers>
-
<!-- 将包内的映射器接口实现全部注册为映射器 但是需要配置文件名称和接口名称一致,并且位于同一目录下 --> <mappers> <package name="org.mybatis.builder"/> </mappers>
-
mapper元素
-
namespace(命名空间)作用:
- namespace和子元素的id联合保证唯一 , 区别不同的mapper
- 绑定DAO接口,namespace的命名必须跟某个接口同名
- 接口中的方法与映射文件中sql语句id应该一一对应
-
设置sql片段
<!--定义Sql片段 --> <sql id="cust"> cust_id,cust_name,cust_source </sql>
<!-- 引用sql片段 --> <select id="selectCustomer" resultType="com.ruanyuan.pojo.Customer"> select <include refid="cust"/> from customer </select>
二、Properties优化
-
在资源目录下创建db.properties文件
driver=com.mysql.jdbc.Driver url=jdbc:mysql://localhost:3306/mybatis?useSSL=true&useUnicode=true&characterEncoding=utf8 username=root password=
-
将db.properties文件导入核心配置xml中
<configuration>
<!--导入properties文件-->
<properties resource="db.properties"/>
<environments default="development">
<environment id="development">
<transactionManager type="JDBC"/>
<dataSource type="POOLED">
<property name="driver" value="${driver}"/>
<property name="url" value="${url}"/>
<property name="username" value="${username}"/>
<property name="password" value="${password}"/>
</dataSource>
</environment>
</environments>
<mappers>
<mapper resource="mapper/UserMapper.xml"/>
</mappers>
</configuration>
三、设置settings
作用:可以根据需求,设置不同的功能(如:懒加载,缓存,自动映射等)
<settings>
<setting name="cacheEnabled" value="true"/>
<setting name="lazyLoadingEnabled" value="true"/>
<setting name="autoMappingBehavior" value="PARTIAL"/>
</settings>
四、类型别名(typeAliases)
1.区别名的方法有三种
//第一种方法:通过类名
<typeAliases>
<typeAlias alias="Author" type="domain.blog.Author"/>
</typeAliases>
//第二种方法:通过包名
<typeAliases>
<package name="domain.blog"/> //应用:批量设置别名
</typeAliases>
//第三种方法:注解
@Alias("author")
public class Author {
...
}
五、typeHandler(类型处理器)元素
- 类型处理器,将从传入的参数从JAVA转化为数据库(JDBC)类型
- 可以自定义类型转换器,创建一个class,实现TypeHandler接口
六、事物管理器
- JDBC – 这个配置就是直接使用了 JDBC 的提交和回滚设置,它依赖于从数据源得到的连接来管理事务作用域。
- MANAGED –让容器来管理事务的整个生命周期。 默认情况下它会关闭连接,然而一些容器并不希望这样,因此需要将 closeConnection 属性设置为 false 来阻止它默认的关闭行为。
七、数据源(dataSource)
-
三种内建的数据源类型(也就是 type=”[UNPOOLED|POOLED|JNDI]”)
UNPOOLED:只是每次被请求时打开和关闭连接
POOLED:利用“池”的概念将 JDBC 连接对象组织起来,避免了创建新的连接实例时所必需的初始化和认证时间,使得并发 Web 应用快速响应请求的流行处理方式
JNDI:这个数据源的实现是为了能在如 EJB(如spring)或应用服务器这类容器中使用
-
数据源也有很多第三方的实现,比如dbcp,c3p0,druid
八、XML映射文件
1.SQL映射文件
cache
– 对给定命名空间的缓存配置。cache-ref
– 对其他命名空间缓存配置的引用。resultMap
– 是最复杂也是最强大的元素,用来描述如何从数据库结果集中来加载对象。sql
– 可被其他语句引用的可重用语句块。
九、ResultMap
解决的问题:属性名和字段名不一致
mybatis会根据查询的列名(会将列名转化为小写,数据库不区分大小写) , 去对应的实体类中查找相应列名的set方法设值 , 所以返回的结果可能为null【自动映射】
数据库字段:user{id,name,pwd}
实体类:user
- 方案一:为列名指定别名 , 别名和java实体类的属性名一致 .
<select id="selectUserById" resultType="User"> select id , name , pwd as password from user where id = #{id} </select>
- 方案二:使用结果集映射->ResultMap 【推荐】
自动映射:
<resultMap id="UserMap" type="User"> <!-- id为主键 --> <id column="id" property="id"/> <!-- column是数据库表的列名 , property是对应实体类的属性名 --> <result column="name" property="name"/> <result column="pwd" property="password"/> </resultMap> <select id="selectUserById" resultType="map"> select id , name , pwd from user where id = #{id} </select>
手动映射:
<resultMap id="UserMap" type="User"> <!-- id为主键 --> <id column="id" property="id"/> <!-- column是数据库表的列名 , property是对应实体类的属性名 --> <result column="name" property="name"/> <result column="pwd" property="password"/> </resultMap> <select id="selectUserById" resultMap="UserMap"> select id , name , pwd from user where id = #{id} </select>
十、mybatis插入数据时,自动获取主键的自增id
在Mapper文件中设置useGeneratedKeys和keyProperty两个属性,其中“keyProperty”值为主键的属性