mybatis框架mapper.xml映射文件解析

主要有两个配置文件:config.xml和Mapper.xml,当然,这两种配置文件可以自定义文件名。
config.xml是全局配置文件,主要配置MyBatis的数据源(DataSource),事务管理(TransactionManager),以及打印SQL语句,开启二级缓存,设置实体类别名等功能。
Mapper.xml的作用是"半自动"的ORM框架,即SQL语句需要开发者自定义,MyBatis的关注点在POJO与SQL之间的映射关系。

首先来介绍Mapper.xml常用属性:
parameterType:参数数据类型

(1)基本数据类型,通过id查询User。
UserDao:

//通过id查找User
public User getById(int id);

UserDao.xml:

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper3.0//EN""http://mybatis.org/dtd/mybatis-3-mapper.dtd"> 
<mapper>
    <select id="getById" parameterType="int" resultType="com.xf.pojo.User">                         
        select * from t_user where name = #{name}
    </select>
</mapper>

(2)String类型,通过name查User
UserDao:

//通过name查询User
public User getByName(String name);

UserDao.xml:

<selectid="get2"parameterType="java.lang.String" resultType="com.xf.pojo.User">
    select * from t_user where name = #{name}
 </select>

(3)包装类,通过id查询User。
UserDao:

//通过id查询User
public User getById(Integer id);

UserDao.xml:

<selectid="getById"parameterType="java.lang.Integer" resultType="com.xf.pojo.User">
     select * from t_user where id=#{id}
</select>

(4)多个参数,通过name和age查询User。两个参数分别是String类型和int类型,类型不一致,所以此时parameterType可以省略,通过参数下标取出参数值
UserDao:

//通过name和age查询User
public User getByNameAge(int id,String name);

UserDao.xml:

<selectid="getByNameAge"resultType="com.xf.pojo.User">
      select * from t_user where name = #{0} and age = #{1}
</select>

(5)POJO,很显然,当有多个参数时,一个一个写太麻烦了,这时候我们可以将参数列表进行封装,将封装对象作为parameterType的值。
UserDao:

//根据Usesr封装对象查询User
public User getByUser(User user);

UserDao.xml:

<selectid="getByUser"parameterType="com.xf.pojo.User" resultType="com.xf.pojo.User">
     select * from t_user where name = #{name} and age = #{age}
</select>

resultType:结果类型
(1)基本数据类型,统计User总数。
UserDao:

//通过User总数量
public int getCount();

UserDao.xml:

<select id="getCount" resultType="int">      
    select count(*) from t_user
</select>

(2)包装类,统计User总数。
UserDao:

//通过User总数量
public Integer getCount();

UserDao.xml:

<selectid="getCount"resultType="java.lang.Integer">       
    select count(*) from t_user
</select>

(3)String类型,根据id查询User的name值。
UserDao:

//根据id查询User的name
public String getNameById(int id);

UserDao.xml:

<selectid="getNameById"parameterType="int"resultType="java.lang.String">       
     select name from user where id = #{name}
</select>

(4)POJO,如通过id查询User,上面已经介绍过了,这里就不再重复了。级联查询
一对多
我们现在查询的User是单表查询,如果是多表关联查询,比如查询Student同时级联对应的Classes,如何处理呢?
使用resultType无法完成,我们以通过id查询Student来举例。
SQL:

 select * from student as s,classes as c where s.cid = c.c_id and s.id = 1;

查询结果:
在这里插入图片描述
实体类Student:

在这里插入代码片

实体类进行映射,将字段的值赋给对应的属性,若字段名与属性名一致,完成赋值,那么问题来了。
在这里插入图片描述

如图,id,name,address,tel,score属性可以对应字段,classes属性没有对应的字段,准确的讲,classes属性需要对应的对象为c_id,c_name封装起来的对象。此时,需要使用resultMap来完成映射。
StudentDao:

 //通过id查询Student
 public Student getById(int id);

StudentDao.xml,使用association标签配置classes级联,因为一个Student只能对应一个Classes。

<resultMap type="student" id="studentMap">      
   <id property="id" column="id"/>
   <result property="name" column="name"/>       
   <result property="address" column="address"/>       
   <result property="tel" column="tel"/>       
   <result property="score" column="score"/>       
   <!-- 映射classes属性 -->
   <associationproperty="classes"javaType="com.xf.pojo.Classes">           
   <id property="id" column="c_id"/>           
   <result property="name" column="c_name"/>       
   </association></resultMap>
<selectid="getById"parameterType="int"resultMap="studentMap">   
   select * from student as s,classes as c where s.cid = c.c_id and s.id = #{id};
</select>

同理,反过来查询Classes,将级联的所有Student一并查询。
ClassesDao:

 //根据id查询Classes
 public Classes getById(int id);

ClassesDao.xml,使用collection标签配置students级联,因为一个Classes可以对应多个Student。

<resultMap type="classes" id="classesMap">
   <id property="id" column="c_id"/>   
   <result property="name" column="c_name"/>        
   <!-- 映射students属性 -->
   <collectionproperty="students"ofType="student">           
   <id property="id" column="id"/>           
   <result property="name" column="name"/>           
   <result property="address" column="address"/>           
   <result property="tel" column="tel"/>           
   <result property="score" column="score"/>       
   </collection>
</resultMap>
<selectid="getById"parameterType="int"resultMap="classesMap">   
    select * from classes as c,student as s where c.c_id = s.cid and c.c_id = #{id};
</select>

需要注意的是:association标签,通过设置javaType属性,映射实体类,collection标签,通过设置ofType属性映射实体类。

猜你喜欢

转载自blog.csdn.net/WG102753/article/details/107942544