Mybatis框架(2)--xml配置

前言:

昨天半天时间肝完基于注解的Mybatis,发现的确太散乱了,但真就简便!详见前篇:Mybatis框架(1)–注解

今天来搞一搞写起来比较繁琐但是一目了然的基于xml配置的Mybatis。其实大差不差,原理都是那么一回事~

以下为个人跟着视频内容整理,有错误请一定指出!勿喷,谢谢!视频来源:B站:BV1mE411X7yp
黑马程序出品不会错!!!强推~(黑马快打钱 x)
走起!


先上代码,再基于代码解释。架构同前篇,蓝色框框中的文件不再赘述,直接看前篇~
Mybatis框架(2)--xml配置_第1张图片
User.java (User属性和数据库user表中的列名命名不统一 ->

  • xml如何配置请仔细看该实体类Dao在resource中对应的xml文件~

)
Mybatis框架(2)--xml配置_第2张图片
IUserDao.java

  • 【最后一个方法在后文中详细解释】

Mybatis框架(2)--xml配置_第3张图片

重头戏来了:

xml配置需要根据每一个持久层Dao接口在resources下创建一个对应的xml文件!
在这里插入图片描述
IUserDao.xml 配置如下:




<mapper namespace="com.demo.dao.IUserDao">
    
    <resultMap id="userMap" type="user">
        
        <id property="userId" column="id">id>
        
        <result property="userName" column="username">result>
        <result property="userAddress" column="address">result>
        <result property="userSex" column="sex">result>
        <result property="userBirthday" column="birthday">result>
    resultMap>

    
    <select id="findAll" resultMap="userMap">
        
        select * from user;
    select>

    
    <insert id="saveUser" parameterType="user">
        
        <selectKey keyProperty="userId" keyColumn="id" resultType="int" order="AFTER">
            select last_insert_id();
        selectKey>
        insert into user(username,address,sex,birthday)values(#{userName},#{userAddress},#{userSex},#{userBirthday});
    insert>

    
    <update id="updateUser" parameterType="USER">
        update user set username=#{userName},address=#{userAddress},sex=#{userSex},birthday=#{userBirthday} where id=#{userId}
    update>

    
    <delete id="deleteUser" parameterType="java.lang.Integer">
        delete from user where id = #{uid}
    delete>

    
    <select id="findById" parameterType="INT" resultMap="userMap">
        select * from user where id = #{uid}
    select>

    
    <select id="findByName" parameterType="string" resultMap="userMap">
        select * from user where username like #{name}
        
        
    select>

    
    <select id="findTotal" resultType="int">
        select count(id) from user;
    select>

    
    <select id="findUserByVo" parameterType="com.demo.domain.QueryVo" resultMap="userMap">
        select * from user where username like #{user.userName}
    select>
mapper>

配置文件中的标签们

parameterType:输入参数的类型
分为3种情况:

  1. 简单类型:int string java.lang.Integer
  2. pojo对象:(我对pojo的理解就是引用类型)用OGNL表达式解析对象字段的值,#{} ${}括号中的值为pojo属性名

OGNL(Object Graphic Navigation Language):通过对象的取值方法来获取数据,省略get就能获取。
e.g.
java类中的写法 user.getUserName();
OGNL写法:user.userName
而在mybatis的配置文件中无需写前面的”对象."是因为:在parameterType已经指定了属性所属的类。

  1. pojo包装对象:当需要多表查询的时候,可以通过pojo传递查询条件,即pojo类中包含pojo。

这里来解释之前提到的“最后一个方法”
domain包中除了实体类User外,又新建了一个名为QueryVo的实体类,把其他实体类对象作为了它的属性,实现pojo套pojo【禁止套娃 】。
Mybatis框架(2)--xml配置_第4张图片
在IUDao.xml配置文件中,这里where后的查询条件可以用QueryVo类下的对象的属性来限制,达到多表查询的作用。

    
    <select id="findUserByVo" parameterType="com.demo.domain.QueryVo" resultMap="userMap">
        select * from user where username like #{user.userName}
    select>

在测试类中:

    @Test
    public void testFindByVo(){
        QueryVo vo = new QueryVo();
        User user = new User();
        user.setUserName("%花%");
        vo.setUser(user);
        List<User> users = userDao.findUserByVo(vo);
        for(User u:users){
            System.out.println(u);
        }
    }

最后再补充一下dao对应xml的总体结构:

<mapper  namespace="对应dao层接口的全限定类名">
 ​	
 	resultMap标签:当实体类属性和数据库表中不一致时需要在此产生映射
 ​			id属性:这组映射的名称
 ​			type属性:是什么类型的
​					id标签:主键属性
 ​					result标签:非主键的属性
 ​							property属性:实体类属性名
 ​							colunm属性:数据库表中的列名