Mybatis框架(二)

版权声明:@Wrial https://blog.csdn.net/qq_42605968/article/details/86765897

在上一篇文章,我用小的demo演示了Mybatis的增删改查操作,也算是入了门,下边就简单了解一下Mybatis的架构体系。因为只要了解了它的架构体系,写Mybatis程序就可以很快的按部就班。
在这里插入图片描述
接口层:为开发人口提供调用
数据处理层:负责sql操作的解析,执行和对结果的映射
基础支撑层:负责最基础的功能支撑,其他功能要建立在基础功能之上
上边是个总的架构图,下边为Mybatis贴近使用层面上的架构图。(更像一个程序的执行流程图)在这里插入图片描述

程序执行:
1.加载核心配置文件和映射文件(最好一个表一个映射文件)
2.获取SqlSessionFactory对象(SqlSessionFactoryBuilder)
3.从SqlSessionFactory中获取SqlSession对象
4.输入映射参数——》数据库——》输出映射参数


上边就是简单的对Mybatis的架构的分析,里面的实现用了很多的设计模式(听说,毕竟我也是初学)。下边呢就是对Mybatis更进一步的了解和使用。 在前面的学习中,我们测试了数据的增删改查的一系列操作,把它们串起来也就相当于我们平时写的dao,这个整合过程很简单就不演示了,下来我就说说在传统dao基础上的动态代理的实现。
利用动态代理包装Dao实现增删改查

在动态代理中不用再亲自写Dao的实现,只需要将xml的sql id一系列参数和Dao对应,在代理内部自动根据xml对Dao进行实现。
使用动态代理必须遵守的准则:
1.namespace的命名要为Dao的包路径
2.sql id要和接口里的方法名一致
3.传入的参数类型和个数与xml中的parameterType一致
4.返回值的类型要和xml中returnType一致

步骤:
1.建立一个新的映射配置文件(和传统的Dao就仅仅是命名空间的变化)

<?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">
<!--动态代理的开发规则-->
<!--1.namespace 必须是接口全路径名-->
<!--2.xml的id要和方法名一致-->
<!--3.入参一致和parameterType一致-->
<!--4.返回值一致和resultType一致-->

<mapper namespace="DaoProxy.UserMapper">
    <select id="getUserById" parameterType="Integer" resultType="pojo.User">
        select *
        from user
        where id = #{id}
    </select>
    <!--#{} 传入参数-->
    <!-- ${} 字符串拼接      如果入参是普通属性只能写value,pojo的话就写pojo-->
    <select id="getUserByLikeIt" parameterType="String" resultType="pojo.User">
        select username
        from user
        where username like '%${value}%'
    </select>
    <insert id="insertUser" parameterType="pojo.User">
        insert into user(username, birthday, sex, address)
        values (#{username}, #{birthday}, #{sex}, #{address});
    </insert>
    <!-- selectKey:用于配置主键返回
	 		 keyProperty:要绑定的pojo属性
	 		 resultType:属性数据类型
	 		 order:指定什么时候执行,AFTER之后
	 	-->
    <insert id="insertUserReturnId" parameterType="pojo.User" useGeneratedKeys="true" keyProperty="id">
        insert into user(username, birthday, sex, address)
        values (#{username}, #{birthday}, #{sex}, #{address});
    </insert>
    <insert id="insertUserReturnUuId" parameterType="pojo.User">
        <selectKey keyProperty="uuid1" resultType="String" order="BEFORE">
            SELECT UUID();
        </selectKey>
        insert into user(username, birthday, sex, address,uuid1) values
        (#{username},#{birthday},#{sex},#{address},#{uuid1});
    </insert>
    <update id="updateUserName" parameterType="pojo.User">
        update user
        set username = #{username}
        where id = #{id};
    </update>
    <delete id="deleteUser" parameterType="int">
        delete
        from user
        where id = #{id};
    </delete>
</mapper>

2.将新读映射文件加入到Mybatis的核心配置文件里(在上一个实例基础上加一个映射文件)

<?xml version="1.0" encoding="UTF-8" ?>

3.建立测试类进行测试

package com.company;

import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.junit.Test;
import pojo.User;
import utils.SqlSessionFactoryUtils;

import java.io.IOException;

public class testProxy {
    @Test
    public void testGetUserById() throws IOException {
        SqlSessionFactory sqlSessionFactory = SqlSessionFactoryUtils.getSqlSessionFactory("SqlMapCofig.xml");

        SqlSession sqlSession = sqlSessionFactory.openSession();
        User user = sqlSession.selectOne("DaoProxy.UserMapper.getUserById", 1);
        System.out.println(user.toString());
        sqlSession.close();

    }
}

用到的提取出的SqlFactoryUtils

package utils;

import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;

import java.io.IOException;
import java.io.InputStream;

public class SqlSessionUtils {


    public static SqlSession getSqlSession(String buildpath) throws IOException {
        SqlSession sqlSession;
        SqlSessionFactoryBuilder sessionFactoryBuilder = new SqlSessionFactoryBuilder();
        InputStream inputStream = Resources.getResourceAsStream(buildpath);
        SqlSessionFactory sqlSessionFactory = sessionFactoryBuilder.build(inputStream);
        sqlSession= sqlSessionFactory.openSession();
        return sqlSession;
    }

}

在这里插入图片描述
其余方法的使用也一模一样下边就不进行测试了。
下边就说一说Mybatis配置文件(dtd格式,标签必须按一定的顺序否则会报错)

Mybatis配置文件

1.别名的配置
(1)给确定的pojo类起别名
(2)包扫描,包下的类的别名就是它的类名(推荐使用)
用途:比如说是查询结果是一个pojo.User类型,配置别名后就可以在reyurnType中写它的别名。

 <typeAliases>
        <!--1.给pojo.user起别名,不区分大小写-->
        <typeAlias type="pojo.User" alias="USER"/>
        <!--别名就是类名,不区分大小写,推荐-->
        <2.package name="pojo"/>
    </typeAliases>
    <!-- 和spring整合后 environments配

2.环境配置(开发环境或测试环境等)
这个前边已经配置过就不写了
3.映射文件的加载(在mappers标签里配置)
(1)单个加载映射(传统方式只能用这种)

<mapper resource="UserMapper.xml"/>

(2)类加载映射
要求:
必须把映射文件和动态代理的接口放在一个包下并且名称要相同
在这里插入图片描述

<mapper class="DaoProxy.UserMapper" />

(3)包扫描加载映射(要求如上,推荐)

<package name="DaoProxy"/>

(4)从本地加载(基本不用)
加载映射总结:
在传统Dao开发只能用第一种和最后一种,动态代理所有都可以用。
这次就先写到这里,下次会进入更深层次,一步一步向前进!!





猜你喜欢

转载自blog.csdn.net/qq_42605968/article/details/86765897
今日推荐