- 与方式一的区别:查询时没有用到左连接,实际是作为两条sql语句进行查询的,在association标签里配置了子查询,而不是直接指定javaType,代码如下:
- 好处:MyBatis3.0后可以用方式一进行多表查询,但是如方式二这种分多条语句查询,可以做到按需查询,也就是懒加载。多个表一一关联,有时候并不需要查询到底,而是在多个层级间按需自动发出sql指令进行查询,动态代理,可以导入cglib.jar并在settings标签里配置懒加载。
Person.xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//ibatis.apache.org//DTD SQL Map 3.0//EN"
"http://ibatis.apache.org/dtd/ibatis-3-mapper.dtd">
<mapper namespace="com.yicha.entity.Person">
<!-- 方式一:对结果自定义映射方式 -->
<resultMap type="Person" id="myMap">
<result property="name" column="name"/>
<result property="age" column="age"/>
<!-- 一对一用association标签 -->
<!-- 这种映射方式由于是执行一条sql语句findStudent,无法懒加载(也就是按需加载) -->
<association property="card" javaType="Card">
<result property="cardNum" column="cardnum"/>
</association>
</resultMap>
<!-- 映射结果为自定义Map -->
<select id="findPerson" resultMap="myMap">
SELECT a.name,a.age,b.cardnum
FROM person a
LEFT JOIN card b
ON a.cardid=b.id
WHERE a.id=1
</select>
<!-- 方式二如何映射? -->
<resultMap type="Person" id="myMap2">
<result property="name" column="name"/>
<result property="age" column="age"/>
<association property="card" column="cardid" select="com.yicha.entity.Card.find2"></association>
</resultMap>
<!-- 方式二:分两次查询,一次查person表,一次查card表 -->
<select id="find1" resultMap="myMap2">
SELECT name,age,cardid
FROM person
WHERE id=1
</select>
</mapper>
Card.xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//ibatis.apache.org//DTD SQL Map 3.0//EN"
"http://ibatis.apache.org/dtd/ibatis-3-mapper.dtd">
<mapper namespace="com.yicha.entity.Card">
<select id="find2" resultType="Card">
SELECT cardnum
FROM card
WHERE id=#{cardid}
</select>
</mapper>
SqlMapConfig.xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE configuration PUBLIC "-//ibatis.apache.org//DTD SQL Map Config 3.0//EN"
"http://ibatis.apache.org/dtd/ibatis-3-config.dtd">
<configuration>
<!-- 取别名 -->
<typeAliases>
<typeAlias type="com.yicha.entity.Person" alias="Person"/>
<typeAlias type="com.yicha.entity.Card" alias="Card"/>
</typeAliases>
<!-- 配环境 -->
<environments default="e1">
<environment id="e1">
<!-- 先配事务 -->
<transactionManager type="JDBC"></transactionManager>
<!-- 配数据源 -->
<dataSource type="POOLED">
<property name="driver" value="com.mysql.jdbc.Driver"/>
<property name="url" value="jdbc:mysql://localhost:3306/test"/>
<property name="username" value="root"/>
<property name="password" value="root1205"/>
</dataSource>
</environment>
</environments>
<!-- 实体类映射文件 -->
<mappers>
<mapper resource="com/yicha/entity/Person.xml"/>
<mapper resource="com/yicha/entity/Card.xml"/>
</mappers>
</configuration>
结果: