Day06-2.MyBatis配置文件和映射文件笔记

MyBatis(第1天)

学习目标

  1. 能够了解什么是框架

  2. 掌握mybatis框架开发快速入门

  3. 掌握mybatis的dao层动态代理实现

  4. mybatis核心配置

  5. 可以写出会话工具类

  6. mybatis映射文件配置

今日作业

1.搭建maven工程,运行hello world

2.搭建mybatis环境,查询所有用户,使用代理方式

3.掌握核心配置文件的常用四个标签 properties settings typealiases mappers

4.预习(1-3个小时)

1.框架概述

目标

  1. 什么是框架

  2. 框架解决了哪些问题

  3. 分层开发下常见的框架

什么是框架

程序开发中的框架往往是对常见功能的封装,通常与具体业务无关,也可以认为是软件的半成品。程序框架理解为基础或者机械标准件(例如螺丝螺母标准的机械部件)。

假如你要造一辆马车,在没有框架的情况下,你需要自己去伐木,去把木头做成木板,木棍,然后组成轮子,门,等部件,然后组装起来。但如果你用了框架,就相当于你有现成的轮子,门等部件,你只需要组装一下就可以了。

一个框架是一组可复用的设计构件。

1557575891993

框架(Framework)是整个或者部分系统的可重用设计,是JavaEE底层技术的封装。

框架是可以被开发者定制的应用骨架。

框架是一个半成品,软件是成品。我们在它的基础上开发出成品(软件)。 1557575928477

框架解决的问题

解决了技术通用的问题

在JavaEE体系中,有着各种各样的技术。不同的软件企业,根据自身的业务需求选择不同的技术,容易造成应用依赖技术,增加了项目开发实现的复杂性和技术风险性。而框架技术就可以解决上述问题。

提升了开发效率

企业项目中使用框架,只需要专注实现业务需求。使用框架的方便性,提升了开发效率。

提升了系统稳定性

一个成熟的框架,经过了在众多企业项目中的验证使用,稳定性有保障。

image-20200603205106584

小结

  1. 理解为软件中标准件,程序员可以利用这些半成品来开发软件。
  2. 提高开发效率,降低开发成本。
  3. 以后我们在企业中开发项目基本上都是使用框架来开发

2.mybatis框架介绍

目标

  1. mybatis框架介绍

  2. mybatis框架官网和jar包下载

mybatis框架介绍

	mybatis是Apache软件基金会下的一个开源项目,前身是iBatis框架。2010年这个项目由apache 软件基金会迁移到google code下,改名为mybatis。201311月又迁移到了github(GitHub 是一个面向开源及私有 软件项目的托管平台)。
	MyBatis 是一款优秀的持久层框架,它支持定制化 SQL、存储过程以及高级映射(多表)。MyBatis 避免了几乎所有的 JDBC 代码和手动设置参数以及获取结果集。它对 jdbc 的操作数据库的过程进行封装,使开发者只需要关注 SQL 本身,而不需要花费精力去处理例如注册驱动、创建 connection、创建 statement、手动设置参数、结果集检索等 jdbc 繁杂的过程代码。MyBatis 可以使用简单的 XML 或注解来配置和映射原生类型、接口和 Java 的 POJO(Plain Old Java Objects,普通老式 Java 对象)为数据库中的记录。  

mybatis的优点

  1. 简单易学:mybatis本身就很小且简单。没有任何第三方依赖,最简单安装只要两个jar文件+配置几个SQL映射文件即可。
  2. 使用灵活:Mybatis不会对应用程序或者数据库的现有设计强加任何影响。SQL语句写在XML里,便于统一管理和优化。
  3. 解除SQL与程序代码的耦合:通过提供DAO层,将业务逻辑和数据访问逻辑分离,使系统的设计更清晰,更易维护,更易进行单元测试。SQL语句和代码的分离,提高了可维护性。

mybatis的不足

  1. 编写SQL语句时工作量很大,尤其是字段多、关联表多时,更是如此。
  2. SQL语句依赖于数据库,导致数据库移植性差,不能更换数据库。
  3. 框架还是比较简陋,功能尚有缺失。

官方网站及框架包下载

官网地址:http://www.mybatis.org/mybatis-3/

1557582491118

image-20200603213351050

源码和包下载地址:https://github.com/mybatis/mybatis-3/releases

下载后的包位于课后资料中:

image-20200603213826853

mybatis框架整体架构

image-20200603214543750

1、配置文件
	全局配置文件(核心配置文件):mybatis-config.xml,作用:配置数据源(配置数据库连接信息),引入映射文件
	映射文件:XxMapper.xml,作用:配置sql语句、参数、结果集封装类型等
	
2、SqlSessionFactory
	作用:获取SqlSession
	通过new SqlSessionFactoryBuilder().build(inputStream)来构建,inputStream:读取配置文件的IO流

3、SqlSession
	作用:执行CRUD操作
	
4、Executor
	执行器,SqlSession通过调用它来完成具体的CRUD
	
5、Mapped Statement
	在映射文件里面配置,包含3部分内容:
		具体的sql,sql执行所需的参数类型,sql执行结果的封装类型
	参数类型和结果集封装类型包括3种:
		HashMap,基本数据类型,pojo

MyBatis的ORM方式


Object Relational Mapping 对象关系映射

1566614801843

MyBatis的两种映射方式:

  1. 通过XML映射
  2. 通过注解

小结

1、mybatis解决了三层(web,service,dao)中哪一层的问题?
	dao(数据持久层)
2、mybatis框架是对什么技术进行的封装?
	JDBC
3、mybatis框架中的核心组件有哪些?
	SqlSessionFactoryBuilder:SqlSessionFactory工厂的创造类
	SqlSessionFactory:加载配置信息,提供SqlSession
	SqlSession: 数据操作的对象 sql语句

3.MyBatis框架入门开发【掌握】

3.1入门案例:环境的搭建和代码实现

目标

  1. mybatis开发环境的搭建
    
  2. 了解mybatis的开发步骤
    

需求

利用mybatis框架,从MySQL中查询所有的用户

1557583413350

准备数据

要查询的表

create table user (
  id int primary key auto_increment,
  username varchar(20) not null,
  birthday date,
  sex char(1) default '男',
  address varchar(50)
);

insert into user values (null, '孙悟空','1980-10-24','男','花果山水帘洞');
insert into user values (null, '白骨精','1992-11-12','女','白虎岭白骨洞');
insert into user values (null, '猪八戒','1983-05-20','男','福临山云栈洞');
insert into user values (null, '蜘蛛精','1995-03-22','女','盤丝洞');

select * from user;

步骤

我们完全可以按照mybatis官网入门步骤进行开发即可:

image-20200603224026491

  1. 创建maven工程,导入坐标

    1. 日志记录包:mybatis在执行过程中输出的一些信息,mybatis底层需要使用logback日志框架

      image-20211103173316590

    2. mysql驱动

      1562393020161

    3. mybatis框架的包

      1562393063644

     	<!--mybatis核心包-->
         <dependency>
             <groupId>org.mybatis</groupId>
             <artifactId>mybatis</artifactId>
             <version>3.5.0</version>
         </dependency>
        <!--logback日志包-->
         <dependency>
             <groupId>org.slf4j</groupId>
             <artifactId>slf4j-api</artifactId>
             <version>1.7.26</version>
         </dependency>
         <dependency>
             <groupId>ch.qos.logback</groupId>
             <artifactId>logback-core</artifactId>
             <version>1.2.3</version>
         </dependency>
         <dependency>
             <groupId>ch.qos.logback</groupId>
             <artifactId>logback-classic</artifactId>
             <version>1.2.3</version>
         </dependency>
         <!--mysql驱动-->
         <dependency>
             <groupId>mysql</groupId>
             <artifactId>mysql-connector-java</artifactId>
             <version>5.1.18</version>
         </dependency>
    
     	<dependency>
             <groupId>junit</groupId>
             <artifactId>junit</artifactId>
             <version>4.10</version>
             <scope>test</scope>
         </dependency>
    

2.在resources下面创建核心配置文件:mybatis-config.xml

	XML 配置文件中包含了对 MyBatis 系统的核心设置,包含获取数据库连接实例的数据源(DataSource)和决定事务作用域和控制方式的事务管理器(TransactionManager)。 XML 配置文件的详细内容后面再探讨,这里先给出一个简单的示例:
<?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>
    <!--mybatis环境的配置-->
    <environments default="development">
        <!--通常我们只需要配置一个就可以了, id是环境的名字 -->
        <environment id="development">
            <!--事务管理器:由JDBC来管理-->
            <transactionManager type="JDBC"/>
            <!--数据源的配置:mybatis自带的连接池-->
            <dataSource type="POOLED">
                <property name="driver" value="com.mysql.jdbc.Driver"/>
                <property name="url" value="jdbc:mysql://localhost:3306/db4"/>
                <property name="username" value="root"/>
                <property name="password" value="1234"/>
            </dataSource>
        </environment>
    </environments>
    <mappers>
        <!--加载映射文件,放到src下即可-->
        <mapper resource="userMapper.xml"/>
    </mappers>
</configuration>

3.在resources下创建映射文件userMapper.xml

<?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 namespace="com.itheima.sh.dao.UserMapper">
    <!--
        查询语句
        resultType:返回的实体类的类型,类全名
    -->
    <select id="findAllUsers" resultType="com.itheima.sh.pojo.User">
        select * from user
    </select>
</mapper>

4.在resources下 导入logback.xml文件

