目录
一:MyBatis核⼼配置⽂件详解
(1)configuration:根标签,表示配置信息。
(2)environments:以“s”结尾表示复数,也就是说mybatis的环境可以配置多个数据源。
default属性:后面跟着default属性,表示默认使⽤的是哪个环境,default后⾯填写的是environment的id,default的值只需要和environment的id值⼀致即可。
(3)environment:具体的环境配置(主要包括:事务管理器的配置 + 数据源的配置)。
id属性:给当前环境一个唯⼀标识,该标识⽤在environments的default后⾯,⽤来指定默认环境的 选择。
(4)transactionManager:配置事务管理器
type属性:指定事务管理器具体使⽤什么⽅式,可选值包括两个
(5)dataSource:指定数据源
type属性:⽤来指定具体使⽤的数据库连接池的策略,可选值包括三个
(6)mappers:在mappers标签中可以配置多个sql映射⽂件的路径。
(7)mapper:配置某个sql映射⽂件的路径:
resource属性:使⽤相对于类路径的资源引⽤⽅式 。
url属性:使⽤完全限定资源定位符(URL)⽅式 。
<?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>
<environments default="development">
<environment id="development">
<transactionManager type="JDBC"/>
<dataSource type="POOLED">
<property name="driver" value="com.mysql.cj.jdbc.Driver"/>
<property name="url" value="jdbc:mysql://localhost:3306/po
wernode"/>
<property name="username" value="root"/>
<property name="password" value="root"/>
</dataSource>
</environment>
</environments>
<mappers>
<mapper resource="CarMapper.xml"/>
</mappers>
</configuration>
1. Mybatis核心配置文件之多环境
environments标签
(1)environments标签表示可以有多个环境,一个环境environment对应一个数据库,一个数据库就对应着一个SqlSessionFactory对象!
(2)一个环境environment对应着一个唯一标识的id,多个环境environments对应的default属性可输入environment对应的id,用来指定默认使用的数据库对象
<?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="mybatisDB">
<!--连接的是mybatis数据库-->
<environment id="mybatisDB">
<transactionManager type="JDBC"/>
<dataSource type="POOLED">
<property name="driver" value="com.mysql.jdbc.Driver"/>
<property name="url" value="jdbc:mysql://localhost:3306/mybatis"/>
<property name="username" value="root"/>
<property name="password" value="123"/>
</dataSource>
</environment>
<!--连接的是bjpowernode数据库-->
<environment id="bjpowernodeDB">
<transactionManager type="JDBC"/>
<dataSource type="POOLED">
<property name="driver" value="com.mysql.jdbc.Driver"/>
<property name="url" value="jdbc:mysql://localhost:3306/bjpowernode"/>
<property name="username" value="root"/>
<property name="password" value="123"/>
</dataSource>
</environment>
</environments>
<mappers>
<!--关联CarMapper.xml配置文件-->
<mapper resource="CarMapper.xml"/>
</mappers>
</configuration>
(3)编写sql语句
<?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="car">
<insert id="insertCar">
insert into t_car values(null,'8888','特斯拉',30.0,'2000-11-11','燃油车')
</insert>
</mapper>
(4)编写测试程序
package com.bjpowernode.mybatis.test;
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;
/**
* @Author:朗朗乾坤
* @Package:com.bjpowernode.mybatis.test
* @Project:mybatis
* @name:ConfigurationTest
* @Date:2022/12/30 20:15
*/
public class ConfigurationTest {
@Test
public void testEnvironment() throws Exception{
SqlSessionFactoryBuilder sqlSessionFactoryBuilder = new SqlSessionFactoryBuilder();
// 使用默认的
SqlSessionFactory sqlSessionFactory = sqlSessionFactoryBuilder.build(Resources.getResourceAsStream("mybatis-config.xml"));
// 自己指定连接数据库的对象
SqlSessionFactory sqlSessionFactory = sqlSessionFactoryBuilder.build(Resources.getResourceAsStream("mybatis-config.xml"), "bjpowernodeDB");
SqlSession sqlSession = sqlSessionFactory.openSession();
// 执行sql
int count = sqlSession.insert("car.insertCar");
System.out.println(count);
sqlSession.commit();
sqlSession.close();
}
}
2. Mybatis事务管理器
transactionManager标签
(1)作用:配置事务管理器。指定mybatis具体使用什么方式去管理事务。
(2)type属性有两个值:①JDBC:使⽤JDBC原⽣的事务管理机制。
底层原理:事务开启 conn.setAutoCommit(false); ...处理业务...事务提交conn.commit();
②MANAGED:mybatis不再负责事务的管理,交给其它容器来管理事务,⽐如:Spring等。如果没有管理事务的容器,则没有事务。没有事务的含义是只要执⾏⼀条DML语句,则提交⼀次。
(3)不缺分大小写,但是不能写其他值。只能是二选一: jdbc、managed
(4)在mybatis中提供了一个事务管理器接口:Transaction该接口下有两个实现类:
①如果type="JDBC",那么底层会实例化JdbcTransaction对象。
②如果type="MANAGED",那么底层会实例化ManagedTransaction对象。
<transactionManager type="JDBC"/>
3. 对数据源的深度剖析
dataSource标签
(1)dataSource被称为数据源,作用是为程序提供连接对象;凡是给程序提供Connection对象的都叫做数据源。
(2)数据源实际上是一套规范。JDK中有这套规范:javax.sql.DataSource;我们自己也可以编写数据源组件,只要实现javax.sql.DataSource接口就行了。实现接口当中所有的方法。这样就有了自己的数据源,比如:可以写一个属于自己的数据库连接池(数据库连接池是提供连接对象的,所以数据库连接池就是一个数据源)。
(3)常见的数据源组件有哪些呢【常见的数据库连接池有哪些呢】?
阿里巴巴的德鲁伊连接池:druid、c3p0、dbcp ....
(4)type属性用来指定数据源的类型,就是指定具体使用什么方式来获取Connection对象,type属性有三个值:type="[UNPOOLED|POOLED|JNDI]"
①UNPOOLED:不使用数据库连接池,每一次请求过来后,都是创建新的Connection对象
②POOLED:使用mybatis自己实现的数据库连接池。
③JNDI:集成其它第三方的数据库连接池。(5)JNDI是:java命名目录接口,是一套规范。大部分的web容器都实现了JNDI规范;例如:Tomcat、Jetty、WebLogic、WebSphere,这些服务器(容器)都实现了JNDI规范。
(6)连接池的优点:每一次获取连接都是从连接池中拿,所以每次连接对象的创建数量都是可控的。①UNPOOLED:采⽤传统的获取连接的⽅式,虽然也实现Javax.sql.DataSource接⼝,但是 并没有使⽤池的思想。 property可以是:
????driver:JDBC 驱动的 Java 类全限定名。
????url:数据库的 JDBC URL 地址。
????username:登录数据库的⽤户名。
????password:登录数据库的密码。
????defaultTransactionIsolationLevel:默认的连接事务隔离级别。
????defaultNetworkTimeout:等待数据库操作完成的默认⽹络超时时间(单位:毫秒)
②POOLED:采⽤传统的javax.sql.DataSource规范中的连接池,mybatis中有针对规范的实 现。property可以是(除了包含UNPOOLED中之外):
????poolMaximumActiveConnections – 在任意时间可存在的活动(正在使用)连接数量,默认值:10
????poolMaximumIdleConnections – 任意时间可能存在的空闲连接数;例如:上面配置的最多连接数量是10,这里配置最多空闲的数量是5个,如果空闲第6个了,此时连接池为了保证最多空闲的数量是5个,会真正关闭多余的空闲的连接对象。
????poolMaximumCheckoutTime – 设置超时时间,在被强制返回之前,池中连接被检出(checked out)时间,默认值:20000 毫秒(即 20 秒)。
????poolTimeToWait – 间隔多久打印一次日志信息,并尝试获取连接。
其它....
③JNDI:采⽤服务器提供的JNDI技术实现,来获取DataSource对象,不同的服务器所拿到 DataSource不⼀样。如果不是web或者maven的war⼯程,JNDI是不能使⽤的。property可以是(最多只包含以下两个属性):
????initial_context 这个属性⽤来在 InitialContext 中寻找上下⽂(initialContext.lookup(initial_context))这是个可选属性,如果忽略,那么将会直接从
InitialContext 中寻找 data_source 属性。
????data_source 这是引⽤数据源实例位置的上下⽂路径。提供了 initial_context 配置时会 在其返回的上下⽂中进⾏查找,没有提供时则直接在 InitialContext 中查找。
<dataSource type="POOLED">
<property name="driver" value="com.mysql.jdbc.Driver"/>
<property name="url" value="jdbc:mysql://localhost:3306/bjpowernode"/>
<property name="username" value="root"/>
<property name="password" value="123"/>
<!--连接池中最多正在使用的连接对象的数量上限,默认是10-->
<property name="poolMaximumActiveConnections" value="10" />
<!--最多的空闲数量-->
<property name="poolMaximumIdleConnections" value="5" />
<!--强行让让某个连接空闲,超时时间的设置-->
<property name="poolMaximumCheckoutTime" value="100000" />
<!--每隔2秒打印日志,并且尝试获取连接对象-->
<property name="poolTimeToWait" value="2000" />
</dataSource>
4. properties和mapper标签的配置和使用
(1)java.util.Properties类,实际上是一个Map集合,key和value都是String类型;语法格式:<property name="属性名" value="属性值"/>
(2)例如:我们可以把连接数据库的代码单独抽取出来配置,然后在通过变量的形式赋值过去即可
<?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>
<property name="jdbc.driver" value="com.mysql.jdbc.Driver" />
<property name="jdbc.url" value="jdbc:mysql://localhost:3306/mybatis" />
<property name="jdbc.username" value="root" />
<property name="jdbc.password" value="123" />
</properties>
<settings>
<setting name="logImpl" value="SLF4J"/>
</settings>
<!-- 默认获取的是mybatis数据库-->
<environments default="mybatisDB">
<!--连接的是mybatis数据库-->
<environment id="mybatisDB">
<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>
<!--关联CarMapper.xml配置文件-->
<mapper resource="CarMapper.xml"/>
</mappers>
</configuration>
(3)实际上这些连接数据库中的信息,可以配置到一个文件里;在类路径下(resources),创建一个jdbc.properties文件
jdbc.properties配置文件
jdbc.driver=com.mysql.jdbc.Driver
jdbc.url=jdbc:mysql://localhost:3306/mybatis
jdbc.username=root
jdbc.password=123
使用resource引入配置文件
<?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>
<!--resource一定是从类路径下开始查找资源-->
<properties resource="jdbc.properties" />
<settings>
<setting name="logImpl" value="SLF4J"/>
</settings>
<!-- 默认获取的是mybatis数据库-->
<environments default="mybatisDB">
<!--连接的是mybatis数据库-->
<environment id="mybatisDB">
<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>
<!--关联CarMapper.xml配置文件-->
<mapper resource="CarMapper.xml"/>
</mappers>
</configuration>
(4)也可以使用url属性,表示从绝对路径中加载资源,绝对路径的语法:file:///路径
例如:把jdbc.properties放到d盘的根目录下
<!--从绝对路径下加载-->
<properties url="file:///d:/jdbc.properties" />
(5)注意:mapper标签的使用和properties标签的使用很相似;也是resource属性:使⽤相对于类路径的资源引⽤⽅式 ;url属性:使⽤绝对路径中加载资源。