日期:2014-05-16  浏览次数:20961 次

Spring3+mybatis+mysql整合详解(四)

使用Mybatis,你需要配置一个SqlMapConfig.xml的文件,主要用于配置sql语句的映射。当然,你也可以使用注解的方式直接将sql语句写入到class中,但我个人觉得sql语句后期优化的时候可能会时常调整。如果硬编码到class中,修改不方便。

?

好了,下面我们来看SqlMapConfig的配置:

?

<?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>
	<settings>
		<!-- 这个配置使全局的映射器启用或禁用缓存 -->
		<setting name="cacheEnabled" value="true" />
		<!-- 允许 JDBC 支持生成的键。需要适合的驱动。如果设置为 true 则这个设置强制生成的键被使用,尽管一些驱动拒绝兼容但仍然有效(比如 Derby) -->
		<setting name="useGeneratedKeys" value="true" />
		<!-- 配置默认的执行器。SIMPLE 执行器没有什么特别之处。REUSE 执行器重用预处理语句。BATCH 执行器重用语句和批量更新  -->
		<setting name="defaultExecutorType" value="REUSE" />
		<!-- 全局启用或禁用延迟加载。当禁用时,所有关联对象都会即时加载。 -->
		<setting name="lazyLoadingEnabled" value="true"/>
		<!-- 设置超时时间,它决定驱动等待一个数据库响应的时间。  -->
		<setting name="defaultStatementTimeout" value="25000"/> 
	</settings>
	
	<!-- 别名配置 -->
	<typeAliases>
		<typeAlias alias="Users" type="com.hl.usersmanager.model.Users" />
		<typeAlias alias="Login" type="com.hl.usersmanager.model.Login" />
		<typeAlias alias="LoginLog" type="com.hl.usersmanager.model.LoginLog" />
	</typeAliases>
	
	<!-- 指定映射器路径 -->
	<mappers>
		<mapper resource="com/hl/usersmanager/dao/mappers/UserMapper.xml" />
		<mapper resource="com/hl/usersmanager/dao/mappers/LoginMapper.xml" />
	</mappers>
</configuration> 

?

?settings部分都是可选配置,如果 你不配置,mybatis都设有默认值。附件指南中对相关配置讲解的很详细。

typeAliases部分主要是给一些java bean 配置一个别名,你使用这个bean的时候直接使用别名即可。特别在mappers配置文件中使用很方便,后面我们会讲到。这有点类似JNDI。

mappers部分为mybatis的Sql配置。这里你可以直接将sql配置写在mappers配置里面,也可以像本例中一样,新建一个mappers映射文件,然后在mappers配置中指向映射文件。

?

下面我们以LoginMapper.xml为例讲解一下mappers配置:

?

<?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">
<!-- 这里namespace必须是接口的路径,不然要运行的时候要报错 “is not known to the MapperRegistry”-->
<mapper namespace="com.hl.usersmanager.dao.ILoginMapper">
	<!-- 这里的id必须和接口中的方法名相同,不然运行的时候也要报错 -->
	<select id="findLogin" resultMap="findLoginResultMap">
		<!-- 这里sql结尾不能加分号,否则报“ORA-00911”的错误 -->
		select * from login inner join users on login.user_id=users.id
	</select>
	
	<!-- 自定义映射关系 -->
	<resultMap type="Login" id="findLoginResultMap">
		<!-- 标记结果作为ID 可以帮助提高整体效能 -->
		<id property="id" column="id"/>
		<!-- 注入到字段或JavaBean 属性的普通结果 -->
		<result property="loginName" column="loginName"/>
		<result property="passWord" column="passWord"/>
		<result property="loginTime" column="loginTime"/>
		<!-- 一个复杂的类型关联;许多结果将包成这种类型 (一对一映射) -->
		<association property="users" column="user_id" javaType="Users">
			<id property="id" column="id"/>
			<result property="name" column="name"/>
			<result property="age" column="age"/>
			<result property="phone" column="phone"/>
		</association>
	</resultMap>
	
	<select id="findLoginLogInfo" resultMap="findLoginLogInfoResultMap">
		select *,loginLog.id as log_id,users.id as users_id from login inner join users on login.user_id=users.id left join loginLog on loginLog.login_id=login.id
	</select>
	
	<resultMap type="Login" id="findLoginLogInfoResultMap">
		<id property="id" column="id"/>
		<result property="loginName" column="loginName"/>
		<result property="passWord" column="passWord"/>
		<result property="loginTime" column="loginTime"/>
		<association property="users" column="user_id" javaType="Users">
			<id property="id" column="users_id"/>
			<result property="name" column="name"/>
			<result property="age" column="age"/&