<?xml version="1.0" encoding="UTF-8"?>
<configuration>
    <!--
        CONSOLE :表示当前的日志信息是可以输出到控制台的。
    -->
    <appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender">
        <!--输出流对象 默认 System.out 改为 System.err-->
        <target>System.out</target>
        <encoder>
            <!--格式化输出:%d表示日期,%thread表示线程名,%-5level:级别从左显示5个字符宽度
                %msg:日志消息,%n是换行符-->
            <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%-5level]  %c [%thread] : %msg%n</pattern>
        </encoder>
    </appender>

    <!-- File是输出的方向通向文件的 -->
    <appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <encoder>
            <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n</pattern>
            <charset>utf-8</charset>
        </encoder>
        <!--日志输出路径-->
        <file>C:/code/itheima-data.log</file>
        <!--指定日志文件拆分和压缩规则-->
        <rollingPolicy
                class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
            <!--通过指定压缩文件名称,来确定分割文件方式-->
            <fileNamePattern>C:/code/itheima-data2-%d{yyyy-MMdd}.log%i.gz</fileNamePattern>
            <!--文件拆分大小-->
            <maxFileSize>1MB</maxFileSize>
        </rollingPolicy>
    </appender>

    <!--

    level:用来设置打印级别,大小写无关:TRACE, DEBUG, INFO, WARN, ERROR, ALL 和 OFF
   , 默认debug
    <root>可以包含零个或多个<appender-ref>元素,标识这个输出位置将会被本日志级别控制。
    -->
    <root level="ALL">
        <appender-ref ref="CONSOLE"/>
        <appender-ref ref="FILE" />
    </root>
</configuration>

4.编码

  • 新建UserMapper接口:

    public interface UserMapper {
        /**
         查询所有的用户
         */
        List<User> findAllUsers();
    }
    
  • 将接口和映射文件绑定:

映射文件的	namespace值==接口的全路径
映射文件的sql语句的	id值 ==接口中的方法名

  • 创建实体类User
package com.itheima.sh.pojo;
import java.sql.Date;
public class User {
    private Integer id;
    private String username;
    private Date birthday;
    private String sex;
    private String address;

    public User() {
    }

    public User(Integer id, String username, Date birthday, String sex, String address) {
        this.id = id;
        this.username = username;
        this.birthday = birthday;
        this.sex = sex;
        this.address = address;
    }

    public Integer getId() {
        return id;
    }

    public void setId(Integer id) {
        this.id = id;
    }

    public String getUsername() {
        return username;
    }

    public void setUsername(String username) {
        this.username = username;
    }

    public Date getBirthday() {
        return birthday;
    }

    public void setBirthday(Date birthday) {
        this.birthday = birthday;
    }

    public String getSex() {
        return sex;
    }

    public void setSex(String sex) {
        this.sex = sex;
    }

    public String getAddress() {
        return address;
    }

    public void setAddress(String address) {
        this.address = address;
    }

    @Override
    public String toString() {
        return "User{" +
                "id=" + id +
                ", username='" + username + '\'' +
                ", birthday=" + birthday +
                ", sex='" + sex + '\'' +
                ", address='" + address + '\'' +
                '}';
    }
}
  • 编写测试类代码
    • 三大对象作用和生命周期

在mybatis中一个会话相当于一次访问数据库的过程,一个会话对象类似于一个Connection连接对象

  1. SqlSessionFactoryBuilder:这是一个临时对象,用完就不需要了。通过这个工厂建造类来创建一个会话工厂。
  2. SqlSessionFactory:从一个工厂类中得到一个会话对象,一个项目中只需要创建一个会话工厂对象即可。通过会话工厂对象来创建会话对象。
  3. SqlSession: 每次访问数据库都需要创建一个会话对象,这个会话对象不能共享。访问完成以后会话需要关闭。
public class MyBatisTest01 {
    //从MySQL中查询所有的用户
    @Test
    public void test02() throws Exception{
        //1.从xml文件中构建SqlSessionFactory
        //定义核心配置文件路径
        String resource = "mybatis-config.xml";
        //加载核心配置文件获取输入流
        InputStream inputStream = Resources.getResourceAsStream(resource);
        SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);

        //2.从SqlSessionFactory中获取session
        SqlSession session = sqlSessionFactory.openSession();

        //3.使用session获取接口的动态代理对象
        UserMapper mapper = session.getMapper(UserMapper.class);
        //4.使用接口对象调用接口中的方法
        List<User> userList = mapper.findAllUsers();
        //5.遍历集合
        for (User user : userList) {
            System.out.println(user);
        }
        //关闭会话
        session.close();
    }
}

编写流程:Resources工具类直接可以读取src目录下配置文件,转成输入流。

6.运行结果:

image-20211103174920718

注意

mybatis配置文件分两种

  1. 核心配置文件:mybatis-config.xml 配置连接数据库参数
  2. 映射文件:UserMapper.xml编写SQL语句

项目结构

image-20211103190702567

小结

mybatis动态代理对象实现过程:
【1】书写dao层: UserMapper.java接口 --定义方法
【2】把接口和映射文件绑定:
		1、映射文件的namespace="接口的全限定类名";
		2、映射文件中sql语句的id值必须为 接口中方法名
【3】获取接口的动态代理对象:
	 UserMapper userMapper = sqlSession.getMapper(UserMapper.class);
	 List<User> userList = userMapper.findAllUser();

3.2入门案例:mybatis执行流程分析

image-20200604063501686

说明:

1.第一步:是从核心配置文件mybatis-config.xml中构建SqlSessionFactory对象,由于核心配置文件mybatis-config.xml中关联了映射文件UserMapper.xml,所以在SqlSessionFactory中也存在映射文件的内容

