Mybatis

Mybatis

1 Mybatis概述

1.1 简介

MyBatis本是apache的一个开源项目iBatis,2010年这个项目由apache software foundation迁移到了google code,并且改名为MyBatis。2013年11月迁移到Github。
iBATIS一词来源于“internet”和“abatis”的组合,是一个基于Java的持久层框架。iBATIS提供的持久层框架包括SQL Maps和Data Access Objects
当前,最新版本是MyBatis 3.5.9,其发布时间是2021年12月26日。

1.2 官网

官网地址:https://mybatis.org/mybatis-3/
中文官网:https://mybatis.org/mybatis-3/zh/index.html

1.3 特点

Mybatis:
1)支持自定义SQL、存储过程、及高级映射
2)实现自动对SQL的参数设置
3)实现自动对结果集进行解析和封装
4)通过XML或者注解进行配置和映射
5)实现Java对象与数据库表的映射转换

可以发现,MyBatis是对JDBC进行了简单的封装,帮助用户进行SQL参数的自动化映射,以及结果集与Java对象的映射。与Hibernate相比,更加配置简单、灵活、执行效率高。但是正因为此,所以没有实现完全自动化,需要手写SQL,这是优点也是缺点。
因此,对性能要求较高的电商类项目,一般会使用MyBatis,而对与业务逻辑复杂,对执行效率要求不高的传统行业,一般会使用Hibernate

1.4 架构

avatart
MyBatis架构总结:

1.MyBatis有两类配置文件:
a) mybatis-config.xml,是MyBatis的全局配置文件,包含全局配置信息,如数据库连接参数、插件等。整个框架中只需要一个即可。
b) xxxMapper.xml,是映射文件,里面配置要执行的SQL语句,每个SQL对应一个Statement,可以有多个Mapper.xml文件

2.首先会通过SqlSessionFactoryBuilder来加载配置文件,生成一个SqlSessionFactory
a) 会加载mybatis-config.xml和mapper.xml
b) 加载mapper.xml的时候,顺便会对Sql进行编译,形成statement
3.通过SqlSessionFactory建立连接,获取SqlSession对象
4.MyBatis获取要执行的statement,进行自动参数设置
5.SqlSession底层会通过Executor(执行器)来执行编译好的Statement,获取结果
6.SQL的输入参数类型:
a) POJO,普通Java对象
b) HashMap,其实是POJO的Map形式, 键值对就是对象字段名和值z``
c) 各种基本数据类型
7.查询结果的输出形式
a) POJO,普通Java对象
b) HashMap,其实是POJO的Map形式, 键值对就是对象字段名和值
c) 各种基本数据类型

2 快速入门

2.1 增加导入依赖

点击查看代码
<dependencies>
    <dependency>
        <groupId>mysql</groupId>
        <artifactId>mysql-connector-java</artifactId>
        <version>5.1.46</version>
    </dependency>
    <!--mybatis依赖-->
    <dependency>
        <groupId>org.mybatis</groupId>
        <artifactId>mybatis</artifactId>
        <version>3.2.7</version>
    </dependency>
    <!--日志-->
    <dependency>
        <groupId>org.slf4j</groupId>
        <artifactId>slf4j-log4j12</artifactId>
        <version>1.7.25</version>
    </dependency>
    <!-- 单元测试 -->
    <dependency>
        <groupId>junit</groupId>
        <artifactId>junit</artifactId>
        <version>4.12</version>
    </dependency>
</dependencies>

2.2 添加日志配置文件

将日志文件添加至 main/resource目录

点击查看代码
#Global Logging configuration
log4j.rootLogger=DEBUG,stdout
#Console output...
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern=%5p [%t] - %m%n

2.3 添加jdbc.properties

点击查看代码
jdbc.driverClassName=com.mysql.jdbc.Driver
jdbc.url=jdbc:mysql://127.0.0.1:3306/mybatis_db?useUnicode=true&characterEncoding=utf8&autoReconnect=true&allowMultiQueries=true
jdbc.username=root
jdbc.password=123

2.4 编写mybatis全局配置文件

