使用mybatis查询数据库是涉及到中文的时候查询不到结果(如下图所示),但是在数据库中能够查询到(用的是mysql)。

本文详细介绍了如何正确配置MySQL数据库连接属性,包括使用特定的驱动、URL、用户名及密码,重点强调了如何设置UTF-8字符编码以确保数据正确读取与存储,避免乱码问题。

 <property name="driver" value="com.mysql.jdbc.Driver"/>
        <property name="url" value="jdbc:mysql://localhost:3306/ssm_mybatis?useUnicode=true&amp;characterEncoding=utf-8"/>
        <property name="username" value="***"/>
        <property name="password" value="***"/>

 

 

加上这句话:?useUnicode=true&amp;characterEncoding=utf-8

<think>我们正在处理一个关于Spring Boot应用中Druid连接池、MyBatisMySQL协同工作的问题。用户想知道从调用Mapper的select方法开始,到返回结果,整个过程中各个组件是如何协作的。我们将结合引用内容,详细描述这一流程。 步骤分解: 1. 应用启动阶段:Spring Boot自动配置数据源和MyBatis 2. 执行SQL阶段:调用Mapper方法时,MyBatis通过SqlSession执行SQL 3. 连接池管理:Druid提供连接,并监控连接状态 4. 数据库交互:MySQL执行查询并返回结果 5. 结果映射:MyBatis结果集映射为Java对象 6. 资源释放:连接归还给连接池 详细流程: 1. **应用启动阶段**: - Spring Boot根据配置文件(如application.yml)自动配置数据源。当引入了Druid依赖并配置了相应的数据源类型时,Spring Boot会创建DruidDataSource实例[^5]。 - 同时,Spring Boot会配置MyBatis,包括SqlSessionFactoryBean,该工厂Bean会使用配置的数据源(DruidDataSource)来创建SqlSessionFactory[^3]。 - 在初始化过程中,Druid连接池会根据配置初始化一定数量的数据库连接,并维护在连接池中[^1][^2]。 2. **调用Mapper的select方法**: - 当调用Mapper接口的select方法时(例如`userMapper.selectById(1)`),MyBatis会通过动态代理机制,将方法调用转换为实际的SQL执行[^3]。 - MyBatis会创建一个SqlSession对象(通常使用SqlSessionTemplate,它是线程安全的),然后通过SqlSession获取Mapper接口的代理对象[^3]。 3. **获取数据库连接**: - SqlSession在执行SQL之前,会从Druid连接池中获取一个数据库连接(Connection对象)[^1][^3]。 - Druid连接池会从池中取出一个可用的连接(如果当前没有空闲连接且未达到最大连接数,则会创建新连接)[^1][^2]。 4. **执行SQL语句**: - MyBatis通过获取到的Connection对象创建PreparedStatement(或Statement),并设置参数(如果有)[^4]。 - 然后执行SQL查询(如`executeQuery`),将SQL语句发送到MySQL数据库[^4]。 5. **数据库处理并返回结果**: - MySQL服务器接收到查询请求后,执行查询并生成结果集(ResultSet)[^4]。 - 结果集通过JDBC驱动返回给应用程序。 6. **结果集映射**: - MyBatis通过配置的ResultMap(或自动映射)将ResultSet中的每一行数据转换为Java对象(如User对象)[^3]。 - 映射完成后,结果集被关闭,PreparedStatement也被关闭,但连接不会关闭,而是归还给连接池[^1][^3]。 7. **资源释放**: - MyBatis将连接归还给Druid连接池,Druid会将该连接标记为空闲,供后续使用[^1][^2]。 - Druid连接池会监控连接的状态,包括连接的有效性(通过心跳检测)和空闲时间(超时回收)[^1][^2]。 8. **监控与统计(Druid特有)**: - Druid提供了监控功能,在整个过程中,它会统计SQL执行时间、连接获取时间、执行查询的次数等,这些信息可以通过Druid提供的监控界面查看[^2][^5]。 整个流程的协作关系如下所示(文字描述): ``` 应用程序 -> MyBatis Mapper接口 -> SqlSession -> 从Druid连接池获取Connection -> 通过Connection执行SQL -> MySQL数据库 返回结果集 -> MyBatis结果映射 -> 转换为Java对象 -> 释放连接(归还给连接池) -> 返回结果给应用程序 ``` 注意事项: - Druid连接池通过预先创建连接和复用连接,避免了频繁创建和销毁连接的开销,提高了性能[^1][^2]。 - MyBatis负责SQL的生成、参数设置和结果映射,简化了JDBC操作[^3][^4]。 - 在整个过程中,连接池、ORM框架和数据库各司其职,协同完成数据查询任务。 通过以上步骤,我们可以清晰地理解Spring Boot应用中Druid连接池、MyBatisMySQL数据库是如何协同工作的。 相关问题: 1. 如何配置Druid连接池的监控功能? 2. MyBatis结果映射有哪些方式? 3. 在Spring Boot中如何配置多数据源并使用Druid连接池? 4. Druid连接池的空闲连接回收机制是如何工作的?</think>### Spring Boot应用中Druid连接池、MyBatisMySQL的协作流程 当调用Mapper的`select`方法时,系统各组件协同工作流程如下(以查询用户数据为例): ```mermaid sequenceDiagram participant App as 应用程序 participant MyBatis as MyBatis框架 participant Druid as Druid连接池 participant MySQL as MySQL数据库 App->>MyBatis: 调用userMapper.selectById(1) MyBatis->>Druid: 请求数据库连接 Druid-->>MyBatis: 分配空闲连接(Connection) MyBatis->>MySQL: 发送SQL查询(SELECT * FROM users WHERE id=1) MySQL-->>MyBatis: 返回ResultSet结果MyBatis->>MyBatis: 结果集映射为User对象 MyBatis->>Druid: 归还数据库连接 MyBatis-->>App: 返回User对象 ``` #### 详细步骤解析: 1. **连接获取阶段** - 应用程序调用`userMapper.selectById(1)`方法时,MyBatis通过动态代理机制拦截方法调用[^3] - MyBatis向Druid连接池请求数据库连接: ```java // Druid内部实现伪代码 public Connection getConnection() { if (空闲连接存在) { return 校验通过的连接; // 连接复用 } else if (当前连接数 < maxActive) { return DriverManager.getConnection(url); // 新建连接 } else { throw new SQLException("连接池耗尽"); // 流量控制 } } ``` - Druid通过**连接复用机制**避免频繁创建连接(默认初始连接数5-10个)[^1][^2] 2. **SQL执行阶段** - MyBatis通过`SqlSession`创建`PreparedStatement`,设置参数并执行SQL[^3][^4] - 底层JDBC操作: ```java PreparedStatement ps = conn.prepareStatement("SELECT * FROM users WHERE id=?"); ps.setInt(1, 1); // 参数绑定 ResultSet rs = ps.executeQuery(); // 查询执行 ``` 3. **结果集处理阶段** - MySQL返回`ResultSet`后,MyBatis执行**ORM映射**: ```xml <!-- mapper.xml 映射配置 --> <resultMap id="userMap" type="User"> <id property="id" column="id"/> <result property="name" column="name"/> </resultMap> ``` - MyBatis遍历`ResultSet`,根据映射规则创建Java对象(此处生成`User`实例) 4. **资源回收阶段** - 结果集处理完成后,MyBatis调用`connection.close()`**并非真实关闭连接** - Druid拦截关闭请求,将连接标记为空闲状态返回连接池[^1] - Druid通过**心跳检测机制**维护连接有效性(默认每1分钟执行`SELECT 1`)[^2] 5. **监控与统计(Druid特有)** - 整个过程中Druid记录关键指标: - SQL执行时间 - 连接等待时间 - 结果集行数 - 执行错误计数 - 这些数据可通过`/druid/sql.html`监控页面查看[^2][^5] #### 关键协作机制: 1. **连接生命周期管理** Druid通过`timeBetweenEvictionRunsMillis`(默认60s)定期检测: - 销毁空闲超时连接(`minEvictableIdleTimeMillis`控制) - 补充新连接维持最小空闲数(`minIdle`控制)[^1][^2] 2. **异常处理机制** - 当MySQL通信超时(如`SocketTimeoutException`),Druid会: 1. 标记该连接为无效 2. 触发重试机制(若配置`testWhileIdle=true`) 3. 从池中移除并创建新连接替代[^2] 3. **性能优化特性** - **PS Cache**:Druid缓存`PreparedStatement`减少解析开销 - **连接预热**:启动时预先创建`minIdle`数量的连接 - **监控拦截**:通过`filters`统计SQL性能[^5] > **关键配置示例**(application.yml): > ```yaml > spring: > datasource: > druid: > url: jdbc:mysql://localhost:3306/db > initial-size: 5 > min-idle: 5 > max-active: 20 > # 连接有效性检查(单位:毫秒) > validation-query: SELECT 1 > test-while-idle: true > time-between-eviction-runs-millis: 60000 > min-evictable-idle-time-millis: 300000 > # 监控配置 > filters: stat,wall > ``` 这种分层协作架构使系统获得: ✅ **连接复用**(降低90%+连接创建开销) ✅ **故障隔离**(单连接异常不影响整体) ✅ **精准监控**(实时追踪SQL性能瓶颈)[^1][^2] --- ### 相关问题 1. 如何配置Druid连接池的监控统计功能? 2. MyBatis结果集映射有哪些优化技巧? 3. 当出现`ConnectionTimeoutException`时应该如何排查? 4. Druid连接池与HikariCP的性能对比如何?
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值