2.第二步:是从SqlSessionFactory中获取SqlSession会话对象,其实SqlSession会话对象底层封装的就是conn连接对象

3.第三步:是通过SqlSession会话对象调用查询方法selectList然后根据参数找到映射文件中中的sql语句并将数据封装到pojo的User对象中

3.3入门案例:核心配置文件 mybatis-config.xml

在resources目录下核心配置文件

image-20200604064352844

<?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>
    <!--mybatis环境的配置-->
    <environments default="development">
        <!--通常我们只需要配置一个就可以了, id是环境的名字 -->
        <environment id="development">
            <!--事务管理器:由JDBC来管理-->
            <transactionManager type="JDBC"/>
            <!--数据源的配置:mybatis自带的连接池-->
            <dataSource type="POOLED">
                <property name="driver" value="com.mysql.jdbc.Driver"/>
                <property name="url" value="jdbc:mysql://localhost:3306/db4"/>
                <property name="username" value="root"/>
                <property name="password" value="1234"/>
            </dataSource>
        </environment>
    </environments>
    <mappers>
        <!--加载映射文件,放到src下即可-->
        <mapper resource="userMapper.xml"/>
    </mappers>
</configuration>
  • 可以在idea中定义模板,以后重用。

image-20200603233026215

<?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="db.properties"></properties>
    <!--settings-->
    <settings>
        <!--开启驼峰自动映射-->
        <setting name="mapUnderscoreToCamelCase" value="true"/>
    </settings>
    <!--别名-->
    <typeAliases>
        <package name="com.itheima.sh.pojo"></package>
    </typeAliases>
    <!--mybatis环境的配置
        一个核心配置文件,可以配置多个运行环境,default默认使用哪个运行环境
    -->
    <environments default="development">
        <!--通常我们只需要配置一个就可以了, id是环境的名字 -->
        <environment id="development">
            <!--事务管理器:由JDBC来管理-->
            <!--
                事务管理器type的取值:
                1. JDBC:由JDBC进行事务的管理
                2. MANAGED:事务由容器来管理,后期学习Spring框架的时候,所有的事务由容器管理
            -->
            <transactionManager type="JDBC"/>
            <!--数据源的配置:mybatis自带的连接池-->
            <!--
                数据源:
                1. POOLED:使用mybatis创建的连接池
                2. UNPOOLED:不使用连接池,每次自己创建连接
                3. JNDI:由服务器提供连接池的资源,我们通过JNDI指定的名字去访问服务器中资源。
            -->
            <dataSource type="POOLED">
                <property name="driver" value="${jdbc.driver}"/>
                <property name="url" value="${jdbc.url}"/>
                <property name="username" value="${jdbc.username}"/>
                <property name="password" value="${jdbc.password}"/>
            </dataSource>
        </environment>

    </environments>
    <!--映射器-->
    <mappers>
        <!--加载其它的映射文件 注:注解开发是点号-->
        <!-- <package name="com.itheima.sh.dao"></package>-->
        <!--加载其它的映射文件 注:不是点号-->
        <!--<mapper resource="org/mybatis/example/BlogMapper.xml"/>-->
        <!--
            加载其它的映射文件 xml形式
                包扫描方式加载mapper映射文件,说明:
                1. 要求mapper映射文件,与mapper接口要放在同一个目录
                2. 要求mapper映射文件的名称,与mapper接口的名称要一致
            -->
        <package name="com.itheima.sh.dao"></package>
    </mappers>
</configuration>

3.4入门案例:常见错误

  • 在映射文件userManager.xml中的resultType位置没有书写类的全名

    image-20200604070423320

  • 在核心配置文件中没有引入映射文件

image-20200604070727628

小结:

1、mybatis框架的核心组件:

SqlSessionFactoryBuilder;会话工厂构造类创建会话工厂对象

​ SqlSessionFactory:会话工厂类创建会话对象
​ SqlSession:会话类

2、入门程序开发流程:
【1】从xml文件中构建:SqlSessionFactory_
【2】从SqlSessionFactory中获取:SqlSession_
【3】通过__SqlSession____执行___映射文件___文件中的sql语句

4.mybatis核心配置

【mybatis全局配置介绍】

​ mybatis-config.xml,是MyBatis的全局配置文件,包含全局配置信息,如数据库连接参数、插件等。整个框架中只需要一个即可。

1、mybatis全局配置文件是mybatis框架的核心配置,整个框架只需一个;
2、mybatis全局配置文件中的配置顺序:注意如果配置多项,必须按照以下顺序进行配置
	properties:属性配置
	settings:设置
	typeAliases:类型别名设置
	typeHandlers:类型处理器
	enviroments:环境配置
		environment(环境变量)
		transactionManager(事务管理器)
		dataSource(数据源)
	mappers:映射器

1、properties(属性)

【作用】

1、加载外部的java资源文件(properties文件);
2、通过子标签property设置属性;

【需求】

使用properties属性,配置数据库连接参数;

【1】property标签设置

1、通过properties的子标签设置属性;
2、使用${key}获取设置的属性值;

【2】加载外部properties

第一步:新建资源文件

新建jdbc.properties文件,将连接参数抽取到配置文件中:

driver=com.mysql.jdbc.Driver
url=jdbc:mysql://localhost:3306/db4
username=root
password=1234
第二步:引入资源文件

在mybatis-config.xml文件中加载jdbc.properties文件;通过properties的属性resource引入;

1573114219207

【注意事项】:子标签和属性resource同时加载一个变量,先加载子标签,然后在加载resource关联的外部文件的值,那么子标签中的内容会被覆盖。此时子标签存在就没有意义了。

image-20200605102640305

2、settings(设置)

settings参数有很多,今天咱们先学习驼峰匹配-mapUnderscoreToCamelCase。翻译过来就是映射下划线到驼峰式命名。

1564450693748

【作用】

1564450787721

开启驼峰匹配:完成经典的数据库命名到java属性的映射
		经典数据库命名:如果多个单词之间,通常使用下划线进行连接。
		java中命名:第二个单词首字母大写。
驼峰匹配:相当于去掉数据库的数据中的名字的下划线,和java进行匹配  

【应用场景】

从数据库中查到数据的字段名user_name和实体类属性名userName,不一致,导致查到的数据无法封装到实体类中。
但是,实体类中的属性userName符合驼峰命名,数据库字段名user_name符合数据库经典字段命名。

1573114533312

如果此时直接查询数据,那么用户名是null。

image-20200605104657176

【1】配置驼峰映射

​ 在mybatis-config.xml中做如下配置:

settings设置:
 mapUnderscoreToCamelCase :驼峰自动映射配置 ,值是true表示开启驼峰自动映射。满足条件:数据库字段名  user_name   ,实体类属性名 userName
<!--
    2、settings设置:
 mapUnderscoreToCamelCase :驼峰自动映射配置 满足条件:数据库字段名  user_name   ,实体类属性名 userName
 -->
<settings>
  <setting name="mapUnderscoreToCamelCase" value="true"/>
</settings>

​ 运行测试,查看结果:

image-20200605104827081

【小结】

1、开启驼峰自动映射的作用:user_name ====> userName;
2、注意事项:字段名必须符合user_name格式,属性名必须符合驼峰命名规则;

【2】解决字段名和属性名不一致的方法

	如果数据库字段名和属性名不一致,或者是也不满足上面的命名规则。可以通过在SQL语句中为字段名取别名进行映射。

1573114704719

3、typeAliases(类型别名)

【1】作用

类型别名是给类的全限定名称(包名.类名) 取一个短名称。存在的意义仅在于用来减少类完全限定名的冗余。例如:

1573114789567

​ 这些全限定类名可通过设置类型别名--短名称代替。类型别名的设置有以下几种方式:

方式:使用typeAliases标签的子标签package包扫描映射别名;

【2】应用

【方式】package

​ 扫描指定包下的所有类,扫描之后的别名就是类名,大小写不敏感(不区分大小写),建议使用的时候和类名一致。

设置别名:

<!--
        三、typeAliases(类型别名)
            【1】作用:给类的全限定名称 取一个短名称   com.heima.mybatis.pojo.User==>User
            【2】用法:
                1、单独取别名:<typeAlias type="com.heima.mybatis.pojo.User" alias="User"/>
                2、批量取别名:<package name="com.heima.mybatis.pojo"/> 扫描到当前包下的所有类
                              类的类名==》别名
    -->
    <typeAliases>
      
        <!--扫描com.itheima.sh.pojo包下所有的类,类名直接作为别名(别名不区分大小写)-->
        <package name="com.itheima.sh.pojo"/>
    </typeAliases>

使用别名:

1573114945923

【内置别名】

​ 这是一些为常见的 Java 类型内建的相应的类型别名。它们都是不区分大小写的,注意对基本类型名称重复采取的特殊命名风格。

别名 映射的类型
_byte byte
_long long
_short short
_int int
_integer int
_double double
_float float
_boolean boolean
string String
byte Byte
long Long
short Short
int Integer
integer Integer
double Double
float Float
boolean Boolean
date Date
decimal BigDecimal
bigdecimal BigDecimal
object Object
map Map
hashmap HashMap
list List
arraylist ArrayList
collection Collection
iterator Iterator

【代码演示】

<!--parameterType="int" 表示sql语句参数id的类型,int是Integer的别名-->
    <select id="queryById" resultType="user" parameterType="int">
        select * from user where id = #{id}
    </select>

4、typeHandlers(类型处理器)【了解】

​ 无论是 MyBatis 在预处理语句(PreparedStatement)中设置一个参数时,还是从结果集中取出一个值时, 都会用类型处理器将获取的值以合适的方式转换成 Java 类型。下表描述了一些默认的类型处理器。

1564454364699

<!--
        四、typeHandlers(类型处理器)
            数据库数据类型:varchar    ===StringTypeHandler===> 实体类:String
            数据库数据类型:double   DoubleTypeHandler  实体类中的数据: java.lang.Double 
-->

5、environments【了解】

	MyBatis 可以配置成适应多种环境,例如,开发、测试和生产环境需要有不同的配置;