点击查看代码
<?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>
    <!--properties:可以统一管理配置中的数据-->
    <!--resource属性:加载外部的属性-->
    <properties resource="jdbc.properties">
        <!--内部的数据配置-->
        <!--property:配置数据的具体值-->
        <!--name:数值的名称-->
        <!--value:具体的值-->
        <property name="jdbc.username" value="root"></property>
    </properties>

    <!--typeAliases:配置别名-->
    <typeAliases>
        <!--typeAlias:配置具体的别名-->
        <!--type:配置要起别名的数据类型-->
        <!--alias:配置别名的名称,不区分大小写-->
        <!--一对一配置别名-->
        <!--<typeAlias type="com.itheima.mybatis.pojo.User" alias="user"></typeAlias>-->
        <!--配置包扫描-->
        <!--name:配置要扫描的包,会对这个包内的所有JavaBean起别名,别名的名称就是类名-->
        <package name="com.itheima.mybatis.pojo"></package>
    </typeAliases>
    <!--和spring整合后environments将废除-->
    <environments default="development">
        <environment id="development">
            <!--使用jdbc事务管理-->
            <transactionManager type="JDBC"></transactionManager>
            <!--数据库连接池-->
            <dataSource type="POOLED">
                <property name="driver" value="com.mysql.jdbc.Driver"></property>
                <property name="url" value="jdbc:mysql://localhost:3306/mybatis?characterEncoding=utf-8"/>
                <property name="username" value="${jdbc.username}"/>
                <property name="password" value="${jdbc.password}"/>


            </dataSource>
        </environment>
    </environments>
    <!--配置加载映射文件-->
    <mappers>
        <!--resource:类路径资源加载方式-->
        <!--<mapper  resource="User.xml"></mapper>-->
        <!--原始方式的dao开发需要加载的映射文件-->
        <!--<mapper  resource="UserDao.xml"></mapper>-->
        <!--演示Mapper接口动态代理的DAO开发,需要加载的映射文件-->
        <!--<mapper  resource="UserMapper.xml"></mapper>-->

        <!--加载Mapper映射文件,还可以使用两种方式:1.接口类加载方式,2.包扫描-->
        <!--配置使用接口类路径的加载方式-->
        <!--使用这种方式加载需要两个前提:-->
        <!--1.名一样:mapper接口名称和mapper映射文件名称相同-->
        <!--2.在一起:mapper接口名称和mapper映射文件放在同一个目录中-->
        <!--<mapper class="com.itheima.mybatis.mapper.UserMapper"></mapper>-->

        <package name="com.itheima.mybatis.mapper"></package>

    </mappers>
</configuration>

2.6 编写测试代码

点击查看代码
package com.itheima.mybatis.test;

import com.itheima.mybatis.pojo.User;
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;

/**
 * @program: mybatis_day01_1
 * @description:
 * @author: brusee
 * @create: 2019-12-08 18:59
 **/
public class Hello {
    public static void main(String[] args) throws IOException {
        // 指定全局文件的路径
        String resource = "SqlMapConfig.xml";
        // 获取输入流,关联全局配置文件
        InputStream inputStream = Resources.getResourceAsStream(resource);
        // 构建SqlSessionFactory
        SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
        // 获取SqlSession
        SqlSession sqlSession = sqlSessionFactory.openSession();
        // 执行statement, 需要指定两个参数:
        // 1 确定哪个sql语句: mapper文件的namespace + sql语句的id
        // 2 sql语句需要的参数
        User user = sqlSession.selectOne("UserMapper.queryById", 1L);
        System.out.println(user);
    }

}


2.7 入门程序执行流程图

avatart
流程总结:

  1. 编写配置文件(全局配置文件mybatis-config.xml和所有的mapper.xml映射文件)
    a) 简单来说:就是准备JDBC连接参数以及要用到的Sql语句
  2. 加载配置,创建SqlSessionFactory
    a) 这里获取连接参数,获取Sql,对Sql进行预编译,形成statement
  3. 通过SqlSessionFactory创建SqlSession
    a) 这里就是调用了连接参数,连接数据库,形成会话
  4. 通过SqlSession执行statement,实现CRUD
    a) 给前面编译好的statement设置Sql参数,然后执行
  5. 通过SqlSession提交事务
  6. 通过SqlSession关闭会话

3 完成增删改查

3.1 定义接口

点击查看代码
package cn.itcast.dao;

import cn.itcast.domain.User;

import java.util.List;

public interface UserDao {
    /**
     * 根据编号 查询用户
     */
    public User queryUserById(Long id);

    /**
     * 查询所有用户
     */
    public List<User> queryUserList();

    /**
     * 添加用户
     */
    public void insertUser(User user);

    /**
     * 修改用户
     */
    public void updateUser(User user);

    /**
     * 根据编号 删除客户
     */
    public void deleteById(Long id);
}

