配置文件
示例配置结构如下:
<?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"/>
<settings>
<!-- ... -->
</settings>
<typeAliases>
<!-- ... -->
</typeAliases>
<typeHandlers>
<!-- ... -->
</typeHandlers>
<environments default="development">
<environment id="development">
<transactionManager type="JDBC"/>
<dataSource type="POOLED">
<property name="driver" value="${driver}"/>
<property name="url" value="${url}"/>
<property name="username" value="${username}"/>
<property name="password" value="${password}"/>
</dataSource>
</environment>
<!-- 可能还有其他环境配置 -->
</environments>
<mappers>
<mapper resource="com/example/mapper/UserMapper.xml"/>
<mapper class="com.example.mapper.UserMapper"/>
<!-- ... -->
</mappers>
</configuration>
properties
引用之前,先要新建 db.properties 文件,并编辑好内容
新建 db.properties 文件
username=root
password=zhangroot
url=jdbc:mysql://127.0.0.1:3306/homework
driver=com.mysql.cj.jdbc.Driver
在配置文件中使用:
<!--导入资源文件-->
<properties resource="db.properties">
<!--用作默认值,如果属性文件中获取不到对应属性时,这里才会起作用,优先级低于属性文件夹的-->
<property name="password" value="zhangroot"/>
</properties>
使用属性文件中的配置信息方式${}
<environment id="devA">
<transactionManager type="JDBC"></transactionManager>
<dataSource type="POOLED">
<property name="username" value="${username}"/>
<property name="password" value="${password}"/>
<property name="url" value="${url}"/>
<property name="driver" value="${driver}"/>
</dataSource>
</environment>
transactionManager
在配置文件
事务管理器(transactionManager)
在MyBatis中,事务管理器(Transaction Manager)的类型有两种( type="[JDBC|MANAGED]"):
-
JDBC:
当事务管理器类型设置为JDBC
时,MyBatis会使用Java JDBC API直接管理事务。这意味着它会从数据源获取数据库连接,并利用该连接对象来执行事务的开启、提交或回滚操作。在处理完SQL操作后,MyBatis会根据需要自行关闭连接或返回给连接池。 -
MANAGED:
当配置为MANAGED
时,MyBatis则不会自己管理事务,而是将事务控制权交给外部容器(如Spring框架或者Java EE应用服务器如JBoss、WebLogic等)。这种情况下,容器负责启动、提交或回滚事务。通常在企业级应用程序中,容器提供了全局事务管理的能力,可以跨多个资源进行事务协调。
数据源(dataSource)
dataSource 元素使用标准的 JDBC 数据源接口来配置 JDBC 连接对象的资源。
- 大多数 MyBatis 应用程序会按示例中的例子来配置数据源。虽然数据源配置是可选的,但如果要启用延迟加载特性,就必须配置数据源。
有三种内建的数据源类型(也就是 type="[UNPOOLED|POOLED|JNDI]")
- UNPOOLED(非池化数据源):
- UNPOOLED 类型的数据源每次请求数据库连接时都会创建一个新的连接实例。
- 这种方式简单、轻量级,但不适合高并发场景,因为频繁创建和关闭数据库连接会消耗大量资源,并可能导致性能问题。
- POOLED(池化数据源):
- POOLED 数据源是基于连接池实现的,它会预先创建一定数量的数据库连接并保持空闲状态,当应用程序需要使用数据库时,从池中取出一个连接,用完后归还给池而不是直接关闭。
- 连接池技术可以有效提高系统的性能和稳定性,因为它能够重用已存在的数据库连接,减少创建和销毁连接带来的开销。
- JNDI(Java Naming and Directory Interface,Java命名和目录接口):
- JNDI 数据源并不是 MyBatis 内部实现的连接池,而是通过JNDI查找机制来获取外部容器(如Tomcat、JBoss等应用服务器)管理的数据源。
- 在企业级应用中,通常由应用服务器或容器统一管理数据库连接池,开发人员通过JNDI名称来引用这个已经配置好的数据源。
- 使用 JNDI 数据源的优势在于它可以与容器整合,便于管理和配置,并且有助于应用服务器层面的资源隔离和优化。
properties
例如,对于一个基于 MyBatis 的POOLED 数据源配置,可能会包含以下 <property>
标签:
<dataSource type="POOLED">
<property name="driver" value="com.mysql.jdbc.Driver"/>
<property name="url" value="jdbc:mysql://localhost:3306/mydatabase"/>
<property name="username" value="myuser"/>
<property name="password" value="mypassword"/>
<!-- 其他可能的属性 -->
<property name="poolSize" value="10"/>
<property name="maxIdle" value="8"/>
<property name="minIdle" value="2"/>
</dataSource>
上述配置中,每个 <property>
标签都指定了数据源的一个具体属性,如数据库驱动类名、数据库URL、用户名和密码等。不同的数据源类型(UNPOOLED、POOLED 或 JNDI)可能需要不同的属性配置。如果遇到错误“元素类型为 "dataSource" 的内容必须匹配 "(property)*"”,则意味着 <dataSource>
中的内容结构不正确,应当只包含零个或多个 <property>
子元素。
8. Mapper 接口方式
第一步:定义接口
IEmpDao接口
package com.wdzl.dao;
import com.wdzl.pojo.Emp;
import java.util.List;
/**
* 接口----特殊抽象类--高度抽象类--接口
* 抽象---复杂问题简单化---忽略具体的实现细节
* 接口---定义规范
*
*
*/
public interface IEmpDao {
void save(Emp emp);
void delete(Emp emp);
void update(Emp emp);
Emp get(Integer empno);
List<Emp> queryAll();
}
第二步:编写映射文件
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"https://mybatis.org/dtd/mybatis-3-mapper.dtd">
<!---->
<!--1.要求: 命名空间必须和dao接口保持一致。取值 只能是接口完整类名
因为可以把这里的映射文件理解成 DAO接口的实现类
-->
<mapper namespace="com.wdzl.dao.IEmpDao">
<!--就是IEmpDao 接口中的get方法的实现-->
<select id="get" resultType="emp">
select empno,ename,sal,hiredate from emp where empno=#{empno}
</select>
<select id="queryAll" resultType="emp">
select empno,ename,sal,hiredate from emp
</select>
</mapper>
第三步:编写代码
/**
* Mapper 代理接口方式实现
*/
public class EmpService {
public static void main(String[] args) {
// IEmpDao dao = new EmpDaoImpl();
//SqlSession
SqlSession sqlSession = MyBatisUtil.getSqlSession();
// 动态代理 动态根据接口实现生成对应的实现类的代理对象
IEmpDao dao = sqlSession.getMapper(IEmpDao.class);
Emp emp = dao.get(1);
dao.queryAll().forEach(System.out::println);
System.out.println(emp);
}
}