MyBatis连接数据库的完整流程与配置详解
MyBatis作为一款优秀的持久层框架,通过简化JDBC操作提升了开发效率,其核心优势在于将SQL语句与Java代码分离,同时支持灵活的参数映射与结果集处理,本文将从依赖引入、环境配置、数据源设置、Mapper映射等维度,系统讲解MyBatis连接数据库的实现步骤。
基础依赖与环境准备
使用MyBatis前需先添加对应依赖,以Maven项目为例,在pom.xml
中引入以下坐标(以MySQL驱动为例):
<dependencies> <!-- MyBatis核心库 --> <dependency> <groupId>org.mybatis</groupId> <artifactId>mybatis</artifactId> <version>3.5.10</version> </dependency> <!-- MySQL驱动 --> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <version>8.0.28</version> </dependency> <!-- 日志框架(可选,用于输出SQL日志) --> <dependency> <groupId>log4j</groupId> <artifactId>log4j</artifactId> <version>1.2.17</version> </dependency> </dependencies>
若使用Spring Boot整合,可借助mybatis-spring-boot-starter
简化配置,但核心原理一致。
配置文件编写
MyBatis的核心配置文件为mybatis-config.xml
,需定义数据源、事务管理器及Mapper扫描路径等信息,示例如下:
<?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> <!-- 环境配置,可配置多个环境(如dev/test/prod),默认使用id="development"的环境 --> <environments default="development"> <environment id="development"> <!-- 事务管理器类型:JDBC(直接使用JDBC提交/回滚)或MANAGED(交由容器管理,如Spring) --> <transactionManager type="JDBC"/> <!-- 数据源配置:POOLED表示使用连接池;UNPOOLED为非连接池;JNDI则从应用服务器获取数据源 --> <dataSource type="POOLED"> <property name="driver" value="com.mysql.cj.jdbc.Driver"/> <property name="url" value="jdbc:mysql://localhost:3306/testdb?useSSL=false&serverTimezone=UTC"/> <property name="username" value="root"/> <property name="password" value="123456"/> </dataSource> </environment> </environments> <!-- Mapper映射文件路径,支持通配符扫描(如resources/mapper/*.xml) --> <mappers> <mapper resource="mapper/UserMapper.xml"/> </mappers> </configuration>
数据源与连接池机制
MyBatis本身不提供连接池实现,而是通过集成第三方连接池(如HikariCP、Druid)提升性能,上述示例中使用POOLED
类型时,实际是MyBatis内置的简单连接池;生产环境中更推荐使用高性能连接池,配置方式如下(以HikariCP为例):
- 添加HikariCP依赖:
<dependency> <groupId>com.zaxxer</groupId> <artifactId>HikariCP</artifactId> <version>5.0.1</version> </dependency>
- 在
mybatis-config.xml
中替换数据源类型:<dataSource type="com.zaxxer.hikari.HikariDataSource"> <property name="driverClassName" value="com.mysql.cj.jdbc.Driver"/> <property name="jdbcUrl" value="jdbc:mysql://localhost:3306/testdb?useSSL=false&serverTimezone=UTC"/> <property name="username" value="root"/> <property name="password" value="123456"/> <!-- 连接池特有属性(可选) --> <property name="maximumPoolSize" value="20"/> <property name="connectionTimeout" value="30000"/> </dataSource>
Mapper接口与XML映射文件
MyBatis通过Mapper接口+XML映射文件的方式实现SQL与Java代码解耦,以用户表(user
)操作为例:
- 定义Mapper接口(
UserMapper.java
):public interface UserMapper { // 根据ID查询用户 User selectUserById(Long id); // 插入新用户 int insertUser(User user); }
- 编写对应的XML映射文件(
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.example.mapper.UserMapper"> <!-- 结果集映射(可选,若字段名与实体类属性名不一致需配置) --> <resultMap id="userResultMap" type="User"> <id column="id" property="id"/> <result column="name" property="name"/> <result column="age" property="age"/> </resultMap> <!-- SQL语句定义 --> <select id="selectUserById" parameterType="Long" resultMap="userResultMap"> SELECT * FROM user WHERE id = #{id} </select> <insert id="insertUser" parameterType="User"> INSERT INTO user (name, age) VALUES (#{name}, #{age}) </insert> </mapper>
会话工厂与SqlSession的使用
通过SqlSessionFactoryBuilder
加载配置文件生成SqlSessionFactory
,再由工厂创建SqlSession
实例执行SQL操作:
// 1. 加载配置文件,构建SqlSessionFactory String resource = "mybatis-config.xml"; InputStream inputStream = Resources.getResourceAsStream(resource); SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream); // 2. 获取SqlSession(autoCommit设为false开启手动事务控制) try (SqlSession session = sqlSessionFactory.openSession(false)) { // 3. 通过Mapper接口获取代理对象 UserMapper mapper = session.getMapper(UserMapper.class); // 4. 执行SQL操作 User user = mapper.selectUserById(1L); System.out.println(user.getName()); // 若涉及增删改,需手动提交事务(除非openSession(true)开启自动提交) session.commit(); } catch (Exception e) { e.printStackTrace(); }
常见问题排查
问题现象 | 可能原因 | 解决方案 |
---|---|---|
无法连接数据库 | 驱动类未正确加载 | 检查pom.xml 依赖是否完整 |
URL/账号密码错误 | 确认数据库地址、端口及凭据 | |
数据库服务未启动 | 启动MySQL服务 | |
执行SQL时报“未知列” | XML中SQL字段名与数据库表结构不符 | 校验表结构与SQL语句字段名一致性 |
ResultMap映射配置错误 | 检查resultMap 的column 与property | |
连接池耗尽 | 最大连接数设置过小 | 增大连接池maximumPoolSize |
未及时释放连接 | 确保SqlSession及时关闭(用try-with-resources) |
相关问答FAQs
Q1:MyBatis连接数据库时,如何动态切换数据源?
A:可通过多环境配置结合Spring AOP切面实现,在mybatis-config.xml
中定义多个<environment>
节点,每个环境对应不同数据源;运行时根据业务场景(如请求头标识)选择对应环境的SqlSessionFactory
,或使用Spring的AbstractRoutingDataSource
动态路由数据源。
Q2:为什么MyBatis推荐使用Mapper接口而非直接调用SqlSession?
A:Mapper接口本质是动态代理模式,相比直接操作SqlSession有以下优势:
- 解耦性:避免硬编码SQL ID,降低维护成本;
- 类型安全:编译期检查方法签名,减少运行时错误;
- 扩展性:便于结合Spring等框架进行事务管理、缓存配置等增强操作。
通过以上步骤,即可完成MyBatis对数据库的连接与基本操作,实际项目中还需关注事务管理、性能优化(如二级缓存、批量操作)等进阶主题,以充分发挥框架能力。
【版权声明】:本站所有内容均来自网络,若无意侵犯到您的权利,请及时与我们联系将尽快删除相关内容!
发表回复