3.2 编写SQL到mapper文件中

点击查看代码
<?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">
<!--Mapper接口动态代理-->
<mapper namespace="com.itheima.mybatis.mapper.UserMapper">
    <!--Mapper接口动态代理遵循4个开发原则-->
    <!--1.namespace必须是Mapper接口的全限定名-->
    <!--2.映射文件的id必须是接口方法的方法名-->
    <!--3.映射文件的paramaterType的类型必须是方法的参数类型-->
    <!--4.映射文件的resultType的类型必须是方法的返回值类型-->
    <!--根据id查询用户-->
    <select id="queryById" parameterType="java.lang.Integer" resultType="user">
        select * from user where id=#{id}
    </select>
    <!--模糊查询:方案1-->
    <!--<select id="queryByUsername" parameterType="java.lang.String" resultType="com.itheima.mybatis.pojo.User">-->
        <!--SELECT  * FROM USER WHERE username LIKE #{uername}-->
    <!--</select>-->
    <!--模糊查询:方案2-->
    <select id="queryByUsername" parameterType="java.lang.String" resultType="com.itheima.mybatis.pojo.User">
        SELECT  * FROM USER WHERE username LIKE '%${value}%'
    </select>
    <!--新增用户-->
    <!--selectKey用于返回自增主键-->
    <!--keyProperty:pojo哪个属性是主键-->
    <!--keyColumn:数据库的主键列-->
    <insert id="saveUser" parameterType="com.itheima.mybatis.pojo.User">
        <selectKey keyProperty="id" keyColumn="id" resultType="java.lang.Integer" order="AFTER">
            select LAST_INSERT_ID()
        </selectKey>
        INSERT INTO USER (username,birthday,sex,address) values
        (#{username},#{birthday},#{sex},#{address})
    </insert>
    <!--根据id更新用户信息-->
    <update id="updateUser" parameterType="com.itheima.mybatis.pojo.User">
        UPDATE USER SET username=#{username},sex=#{sex} WHERE id=#{id}
    </update>
    <!--根据id删除用户-->
    <delete id="deleteUser" parameterType="java.lang.Integer">
        DELETE FROM USER WHERE id=#{id}
    </delete>
</mapper>

3.3 接口实现

点击查看代码
package com.itheima.mybatis.dao.impl;

import com.itheima.mybatis.dao.UserDao;
import com.itheima.mybatis.pojo.User;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;

import java.util.List;

/**
 * @program: mybatis_day01_1
 * @description:
 * @author: brusee
 * @create: 2019-12-14 17:40
 **/
public class UserDaoImpl implements UserDao {
    //SqlSessionFactory全局存在,不应该由dao创建
    //但需要使用工厂,所以在创建dao的时候需要注入工厂
    public SqlSessionFactory sqlSessionFactory;
    //使用构造方法把工厂注入
    public UserDaoImpl(SqlSessionFactory sqlSessionFactory){
        this.sqlSessionFactory=sqlSessionFactory;
    }
    public User queryById(int id) {
        //使用工厂获取SqlSession
        SqlSession sqlSession = sqlSessionFactory.openSession();
        //使用SqlSession实现业务逻辑
        User user = sqlSession.selectOne("queryByid", id);
        //释放资源
        sqlSession.close();

        return user;
    }

    public List<User> queryByUsername(String username) {
        //使用工厂获取sqlsession
        SqlSession sqlSession = sqlSessionFactory.openSession();
        //使用sqlsession实现业务逻辑
        List<User> userList = sqlSession.selectList("queryByName2", username);
        //释放资源
        sqlSession.close();
        return userList;
    }

    public void saveUser(User user) {
        SqlSession sqlSession = sqlSessionFactory.openSession(true);
        sqlSession.insert("addUser", user);
        sqlSession.close();
    }
}

3.4 使用生成测试类

打开UserDao文件,按快捷键ctrl+shift+t 生成测试用例

点击查看代码
package com.itheima.mybatis.test;

import com.itheima.mybatis.pojo.User;
import com.sun.org.apache.xml.internal.security.Init;
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 org.junit.Before;
import org.junit.Test;

import java.io.IOException;
import java.io.InputStream;
import java.util.Date;
import java.util.List;

/**
 * @program: mybatis_day01_1
 * @description:
 * @author: brusee
 * @create: 2019-12-08 18:59
 **/
public class MyBatisTest {
    public SqlSessionFactory factory;
    @Before
    public void Init() throws Exception {
        //1.创建SqlSessionFactoryBuilder
        SqlSessionFactoryBuilder Builder = new SqlSessionFactoryBuilder();
        //2.加载mybatis配置文件
        InputStream inputStream = Resources.getResourceAsStream("SqlMapConfig.xml");
        //3.使用Builder构建
         factory = Builder.build(inputStream);
    }



    @Test
    /**
     * 根据id查询用户
     */
    public void queryById() throws Exception {

        //4.使用工程获取SqlSession
        SqlSession sqlSession = factory.openSession();
        //5.使用sqlSession方法操作数据库
        User user = sqlSession.selectOne("queryByid", 1);
        System.out.println(user);
        sqlSession.close();
    }

    @Test
    /**
     * 根据用户名模糊查询用户,方案1
     */
    public void queryByUserName(){
        SqlSession sqlSession = factory.openSession();
        List<User> users = sqlSession.selectList("queryByName", "%王%");
        for (User user : users) {
            System.out.println(user);
        }
        sqlSession.close();
    }
    @Test
    /**
     * 根据用户名模糊查询用户,方案2
     */
    public void queryByUserName2(){
        SqlSession sqlSession = factory.openSession();
        List<User> users = sqlSession.selectList("queryByName2", "王");
        for (User user : users) {
            System.out.println(user);
        }
        sqlSession.close();
    }
    @Test
    public void addUser(){

        //autoCommit:true,是否自动提交事务
        SqlSession sqlSession = factory.openSession(true);
        User user=new User();
        user.setUsername("张四丰");
        user.setBirthday(new Date());
        user.setSex("男");
        user.setAddress("绝情谷");

        sqlSession.insert("addUser", user);
        //手动提交事务
        //sqlSession.commit();
        System.out.println(user.getId());
    }
    @Test
    /**
     * 根据id更新用户信息
     */
    public void updateUser(){
        SqlSession sqlSession = factory.openSession(true);
        User user=new User();
        user.setUsername("李莫愁");
        user.setSex("女");
        user.setId(1);
        sqlSession.update("updateUser",user);
    }
    @Test
    /**
     * 根据id删除用户信息
     */
    public void deleteUser(){
        SqlSession sqlSession = factory.openSession(true);
        sqlSession.delete("deleteUser",26);
    }
}

4 动态代理实现dao接口

4.1 CRUD代码分析

规律: 参数结构相似, 参数1指定对应的statement, 参数2 实际需要参数

4.2 思路分析

1)是否可以通过动态代理,代理UserDao接口,然后动态生成内部的正删改查代码呢?
2)想要让Mybatis帮我们动态生成DAO代码,有以下问题需要解决?