尽管可以配置多个环境,每个 SqlSessionFactory 实例只能选择其一。
虽然,这种方式也可以做到很方便的分离多个环境,但是实际使用场景下,我们更多的是选择使用spring来管理数据源,来做到环境的分离。
      父标签: environments(环境配置)
			子标签:
                environment(环境变量)
                transactionManager(事务管理器)
                dataSource(数据源) 

【1】默认环境设置

第一步:在environments标签中配置多个environment,通过属性default指定一个默认环境配置;

1564454860715

第二步:在构建SqlSessionFactory时,可指定具体环境,如果不指定就使用默认的环境配置;

1564455076644

【2】指定环境设置

第一步:在environments中配置多个环境

1564454860715

第二步:在构建SqlSessionFactory时,通过environment的id指定环境

1564455250663

代码演示:

<!--mybatis环境的配置-->
    <!--
        五、 environments(数据库环境配置)
                开发过程中会使用第三方的连接池:druid,C3P0
                Spring框架管理连接池
    -->
    <!--<environments default="test">-->
    <environments default="development">
        <!--通常我们只需要配置一个就可以了, id是环境的名字 -->
        <environment id="development">
            <!--事务管理器:由JDBC来管理-->
            <transactionManager type="JDBC"/>
            <!--数据源的配置:mybatis自带的连接池-->
            <dataSource type="POOLED">
                <!--
                    这里的value="${driver}"  driver 是子标签property的name属性值
                -->
                <property name="driver" value="${driver}"/>
                <property name="url" value="jdbc:mysql://localhost:3306/db4"/>
                <property name="username" value="root"/>
                <property name="password" value="1234"/>
            </dataSource>
        </environment>


        <!--通常我们只需要配置一个就可以了, id是环境的名字 -->
        <environment id="test">
            <!--事务管理器:由JDBC来管理-->
            <transactionManager type="JDBC"/>
            <!--数据源的配置:mybatis自带的连接池-->
            <dataSource type="POOLED">
                <!--
                    这里的value="${driver}"  driver 是子标签property的name属性值
                -->
                <property name="driver" value="${driver}"/>
                <property name="url" value="jdbc:mysql://localhost:3306/db4"/>
                <property name="username" value="root"/>
                <property name="password" value="12345"/>
            </dataSource>
        </environment>
    </environments>
    @Test
    public void queryById( ) throws Exception {
        //获取mapper接口的动态代理实现

        //1、从xml中构建SqlSessionFactory
        String resource = "mybatis-config.xml";
        InputStream inputStream = Resources.getResourceAsStream(resource);
        //这里指定了环境为test
//        SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream,"test");
        //build不方法不指定环境就使用默认的 <environments default="development">
        SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);

        //2、获取SqlSession
        SqlSession sqlSession = sqlSessionFactory.openSession();

        //3、获取UserMapper接口的动态代理对象
        UserMapper userMapper = sqlSession.getMapper(UserMapper.class);

        User user = userMapper.queryById(1);
        System.out.println("user = " + user);
    }

【注意事项】

	虽然,这种方式也可以做到很方便的分离多个环境,但是实际使用场景下,我们更多的是选择使用第三方的连接池:druid,C3P0。并且使用spring来管理数据源(连接池),来做到环境的分离。 

6、mappers(映射器)

mappers(映射器):UserMapper.xml====>UserMapper.java接口 关联.

作用:维护接口和映射文件之间的关系.

