一、MyBatis环境搭建
1.1、数据的准备
CREATE DATABASE IF NOT EXISTS db_test;
USE db_test;
CREATE TABLE IF NOT EXISTS t_user(
id INT PRIMARY KEY AUTO_INCREMENT,
username VARCHAR(20),
password VARCHAR(20),
age INT,
sex CHAR,
email VARCHAR(30)
);
1.2、导入jar包
通过 maven 的方式导入 jar包,打包方式设置为 jar 包即可。
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.5.7</version>
</dependency>
<!-- https://mvnrepository.com/artifact/mysql/mysql-connector-java -->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.29</version>
</dependency>
<!-- junit 测试程序 -->
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
<scope>test</scope>
</dependency>
1.3、创建核心配置文件
创建 MyBatis 的核心配置文件,习惯上命名为 mybatis-config.xml,这个文件名仅仅只是建议,并非强制要求。配置 MyBatis 的核心配置文件中的标签必须按照固定的顺序:
properties --> settings --> typeAliases --> typeHandlers --> objectFactory --> objectWrapperFactory --> reflectorFactory --> plugins --> environments --> databaseIdProvider --> mappers
<?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>
<!-- settings标签的内容是MyBatis极为重要的调整设置,它们会改变MyBatis的运行时行为 -->
<settings>
<!-- 指定MyBatis所有日志的具体实现,未指定时将自动查找 -->
<setting name="logImpl" value="STDOUT_LOGGING"/>
</settings>
<!-- environments:配置多个连接数据库环境 -->
<environments default="development">
<!-- environment:配置某个具体的环境 -->
<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/db_test"/>
<!-- 设置连接数据库的用户名 -->
<property name="username" value="root"/>
<!-- 设置连接数据库的密码 -->
<property name="password" value="abc123"/>
</dataSource>
</environment>
</environments>
<!--引入映射文件-->
<mappers>
<!--
指定 XxxMapper.xml 配置文件的路径
resource属性自动会从类的根路径下开始查找资源
url属性从绝对路径当中加载资源,一般很少使用,语法格式如下:file:///绝对路径
-->
<mapper resource="UserMapper.xml"/>
</mappers>
</configuration>
1.4、创建实体类
package star.light.pojo;
public class User {
// 数据库表当中的字段应该和pojo类的属性一一对应
// 建议使用包装类,这样可以防止从数据库查出字段的值为null的问题
private Integer id;
private String username;
private String password;
private Integer age;
private Character sex;
private String email;
public User() {
}
public User(Integer id, String username, String password, Integer age, Character sex, String email) {
this.id = id;
this.username = username;
this.password = password;
this.age = age;
this.sex = sex;
this.email = email;
}
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 String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
public Integer getAge() {
return age;
}
public void setAge(Integer age) {
this.age = age;
}
public Character getSex() {
return sex;
}
public void setSex(Character sex) {
this.sex = sex;
}
public String getEmail() {
return email;
}
public void setEmail(String email) {
this.email = email;
}
@Override
public String toString() {
return "User{" +
"id=" + id +
", username='" + username + '\'' +
", password='" + password + '\'' +
", age=" + age +
", sex='" + sex + '\'' +
", email='" + email + '\'' +
'}';
}
}
1.5、创建MyBatis的映射文件
映射文件的命名应该为 表所对应的实体类的类名+Mapper.xml。一个映射文件对应一个实体类,对应一张表的操作。MyBatis映射文件用于编写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">
<!--
namespace用来指定命名空间的,防止id重复
如果在多个Mapper文件中,SQL语句的id重复,这时可以在Java程序中写namespace.id
实质上,本质上,MyBatis中的SQLId的完整写法为namespace.id
-->
<mapper namespace="userMapper">
</mapper>
1.6、封装SqlSessionUtil工具类
package star.light.util;
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;
public class SqlSessionUtil {
private static SqlSessionFactory sqlSessionFactory;
// 为了防止new对象,工具类的构造方法一般都是私有的
// 工具类中所有的方法都是静态的,直接采用类型即可调用,不需要new对象
private SqlSessionUtil(){}
// 静态代码块在类加载的时候执行
// SqlSesionUtil工具类在进行第一次加载的时候,解析MyBatis和核心配置文件,创建SqlSessionFactory对象
static {
try {
sqlSessionFactory = new SqlSessionFactoryBuilder().build(Resources.getResourceAsStream("mybatis-config.xml"));
} catch (IOException e) {
e.printStackTrace();
throw new RuntimeException(e);
}
}
/**
* 获取会话对象
* @return 会话对象
*/
public static SqlSession getSqlSession(){
return sqlSessionFactory.openSession();
}
}
二、MyBatis配置多环境
<environments>
标签用来配置多个数据库环境,它有个属性 default,用来指定默认使用的环境的id。默认环境是指当你使用MyBatis创建SqlSessionFactory对象时,没有指定环境的话,默认使用哪个环境。
我们可以通过 <environments>
的子标签 <environment>
配置某个具体的环境,<environment>
有个id属性用来表示连接数据库的环境的唯一标识,不能重复。一般,一个环境enbiromint对应一个数据库,一个数据库对应一个SqlSessionFactory对象
①数据库的准备
CREATE DATABASE IF NOT EXISTS db_template;
USE db_template;
CREATE TABLE IF NOT EXISTS t_user(
id INT PRIMARY KEY AUTO_INCREMENT,
username VARCHAR(20),
password VARCHAR(20),
age INT,
sex CHAR,
email VARCHAR(30)
);
②配置MyBatis核心配置文件
在 MyBatis 和核心配置文件 mybatis-config.xml 中的 <environment>
标签中添加如下信息:
<!-- 这是MyBatis的另一个环境,连接的数据库是db_template -->
<environment id="template">
<transactionManager type="JDBC"/>
<dataSource type="POOLED">
<property name="driver" value="com.mysql.cj.jdbc.Driver"/>
<property name="url" value="jdbc:mysql://localhost:3306/db_template"/>
<property name="username" value="root"/>
<property name="password" value="27185.Sakura"/>
</dataSource>
</environment>
③配置Mapper映射文件
在 UserMapper.xml 配置文件中添加如下内容:
<insert id="insertUser">
insert into t_user(id,username,password,age,sex,email)
values (#{id},#{username},#{password},#{age},#{sex},#{email})
</insert>
④测试程序:
package star.light.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;
import star.light.pojo.User;
import java.io.IOException;
public class MyBatisTest {
@Test
public void testEnvironment() throws IOException {
// 获取SqlSessionFactory对象(采用默认的方式获取)
SqlSessionFactoryBuilder sqlSessionFactoryBuilder = new SqlSessionFactoryBuilder();
// 这种方式获取的默认环境
SqlSessionFactory sqlSessionFactory = sqlSessionFactoryBuilder.build(Resources.getResourceAsStream("mybatis-config.xml"));
SqlSession sqlSession = sqlSessionFactory.openSession();
// 执行SQL语句
User user = new User(null,"Sakura","Sakura",10,'女',"[email protected]");
int affectedRowCount = sqlSession.insert("userMapper.insertUser", user);
System.out.println("affectedRowCount = " + affectedRowCount);
sqlSession.commit();
sqlSession.close();
// 这种方式通过环境id来指定的环境
SqlSessionFactory sqlSessionFactory1 = sqlSessionFactoryBuilder.build(Resources.getResourceAsStream("mybatis-config.xml"), "template");
SqlSession sqlSession1 = sqlSessionFactory1.openSession();
User user1 = new User(null,"Mikoto","Mikoto",14,'女',"[email protected]");
int affectedRowCount1 = sqlSession1.insert("userMapper.insertUser", user1);
System.out.println("affectedRowCount1 = " + affectedRowCount1);
sqlSession1.commit();
sqlSession1.close();
}
}
三、MyBatis的事务管理器
<tranasctionManager>
标签用来配置事务管理器,指定 MyBatis 具体使用什么方式去管理事务。它的 type属性 有两个值:JDBC 和 MANAGED;type="JDBC" 表示使用原生的 JDBC 代码来管理事务;type="MANAGED" 表示 MyBatis 不再负责事务的管理,将事务的管理交给其它的 JavaEE容器 来管理,例如,Spring;type属性值不区分大小写,但是不能写其他值,只能是二选一。
在 MyBatis 中提供了一个事务管理器接口,该接口有连个实现类:JdbcTransaction 和 ManagedTransaction;如果 type="JDBC",那么底层会实例化 JdbcTransaction对象;如果 type="MANAGED",那么底层会实例化 ManagedTransaction;
<!--
transactionManager:设置事务管理方式
属性:
type = "JDBC | MANAGED"
JDBC:MyBatis框架自己管理事务,自己采用原生的JDBC代码去管理事务
MANAGED:MyBatis不再负责事务的管理了,事务的管理交给其它容器来负责,例如Spring
-->
<transactionManager type="JDBC"/>
四、MyBatis的数据源
dataSource 被称为数据源,主要是为程序提供 Connection对象。但凡是给程序提供 Connection对象的都可以叫做数据源。数据源实际上是一套规范。JDK 中有这套规范,在 javax.sql.DataSource 下。我们也可以自己编写数据源组件,只要实现 javax.sql.DataSource接口 就行了。例如,你可以自己写一个数据库连接池(数据库连接池是提供连接对象的,所以数据库连接池就是一个数据源)。
<dataSource>
标签有一个属性 type 用来指定数据源的类型,就是指定具体使用什么方式来获取 Connection对象。type属性 有三个值可选:POOLED、UNPOOLED 和 JNDI;type="UNPOOLED" 表示不使用数据库连接技术,每一次请求过来之后,都是创建新的 Connection对象;type="POOLED" 表示使用 MyBatis 自己实现的数据库连接池;type="JDNI" 表示可以集成其它第三方的数据库连接池;JDNI 是一套规范,大部分的 WEB容器 都实现了 JNDI规范;JNDI 是 Java命名目录接口;
- UNPOOLED类型的数据源可以配置以下属性:
- driver:设置数据库连接驱动
- url:设置连接的数据库地址
- username:设置连接数据库的用户名
- password:设置连接数据库的密码
- defaultTransactionIsolationLevel:设置默认的连接事务隔离级别
- defaultNetworkTimeout:等待数据库操作完成的默认网络超时事件
- POOLED类型的数据源,除了可以配置 UNPOOLED类型 数据源的属性之外,还可以配置如下属性:
- poolMaximumActiveConnections:在任意时间可存在的活动(正在使用)的连接数量
- poolMaximumIdleConnections:任意时间可能存在的空闲连接数
- poolMaximumCheckoutTime:在被强制返回之前,池中连接被检出(check out)时间,默认值:20000毫秒
- poolTimeToWait:如果连接花费了相当长的时间,连接池会打印状态日志并重新尝试获取一个连接,默认值:20000毫秒
- poolMaximumLocalBadConnectionTolerance:如果这个线程获取到的是一个坏的连接,那么这个数据源允许这个线程尝试重新获取一个新的连接,但是这个重新尝试的次数不应该超过 poolMaximumIdleConnection 与 poolMaximumLocalBadConnectionTolerance 之和
- poolPingQuery:发送到数据库的侦测查询,用来检验连接是否正常工作并准备接收请求。默认是 NO PING QUERY SET
- poolPingEnable:是否启动侦测查询。若开启,需要设置 poolPingQuery 属性为一个可执行 SQL语句。默认是 false
- poolPingConnectionsNotUseFor:配置 poolPingQuery 的频率,默认值是 0
- JNDI类型的数据源的实现是为了能在WEB容器中使用,
- initial_context:用来在 InitialContext 中寻找上下文。这是一个可选项,如果忽略,那么将会直接从 InitalContext 中查找 data_source属性
- data_source:这是引用数据源实例位置的上下文
正常情况下,使用连接池的话,池中有很多参数需要设置的。如果参数设置的好,可以让连接池的性能发挥的更好。具体连接池中参数的配置需要反复的根据当前业务情况进行测试。
<!--
dataSource:配置数据源
属性:
type = "POOLED | UNPOOLED | JNDI",设置数据源的类型
POOLED:表示使用MyBatis自己实现的数据库连接池
UNPOOLED:表示不使用数据库连接池
JNDI:表示使用第三方数据库连接池
-->
<dataSource type="POOLED">
<!-- 设置连接数据库的驱动 -->
<property name="driver" value="com.mysql.cj.jdbc.Driver"/>
<!-- 设置连接数据库的地址 -->
<property name="url" value="jdbc:mysql://localhost:3306/db_test"/>
<!-- 设置连接数据库的用户名 -->
<property name="username" value="root"/>
<!-- 设置连接数据库的密码 -->
<property name="password" value="27185.Sakura"/>
<!-- 设置连接池当中最多的正在使用的连接对象的上限,最多有多个个连接可以活动,默认值为10 -->
<property name="poolMaximumActiveConnections" value="15"/>
<!-- 设置超时时间,强行让某个连接空闲,默认值为20秒 -->
<property name="poolMaximumCheckoutTime" value="10000"/>
<!-- 设置打印日志的间隔时间,并且尝试获取连接对象,默认值为20秒 -->
<property name="poolTimeToWait" value="1000"/>
<!-- 最多空闲的数量 -->
<property name="poolMaximumIdleConnections" value="5"/>
</dataSource>
在测试程序中添加如下测试信息:
@Test
public void testDataSource() throws IOException {
SqlSessionFactoryBuilder sqlSessionFactoryBuilder = new SqlSessionFactoryBuilder();
SqlSessionFactory sqlSessionFactory = sqlSessionFactoryBuilder.build(Resources.getResourceAsStream("mybatis-config.xml"));
User user = new User(null,"Sakura","Sakura",10,'女',"[email protected]");
for (int i = 0; i < 20; i++) {
SqlSession sqlSession = sqlSessionFactory.openSession();
int affectedRowCount = sqlSession.insert("userMapper.insertUser", user);;
System.out.println("affectedRowCount = " + affectedRowCount);
sqlSession.commit();
}
}
五、properties标签的配置和使用
在 <properties>
标签中可以配置很多属性;
<!--
properties标签中可以配置很多属性
-->
<properties>
<!-- <property name="属性名" value="属性值"/> -->
<property name="jdbc.driver" value="com.mysql.cj.jdbc.Driver"/>
<property name="jdbc.url" value="jdbc:mysql://localhost:3306/db_test"/>
<property name="jdbc.username" value="com.mysql.cj.jdbc.root"/>
<property name="jdbc.password" value="abc123"/>
</properties>
也可以通过 <properties>
标签的 resouce属性 或者 url属性 来引入外部配置文件
<!--
properties可以通过resource属性或者url属性引入配置文件
resource属性:从类的根路径下加载资源
url属性:从绝对路径加载资源,file:///路径
-->
<properties resource="jdbc.properties"></properties>
jdbc.properties 配置文件内容如下:
jdbc.driver=com.mysql.cj.jdbc.Driver
jdbc.url=jdbc:mysql://localhost:3306/db_test
jdbc.username=root
jdbc.password=abc123
此时,MyBatis 的核心配置文件中关于数据源的配置可以改为形式:
<!--
dataSource:配置数据源
属性:
type = "POOLED|UNPOOLED|JNDI",设置数据源的类型
POOLED:表示使用数据库连接池缓存数据库连接
UNPOOLED:表示不使用数据库连接池
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}"/>
<!-- 设置连接池当中最多的正在使用的连接对象的上限,最多有多个个连接可以活动,默认值为10 -->
<property name="poolMaximumActiveConnections" value="15"/>
<!-- 设置超时时间,强行让某个连接空闲,默认值为20秒 -->
<property name="poolMaximumCheckoutTime" value="10000"/>
<!-- 设置打印日志的间隔时间,并且尝试获取连接对象,默认值为20秒 -->
<property name="poolTimeToWait" value="1000"/>
<!-- 最多空闲的数量 -->
<property name="poolMaximumIdleConnections" value="5"/>
</dataSource>
标签:username,03,配置文件,数据源,id,MyBatis,password,public
From: https://www.cnblogs.com/nanoha/p/16753655.html