【MyBatis】| MyBatis核⼼配置⽂件详解
阿里云国内75折 回扣 微信号:monov8 |
阿里云国际,腾讯云国际,低至75折。AWS 93折 免费开户实名账号 代冲值 优惠多多 微信号:monov8 飞机:@monov6 |
目录
一MyBatis核⼼配置⽂件详解
1configuration根标签表示配置信息。
2environments以“s”结尾表示复数也就是说mybatis的环境可以配置多个数据源。
default属性后面跟着default属性表示默认使⽤的是哪个环境default后⾯填写的是environment的iddefault的值只需要和environment的id值⼀致即可。
3environment具体的环境配置主要包括事务管理器的配置 + 数据源的配置。
id属性给当前环境一个唯⼀标识该标识⽤在environments的default后⾯⽤来指定默认环境的 选择。
4transactionManager配置事务管理器
type属性指定事务管理器具体使⽤什么⽅式可选值包括两个
5dataSource指定数据源
type属性⽤来指定具体使⽤的数据库连接池的策略可选值包括三个
6mappers在mappers标签中可以配置多个sql映射⽂件的路径。
7mapper配置某个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标签
1environments标签表示可以有多个环境一个环境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朗朗乾坤
* @Packagecom.bjpowernode.mybatis.test
* @Projectmybatis
* @nameConfigurationTest
* @Date2022/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具体使用什么方式去管理事务。
2type属性有两个值①JDBC使⽤JDBC原⽣的事务管理机制。
底层原理事务开启 conn.setAutoCommit(false); ...处理业务...事务提交conn.commit();
②MANAGEDmybatis不再负责事务的管理交给其它容器来管理事务⽐如Spring等。如果没有管理事务的容器则没有事务。没有事务的含义是只要执⾏⼀条DML语句则提交⼀次。
3不缺分大小写但是不能写其他值。只能是二选一 jdbc、managed
4在mybatis中提供了一个事务管理器接口Transaction该接口下有两个实现类
①如果type="JDBC"那么底层会实例化JdbcTransaction对象。
②如果type="MANAGED"那么底层会实例化ManagedTransaction对象。
<transactionManager type="JDBC"/>
3. 对数据源的深度剖析
dataSource标签
1dataSource被称为数据源作用是为程序提供连接对象凡是给程序提供Connection对象的都叫做数据源。
2数据源实际上是一套规范。JDK中有这套规范javax.sql.DataSource我们自己也可以编写数据源组件只要实现javax.sql.DataSource接口就行了。实现接口当中所有的方法。这样就有了自己的数据源比如可以写一个属于自己的数据库连接池数据库连接池是提供连接对象的所以数据库连接池就是一个数据源。
3常见的数据源组件有哪些呢【常见的数据库连接池有哪些呢】
阿里巴巴的德鲁伊连接池druid、c3p0、dbcp ....
4type属性用来指定数据源的类型就是指定具体使用什么方式来获取Connection对象type属性有三个值type="[UNPOOLED|POOLED|JNDI]"
①UNPOOLED不使用数据库连接池每一次请求过来后都是创建新的Connection对象
②POOLED使用mybatis自己实现的数据库连接池。
③JNDI集成其它第三方的数据库连接池。5JNDI是java命名目录接口是一套规范。大部分的web容器都实现了JNDI规范例如Tomcat、Jetty、WebLogic、WebSphere这些服务器(容器)都实现了JNDI规范。
6连接池的优点每一次获取连接都是从连接池中拿所以每次连接对象的创建数量都是可控的。①UNPOOLED采⽤传统的获取连接的⽅式虽然也实现Javax.sql.DataSource接⼝但是 并没有使⽤池的思想。 property可以是
😊driverJDBC 驱动的 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标签的配置和使用
1java.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属性使⽤绝对路径中加载资源。