​ 既然 MyBatis 的行为已经由上述元素配置完了,我们现在就要定义 SQL 映射语句了。 但是首先我们需要告诉 MyBatis 到哪里去找到这些语句。 Java 在自动查找这方面没有提供一个很好的方法,所以最佳的方式是告诉MyBatis 到哪里去找映射文件。 你可以使用相对于类路径的资源引用, 或完全限定资源定位符(包括 file:/// 的 URL),或类名和包名等。方式如下:

使用方式:
1、加载映射文件,关联UserMapper.java接口
【1】 从src下加载映射文件;

​ 2、加载接口,关联映射文件
​ 条件:1、接口名和映射文件名保持一致;2、路径保持一致;
​ 【2】批量加载class:

方式一:加载映射文件方式resource

​ 在mybatis-config.xml文件中,通过mapper标签的resource属性引入当前工程src下的映射文件。

1564455787409

【缺点】

有多少个映射文件就要配置多少次,麻烦。

方式二:加载接口,关联映射文件方式package

在mybatis-config.xml中,开启包扫描:扫描包下的所有接口和对应的映射文件。

条件:1、接口名和映射文件名保持一致;2、路径保持一致;

image-20210922174555288

image-20210922174621650

在mybatis-config.xml配置mapper接口的全路径:

    <mappers>
        <package name="com.itheima.sh.dao"/>
    </mappers>

【原理】:

扫描目标包目录下的mapper接口,并按照class的方式找到接口对应的映射文件。

其条件和设置class的条件一样:

1、映射文件和mapper接口在同一个目录下
2、文件名必须一致
3、映射文件的namespace必须和mapper接口的全路径保持一致

【缺点】:

1、需要遵守的条件太多
2、mapper.xml和mapper.java没有分离。

【mappers小结】:

mappers:配置映射文件
	mapper
		resource:配置类路径下的映射文件(掌握)
		
	   package:配置接口包扫描(掌握)
            1、要求接口和映射文件在同一个包下
            2、要求接口和映射文件同名
            3、要求namesapce的值必须为接口的全限定类名

【推荐使用】resource加载映射文件,如果使用注解开发只能使用 package方式,注解开发不能使用加载配置文件的方式,因为注解已经取代了xml文件。所有注解都使用在接口的方法上。

7、全局配置小结

一、全局配置:如果需要配置多个,必须按照以下顺序
    properties(属性)重点
    settings(设置)重点
    typeAliases(类型别名) 重点
    typeHandlers(类型处理器)
    environments(环境配置)
        environment(环境变量)
        transactionManager(事务管理器)
        dataSource(数据源)
    mappers(映射器)重点
二、常用配置:
	1、properties(属性)
		【作用】定义一些属性或者加载外部的资源文件
		【用法】
		   2、加载外部的资源文件(src, jdbc.properties)掌握
				<properties resource="jdbc.properties"></properties>
				获取参数: ${driver}
	2、settings(设置):
		驼峰自动映射:数据库下划线命名:user_name  ===》实体类属性命名:userName
			    <settings>
                      <setting name="mapUnderscoreToCamelCase" value="true"/>
                  </settings>
			说明:如果不满足驼峰式命名,查询时起别名。
   3、typeAliases(类型别名)
		【作用】给类的全名称 取 短名称  com.heima.pojo.User===>User,不区分大小写
		【配置】
			 <typeAliases>
           
                <package name="com.heima.mybatis.pojo"/> 掌握
            </typeAliases>

   4、mappers(映射器)
		【作用】把映射文件   和  接口 进行绑定
		【配置】
			加载xml文件:
				1、mapper resource="src下的映射文件"    多
			
			加载接口:【1】映射文件和接口名称必须一致; 【2】路径一致
				2、接口扫描: package name="com.heima.mybatis.dao" 多

5.搭建mybatis案例步骤(今日总结):

【1】创建maven项目

【2】在pom.xml文件中导入依赖

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <groupId>com.itheima.sh.heima141</groupId>
    <artifactId>day06-maven_mybatis03</artifactId>
    <version>1.0-SNAPSHOT</version>

    <properties>
        <maven.compiler.source>8</maven.compiler.source>
        <maven.compiler.target>8</maven.compiler.target>
    </properties>

   <dependencies>
       <!--mybatis核心包-->
       <dependency>
           <groupId>org.mybatis</groupId>
           <artifactId>mybatis</artifactId>
           <version>3.5.0</version>
       </dependency>
       <!--logback日志包-->
       <dependency>
           <groupId>org.slf4j</groupId>
           <artifactId>slf4j-api</artifactId>
           <version>1.7.26</version>
       </dependency>
       <dependency>
           <groupId>ch.qos.logback</groupId>
           <artifactId>logback-core</artifactId>
           <version>1.2.3</version>
       </dependency>
       <dependency>
           <groupId>ch.qos.logback</groupId>
           <artifactId>logback-classic</artifactId>
           <version>1.2.3</version>
       </dependency>
       <!--mysql驱动-->
       <dependency>
           <groupId>mysql</groupId>
           <artifactId>mysql-connector-java</artifactId>
           <version>5.1.18</version>
       </dependency>

       <dependency>
           <groupId>junit</groupId>
           <artifactId>junit</artifactId>
           <version>4.10</version>
           <scope>test</scope>
       </dependency>

   </dependencies>
</project>

【3】创建核心配置文件

<?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>
    <!--
        1.加载外部的配置文件
    -->
    <properties resource="db.properties"/>
    <!--    
        2.经典命名
    -->
    <settings>
        <setting name="mapUnderscoreToCamelCase" value="true"/>
    </settings>
    <!--    
        3.别名 只需要使用实体类类名User
    -->
    <typeAliases>
        <package name="com.itheima.sh.pojo"/>
    </typeAliases>
    <environments default="development">
        <environment id="development">
            <transactionManager type="JDBC"/>
            <dataSource type="POOLED">
                <property name="driver" value="${jdbc.driver}"/>
                <property name="url" value="${jdbc.url}"/>
                <property name="username" value="${jdbc.username}"/>
                <property name="password" value="${jdbc.password}"/>
            </dataSource>
        </environment>
    </environments>
    <!--    
        加载接口加载映射文件
    -->
    <mappers>
       <package name="com.itheima.sh.dao"/>
    </mappers>
</configuration>

【4】db.properties

# 连接数据库的驱动
jdbc.driver=com.mysql.jdbc.Driver
# 连接数据库的连接地址
jdbc.url=jdbc:mysql:///day06_heima141
# 连接数据库的用户名
jdbc.username=root
# 连接数据库的密码
jdbc.password=1234


【5】映射文件

<?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 namespace="com.itheima.sh.dao.UserMapper">
    <select id="queryAllUsers" resultType="User">
        select * from user
    </select>
</mapper>

【6】UserMapper接口

package com.itheima.sh.dao;

public interface UserMapper {
    List<User> queryAllUsers();
}

【7】User

package com.itheima.sh.pojo;

import java.util.Date;

public class User {
    private Integer id;
    private String userName;
    private Date birthday;
    private String sex;
    private String address;

    public User() {
    }

    public User(Integer id, String userName, Date birthday, String sex, String address) {
        this.id = id;
        this.userName = userName;
        this.birthday = birthday;
        this.sex = sex;
        this.address = address;
    }

    public Integer getId() {
        return id;
    }

    public void setId(Integer id) {
        this.id = id;
    }

    public String getUserName() {
        return userName;
    }

    public void setUserName(String userName) {
        this.userName = userName;
    }

    public Date getBirthday() {
        return birthday;
    }

    public void setBirthday(Date birthday) {
        this.birthday = birthday;
    }

    public String getSex() {
        return sex;
    }

    public void setSex(String sex) {
        this.sex = sex;
    }

    public String getAddress() {
        return address;
    }

    public void setAddress(String address) {
        this.address = address;
    }

    @Override
    public String toString() {
        return "User{" +
                "id=" + id +
                ", userName='" + userName + '\'' +
                ", birthday=" + birthday +
                ", sex='" + sex + '\'' +
                ", address='" + address + '\'' +
                '}';
    }
}

【8】测试类

package com.itheima.sh.a_test_01;

import com.itheima.sh.dao.UserMapper;
import com.itheima.sh.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 org.junit.Test;

import java.util.List;

public class MyBatisTest {

    @Test
    public void queryAllUsers() throws Exception{
        //1.创建会话工厂创造类的对象
        SqlSessionFactoryBuilder builder = new SqlSessionFactoryBuilder();
        //2.创建会话工厂对象
        SqlSessionFactory factory = builder.build(Resources.getResourceAsStream("mybatis-config.xml"));
        //3.获取会话对象
        SqlSession sqlSession = factory.openSession();
        //4.使用sqlSession调用方法获取接口代理对象
        UserMapper mapper = sqlSession.getMapper(UserMapper.class);
        //5.使用接口代理对象调用方法
        List<User> list = mapper.queryAllUsers();
        //6.输出
        System.out.println("list = " + list);
    }
}

[9]项目结构

image-20220121173412932

posted @   忘了鱼尾纱的猫  阅读(77)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· AI 智能体引爆开源社区「GitHub 热点速览」
· 从HTTP原因短语缺失研究HTTP/2和HTTP/3的设计差异
· 三行代码完成国际化适配,妙~啊~
  1. 1 刘哈哈与大先生 刘心&大鹏
  2. 2 我们打着光脚在风车下跑,手上的狗尾巴草摇啊摇 等一下就回家 / -艾兜
  3. 3 哎呦 毛不易
  4. 4 夜、萤火虫和你 AniFace
哎呦 - 毛不易
00:00 / 00:00
An audio error has occurred, player will skip forward in 2 seconds.

作曲 : 毛不易

作词 : 毛不易

编曲Arranger :赵兆 宋涛

刚刚下过雨潮湿的空气

刚刚下过雨潮湿的空气

熟悉的风景

收拾好行李出发去旅行

希望能遇见你

也许在路上或是在家里

某时某刻某地

莫名其妙 你打了个喷嚏

戴上太阳帽我走过海岛

浪花都带着笑

笑我慌慌张张笨手笨脚

找你都找不到

你的模样虽然我不知道

依然努力奔跑

会相遇吧 在下一个街角

我会带你住进城堡 门前开满了花花草草

暖风拂过你的裙角 蝴蝶在你身边围绕

等到月亮挂在树梢 我会轻轻把你拥抱

哎哟 好想长生不老

戴上太阳帽我走过海岛

浪花都带着笑

笑我慌慌张张笨手笨脚

找你都找不到

你的模样虽然我不知道

依然努力奔跑

会相遇吧 在下一个街角

我会带你住进城堡 门前开满了花花草草

暖风拂过你的裙角 蝴蝶在你身边围绕

等到月亮挂在树梢 我会轻轻把你拥抱

哎哟 好想长生不老

我会带你住进城堡 门前开满了花花草草

暖风拂过你的裙角 蝴蝶在你身边围绕

等到月亮挂在树梢 我会轻轻把你拥抱

哎哟 好想长生不老

我会带你回到故乡 回到出发之前的地方

你的未来我的过去 就在这里合二为一

明天刮风还是下雨 明天生活是悲是喜

哎哟 有你不费力气

哎哟 快让我遇见你

制作人Producer:李健 赵兆

制作人Producer:李健 赵兆

制作人Producer:李健 赵兆

键盘Keyboard:宋涛

吉他Guitar:劳国贤

合音Backing Vocal:梁古驰

混音Mixing:李游

母带Mastering:Joe LaPorta .(Sterling Sound. NY)

录音棚Studio:55TEC . Beijing

录音Recording:李游 李杨

人声录音Vocal Recording:李杨

人声编辑Vocal Editing:李杨

录音助理Recording Assistants:郭舒文 邢铜

音乐制作发行produced and distributed: 哇唧唧哇×智慧大狗

点击右上角即可分享
微信分享提示