Day06-2.MyBatis配置文件和映射文件笔记
MyBatis(第1天)
学习目标
-
能够了解什么是框架
-
掌握mybatis框架开发快速入门
-
掌握mybatis的dao层动态代理实现
-
mybatis核心配置
-
可以写出会话工具类
-
mybatis映射文件配置
今日作业
1.搭建maven工程,运行hello world
2.搭建mybatis环境,查询所有用户,使用代理方式
3.掌握核心配置文件的常用四个标签 properties settings typealiases mappers
4.预习(1-3个小时)
1.框架概述
目标
-
什么是框架
-
框架解决了哪些问题
-
分层开发下常见的框架
什么是框架
程序开发中的框架往往是对常见功能的封装,通常与具体业务无关,也可以认为是软件的半成品。程序框架理解为基础或者机械标准件(例如螺丝螺母标准的机械部件)。
假如你要造一辆马车,在没有框架的情况下,你需要自己去伐木,去把木头做成木板,木棍,然后组成轮子,门,等部件,然后组装起来。但如果你用了框架,就相当于你有现成的轮子,门等部件,你只需要组装一下就可以了。
一个框架是一组可复用的设计构件。
框架(Framework)是整个或者部分系统的可重用设计,是JavaEE底层技术的封装。
框架是可以被开发者定制的应用骨架。
框架是一个半成品,软件是成品。我们在它的基础上开发出成品(软件)。
框架解决的问题
解决了技术通用的问题
在JavaEE体系中,有着各种各样的技术。不同的软件企业,根据自身的业务需求选择不同的技术,容易造成应用依赖技术,增加了项目开发实现的复杂性和技术风险性。而框架技术就可以解决上述问题。
提升了开发效率
企业项目中使用框架,只需要专注实现业务需求。使用框架的方便性,提升了开发效率。
提升了系统稳定性
一个成熟的框架,经过了在众多企业项目中的验证使用,稳定性有保障。
小结
- 理解为软件中标准件,程序员可以利用这些半成品来开发软件。
- 提高开发效率,降低开发成本。
- 以后我们在企业中开发项目基本上都是使用框架来开发
2.mybatis框架介绍
目标
-
mybatis框架介绍
-
mybatis框架官网和jar包下载
mybatis框架介绍
mybatis是Apache软件基金会下的一个开源项目,前身是iBatis框架。2010年这个项目由apache 软件基金会迁移到google code下,改名为mybatis。2013年11月又迁移到了github(GitHub 是一个面向开源及私有 软件项目的托管平台)。
MyBatis 是一款优秀的持久层框架,它支持定制化 SQL、存储过程以及高级映射(多表)。MyBatis 避免了几乎所有的 JDBC 代码和手动设置参数以及获取结果集。它对 jdbc 的操作数据库的过程进行封装,使开发者只需要关注 SQL 本身,而不需要花费精力去处理例如注册驱动、创建 connection、创建 statement、手动设置参数、结果集检索等 jdbc 繁杂的过程代码。MyBatis 可以使用简单的 XML 或注解来配置和映射原生类型、接口和 Java 的 POJO(Plain Old Java Objects,普通老式 Java 对象)为数据库中的记录。
mybatis的优点
- 简单易学:mybatis本身就很小且简单。没有任何第三方依赖,最简单安装只要两个jar文件+配置几个SQL映射文件即可。
- 使用灵活:Mybatis不会对应用程序或者数据库的现有设计强加任何影响。SQL语句写在XML里,便于统一管理和优化。
- 解除SQL与程序代码的耦合:通过提供DAO层,将业务逻辑和数据访问逻辑分离,使系统的设计更清晰,更易维护,更易进行单元测试。SQL语句和代码的分离,提高了可维护性。
mybatis的不足
- 编写SQL语句时工作量很大,尤其是字段多、关联表多时,更是如此。
- SQL语句依赖于数据库,导致数据库移植性差,不能更换数据库。
- 框架还是比较简陋,功能尚有缺失。
官方网站及框架包下载
官网地址:http://www.mybatis.org/mybatis-3/
源码和包下载地址:https://github.com/mybatis/mybatis-3/releases
下载后的包位于课后资料中:
mybatis框架整体架构
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 对象关系映射
MyBatis的两种映射方式:
- 通过XML映射
- 通过注解
小结
1、mybatis解决了三层(web,service,dao)中哪一层的问题?
dao(数据持久层)
2、mybatis框架是对什么技术进行的封装?
JDBC
3、mybatis框架中的核心组件有哪些?
SqlSessionFactoryBuilder:SqlSessionFactory工厂的创造类
SqlSessionFactory:加载配置信息,提供SqlSession
SqlSession: 数据操作的对象 sql语句
3.MyBatis框架入门开发【掌握】
3.1入门案例:环境的搭建和代码实现
目标
-
mybatis开发环境的搭建
-
了解mybatis的开发步骤
需求
利用mybatis框架,从MySQL中查询所有的用户
准备数据
要查询的表
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官网入门步骤进行开发即可:
-
创建maven工程,导入坐标
-
日志记录包:mybatis在执行过程中输出的一些信息,mybatis底层需要使用logback日志框架
-
mysql驱动
-
mybatis框架的包
<!--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连接对象。
- SqlSessionFactoryBuilder:这是一个临时对象,用完就不需要了。通过这个工厂建造类来创建一个会话工厂。
- SqlSessionFactory:从一个工厂类中得到一个会话对象,一个项目中只需要创建一个会话工厂对象即可。通过会话工厂对象来创建会话对象。
- 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.运行结果:
注意
mybatis配置文件分两种
- 核心配置文件:mybatis-config.xml 配置连接数据库参数
- 映射文件:UserMapper.xml编写SQL语句
项目结构
小结
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执行流程分析
说明:
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目录下核心配置文件
-
可以在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>
<!--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中定义模板,以后重用。
<?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位置没有书写类的全名
-
在核心配置文件中没有引入映射文件
小结:
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引入;
【注意事项】:子标签和属性resource同时加载一个变量,先加载子标签,然后在加载resource关联的外部文件的值,那么子标签中的内容会被覆盖。此时子标签存在就没有意义了。
2、settings(设置)
settings参数有很多,今天咱们先学习驼峰匹配-mapUnderscoreToCamelCase。翻译过来就是映射下划线到驼峰式命名。
【作用】
开启驼峰匹配:完成经典的数据库命名到java属性的映射
经典数据库命名:如果多个单词之间,通常使用下划线进行连接。
java中命名:第二个单词首字母大写。
驼峰匹配:相当于去掉数据库的数据中的名字的下划线,和java进行匹配
【应用场景】
从数据库中查到数据的字段名user_name和实体类属性名userName,不一致,导致查到的数据无法封装到实体类中。
但是,实体类中的属性userName符合驼峰命名,数据库字段名user_name符合数据库经典字段命名。
如果此时直接查询数据,那么用户名是null。
【1】配置驼峰映射
在mybatis-config.xml中做如下配置:
settings设置:
mapUnderscoreToCamelCase :驼峰自动映射配置 ,值是true表示开启驼峰自动映射。满足条件:数据库字段名 user_name ,实体类属性名 userName
<!--
2、settings设置:
mapUnderscoreToCamelCase :驼峰自动映射配置 满足条件:数据库字段名 user_name ,实体类属性名 userName
-->
<settings>
<setting name="mapUnderscoreToCamelCase" value="true"/>
</settings>
运行测试,查看结果:
【小结】
1、开启驼峰自动映射的作用:user_name ====> userName;
2、注意事项:字段名必须符合user_name格式,属性名必须符合驼峰命名规则;
【2】解决字段名和属性名不一致的方法
如果数据库字段名和属性名不一致,或者是也不满足上面的命名规则。可以通过在SQL语句中为字段名取别名进行映射。
3、typeAliases(类型别名)
【1】作用
类型别名是给类的全限定名称(包名.类名) 取一个短名称。存在的意义仅在于用来减少类完全限定名的冗余。例如:
这些全限定类名可通过设置类型别名--短名称代替。类型别名的设置有以下几种方式:
方式:使用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>
使用别名:
【内置别名】
这是一些为常见的 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 类型。下表描述了一些默认的类型处理器。
<!--
四、typeHandlers(类型处理器)
数据库数据类型:varchar ===StringTypeHandler===> 实体类:String
数据库数据类型:double DoubleTypeHandler 实体类中的数据: java.lang.Double
-->
5、environments【了解】
MyBatis 可以配置成适应多种环境,例如,开发、测试和生产环境需要有不同的配置;
尽管可以配置多个环境,每个 SqlSessionFactory 实例只能选择其一。
虽然,这种方式也可以做到很方便的分离多个环境,但是实际使用场景下,我们更多的是选择使用spring来管理数据源,来做到环境的分离。
父标签: environments(环境配置)
子标签:
environment(环境变量)
transactionManager(事务管理器)
dataSource(数据源)
【1】默认环境设置
第一步:在environments标签中配置多个environment,通过属性default指定一个默认环境配置;
第二步:在构建SqlSessionFactory时,可指定具体环境,如果不指定就使用默认的环境配置;
【2】指定环境设置
第一步:在environments中配置多个环境
第二步:在构建SqlSessionFactory时,通过environment的id指定环境
代码演示:
<!--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】
2、加载接口,关联映射文件
条件:1、接口名和映射文件名保持一致;2、路径保持一致;
【2】批量加载class:
方式一:加载映射文件方式resource
在mybatis-config.xml文件中,通过mapper标签的resource属性引入当前工程src下的映射文件。
【缺点】
有多少个映射文件就要配置多少次,麻烦。
方式二:加载接口,关联映射文件方式package
在mybatis-config.xml中,开启包扫描:扫描包下的所有接口和对应的映射文件。
条件:1、接口名和映射文件名保持一致;2、路径保持一致;
在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);
}
}