A:如何确定要调用SqlSession的哪个方法? 
	每一个DAO中的方法,最终一定对应Mapper.xml中的一个statement,而每个statement中定义的Sql语句,就可以知道应该是增、删、改、查中的哪一个。
	所以要确定应该调用SqlSession的哪个方法,就要先确定DAO的方法对应mapper.xml中的哪个statement

B:如何确定要调用哪个statement?
	要确定statement,就必须通过两个参数:mapper.xml文件的namespace + 这个statement的ID
	而我们知道,这两个值都是用户自定义的,可以是任意值。如果是这样,我们是无法确定的!
	但是,注意观察,我们刚才定义namespace和ID并不是任意的:
	namespace恰好就叫UserMapper,与UserDAO接口相关
	statement的id恰好与每一个方法的名称一致。
	其实呢,在Mybatis中,也是采用类似的约定来做的,mybatis对于Mapper.xml文件的定义有以下约定:

约定namespace必须与DAO接口的全名称一致
约定statement的ID必须和接口中的方法名称一致
这样以来,Mybatis的底层,只要拿到我们定义的接口,以及接口的方法名称,必然能确定到对应的statement,从而知道我们应该调用哪个SqlSession方法,知道返回值类型是什么,知道参数类型是什么,从而帮我们动态生成DAO的实现代码!

4.3 mybatis动态代理实现到接口

4.3.1 规则

要想动态代理实现dao接口的方法, 关键在于找到对应的statement. 如果想快速找到对应的statment, 就需要遵守如下约定:

  1. 每一个dao接口 都有一个对应的 XxxMapper.xml映射文件(必须)
  2. mapper.xml文件的namespace必须是接口的全名称(必须)
  3. mapper.xml文件的每个statement的id必须是 dao接口的方法名(必须)
  4. statement中定义的resultType必须和方法定义的返回值类型一致(必须)
  5. 在MyBatis中, 一般dao接口命名规则为 XxxMapper.java, 不是 XxxxDao.java(虽然这不是必须的, 但是后面的约定会用到,请大家提前规范起来)

如果遵守以上约定, myBatis很对就可以实现动态代理

4.3.2 编写Mapper接口(代替dao接口)

点击查看代码
package com.itheima.mybatis.mapper;

import com.itheima.mybatis.pojo.User;

import java.util.List;

/**
 * @program: mybatis_day01_1
 * @description:
 * @author: brusee
 * @create: 2019-12-14 17:34
 **/
public interface UserMapper {

    /**
     * 根据id查询用户
     * @param id
     * @return
     */
    public User queryById(int id);

    /**
     * 根据用户名模糊查询多个用户
     * @param username
     * @return
     */
    public List<User> queryByUsername(String username);

    /**
     * 新增用户
     * @param user
     */
    public void saveUser(User user);
    
    /**
     * 查询所有用户
     */
    public List<User> queryUserList();

    /**
     * 添加用户
     */
    public void insertUser(User user);

    /**
     * 修改用户
     */
    public void updateUser(User user);

    /**
     * 根据编号 删除客户
     */
    public void deleteById(Long id);

}

4.3.3 修改UserMapper.xml文件

  1. xml文件的namespace必须是 mapper接口的全路径
  2. 每个statement的id 必须 mapper接口的方法名保持一致
点击查看代码
<?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">
<!--Mapper接口动态代理-->
<mapper namespace="com.itheima.mybatis.mapper.UserMapper">
    <!--Mapper接口动态代理遵循4个开发原则-->
    <!--1.namespace必须是Mapper接口的全限定名-->
    <!--2.映射文件的id必须是接口方法的方法名-->
    <!--3.映射文件的paramaterType的类型必须是方法的参数类型-->
    <!--4.映射文件的resultType的类型必须是方法的返回值类型-->
    <!--根据id查询用户-->
    <select id="queryById" parameterType="java.lang.Integer" resultType="user">
        select * from user where id=#{id}
    </select>
    <!--模糊查询:方案1-->
    <!--<select id="queryByUsername" parameterType="java.lang.String" resultType="com.itheima.mybatis.pojo.User">-->
        <!--SELECT  * FROM USER WHERE username LIKE #{uername}-->
    <!--</select>-->
    <!--模糊查询:方案2-->
    <select id="queryByUsername" parameterType="java.lang.String" resultType="com.itheima.mybatis.pojo.User">
        SELECT  * FROM USER WHERE username LIKE '%${value}%'
    </select>
    <!--新增用户-->
    <!--selectKey用于返回自增主键-->
    <!--keyProperty:pojo哪个属性是主键-->
    <!--keyColumn:数据库的主键列-->
    <insert id="saveUser" parameterType="com.itheima.mybatis.pojo.User">
        <selectKey keyProperty="id" keyColumn="id" resultType="java.lang.Integer" order="AFTER">
            select LAST_INSERT_ID()
        </selectKey>
        INSERT INTO USER (username,birthday,sex,address) values
        (#{username},#{birthday},#{sex},#{address})
    </insert>
    <!--根据id更新用户信息-->
    <update id="updateUser" parameterType="com.itheima.mybatis.pojo.User">
        UPDATE USER SET username=#{username},sex=#{sex} WHERE id=#{id}
    </update>
    <!--根据id删除用户-->
    <delete id="deleteUser" parameterType="java.lang.Integer">
        DELETE FROM USER WHERE id=#{id}
    </delete>
</mapper>

4.3.4 总结

MyBatis动态代理生成dao的步骤:

  1. 编写数据管理的接口 XxxMapper.java
  2. 编写接口对应的配置文件 XxxxMapper.xml
    • namespace必须 和 dao接口的全路径保持一致
    • statement的id必须 和 dao接口的方法名保持一致
    • statement的resultType类型 必须 和方法返回值类型保持一致
  3. 通过 sqlSession.getMapper(类的字节码对象) 获取代理之后的Mapper实现类对象

5 mybatis-config.xml 全文配置文件详解


注意: 配置文件中的标签的顺序非常重要. 必须严格按照上述顺序!

5.1 properties 属性

作用:指定外部配置文件的位置

5.2 配置 settings

5.2.1 全局设置概述

调整settings中的设置是非常关键的,它们会改变MyBatis的运行行为。

设置参数 描述 有效值 默认值
cacheEnabled 该配置影响的所有映射器中配置的缓存的全局开关。 true | false true
lazyLoadingEnabled 延迟加载的全局开关。当开启时,所有关联对象都会延迟加载。特定关联关系中可通过设置fetchType属性来覆盖该项的开关状态。 true | false false
aggressiveLazyLoading 当启用时,带有延迟加载属性的对象的加载与否完全取决于对任意延迟属性的调用;反之,每种属性将会按需加载。 true | false true
mapUnderscoreToCamelCase 是否开启自动驼峰命名规则(camel case)映射,即从经典数据库列名 A_COLUMN 到经典 Java 属性名 aColumn 的类似映射。 true | false False

5.2.2 设置是否开启自动驼峰命名规则映射

5.2.2.1 什么是驼峰命名规则?

骆驼式命名法就是当变量名或函数名是由一个或多个单词连结在一起,而构成的唯一识别字时**
第一个单词以小写字母开始;第二个单词的首字母大写或每一个单词的首字母都采用大写字母
**例如:myFirstName、myLastName,这样的变量名看上去就像骆驼峰一样此起彼伏,故得名。

5.2.2.2 为什么要开启自动驼峰命名规则映射?

因为 User对象的属性userName 和 tb_user表 的字段 user_name不一致, 所以导致 用户名的为null

因为 使用别名解决 User类的属性 userName 和 tb_user表的 列名 user_name不一致比较麻烦, 如果多个字段都不一致, 都是使用别名, 维护困难, 开发困难, 所以 可以考虑 开启自动驼峰命名规则映射.

5.2.2.3 开启自动驼峰命名规则映射


解决属性名和列名不一致:

  1. 使用别名可以解决
  2. 开启驼峰标识也可以解决

5.3 typeAliases 类型别名

5.3.1 why

类型别名是为 Java 类型命名的一个短的名字。它只和 XML 配置有关,存在的意义仅在于用来减少类完全限定名的冗余。

5.3.2 how

mybatis-config.xml

点击查看代码
 <typeAliases>
        <!--起别名-->
        <typeAlias type="com.itheima.mybatis.pojo.User" alias="User"/>
    </typeAliases>

UserMapper.xml

点击查看代码
 <select id="queryUserById" parameterType="java.lang.Long" resultType="User">
        select * from tb_user where id=#{id}
    </select>

    <select id="queryUserList" resultType="User">
        select * from tb_user
    </select>

问题: 如果有很多javabean,这样起别名太麻烦了?
解决方案: 指定包, 这样会将每个类的名称作为别名,如下
mybatis-config.xml

点击查看代码
    <typeAliases>
        <!--typeAlias:配置具体的别名-->
        <!--type:配置要起别名的数据类型-->
        <!--alias:配置别名的名称,不区分大小写-->
        <!--一对一配置别名-->
        <!--<typeAlias type="com.itheima.mybatis.pojo.User" alias="user"></typeAlias>-->
        <!--配置包扫描-->
        <!--name:配置要扫描的包,会对这个包内的所有JavaBean起别名,别名的名称就是类名-->
        <package name="com.itheima.mybatis.pojo"></package>
    </typeAliases>

已经为普通的 Java 类型内建了许多相应的类型别名。它们都是大小写不敏感的,需要注意的是由于重载原始类型的名称所做的特殊处理。

5.4 映射器(mappers)

5.4.1 方式一 使用项目资源路径

点击查看代码
<!--关联映射文件-->
    <mappers>
        <!--方式一: 在resource目录下查找-->
        <mapper resource="mapper/UserMapper.xml"/>
    </mappers>

缺点: 如果有多个mapper文件, 需要一个一个指定?
简化思路: 能够通过类的全路径来指定?

5.4.2 方式二: 通过类的全路径来指定

点击查看代码
<!--关联映射文件-->
<mappers>
    <!--方式二: 通过类的全路径名称-->
    <mapper class="com.itheima.mybatis.pojo.UserMapper"/>
</mappers>

5.4.3 配置扫描包

点击查看代码
<!--关联映射文件-->
<mappers>
    <!--方式三: 扫描包-->
    <package name="cn.itheima.mybatis.pojo"/>
</mappers>

要求: 1. 目录名和包名一致; 2. 文件名和接口名一致.

posted @ 2022-05-24 21:10  capser  阅读(36)  评论(0编辑  收藏  举报