mybatis怎么连oracle数据库
- 数据库
- 2025-08-03
- 4994
是关于如何使用MyBatis连接Oracle数据库的详细步骤和配置说明:
准备工作
- 获取Oracle JDBC驱动:由于Oracle是商业软件,其JDBC驱动未公开发布在Maven中央仓库中,你需要手动下载
ojdbc8.jar
文件(对应不同版本如8i/11g等),并通过命令将其安装到本地Maven仓库。mvn install:install-file -DgroupId=com.oracle -DartifactId=ojdbc8 -Dversion=8.2.0.2.0 -Dpackaging=jar -Dfile=E:ojdbc8.jar
,之后可在项目的pom.xml
中引入该依赖。 - 添加MyBatis相关依赖:若基于Spring Boot开发,建议使用
mybatis-spring-boot-starter
简化集成过程,在pom.xml
中添加如下内容:<dependency> <groupId>org.mybatis.spring.boot</groupId> <artifactId>mybatis-spring-boot-starter</artifactId> <version>1.3.2</version> </dependency> <dependency> <groupId>com.oracle</groupId> <artifactId>ojdbc6</artifactId> <version>11.2.0.1.0</version> </dependency>
配置数据源与事务管理器
方式1:通过Spring Boot的application.properties文件配置
这是最常见的方式,适合快速搭建项目,关键参数包括:
| 属性名 | 示例值 | 说明 |
|————————–|—————————————-|——————————————————————–|
| spring.datasource.driver-class-name
| oracle.jdbc.driver.OracleDriver
| 指定Oracle专属的JDBC驱动类 |
| spring.datasource.url
| jdbc:oracle:thin:@//host:port/serviceName
| Thin模式连接字符串,支持简写格式(如IP地址、端口号和服务名) |
| spring.datasource.username
| 数据库用户名 | |
| spring.datasource.password
| 数据库密码 | |
| mybatis.mapper-locations
| classpath:/mapper/.xml
| 映射XML文件路径,用于定义SQL语句与实体类的绑定关系 |
| mybatis.type-aliases-package
| com.example.entity
| 自动扫描指定包下的JavaBean作为别名,减少全限定类名书写 |
注意:URL中的thin
协议表示轻量级纯Java实现,无需额外客户端工具;服务名(Service Name)需与Oracle实例的实际配置一致,例如生产环境可能使用类似jdbc:oracle:thin:@192.168.X.X:1521:orcl
的形式。
方式2:原生MyBatis配置文件(mybatis-config.xml)
如果不使用Spring Boot,则需手动创建XML配置文件,核心结构如下:
<configuration> <typeAliases> <typeAlias type="cn.kgc.myoracle.entity.Users" alias="users"/> </typeAliases> <environments default="xym"> <environment id="xym"> <transactionManager type="JDBC"/> <dataSource type="POOLED"> <property name="driver" value="oracle.jdbc.driver.OracleDriver"/> <property name="url" value="jdbc:oracle:thin:@192.168.221.205:1521:orcl"/> <property name="username" value="xym"/> <property name="password" value="xym"/> </dataSource> </environment> </environments> <mappers> <mapper resource="mapper/users.xml"/> </mappers> </configuration>
此文件中定义了类型别名、事务管理器类型(默认为JDBC)、连接池策略(如POOLED)以及具体的数据库连接参数。
编写Mapper接口与XML映射文件
- 创建实体类:确保字段与数据库表结构匹配,推荐使用Lombok插件自动生成getter/setter方法,例如用户表对应的JavaBean:
package com.example.demo.entity; import lombok.Getter; import lombok.Setter; @Getter @Setter public class User { private int id; private String order_id; // 对应数据库列名order_id }
- 定义Mapper接口:声明CRUD操作的方法签名,并添加
@Mapper
注解以便被扫描注册,示例:package com.example.demo.dao; import java.util.List; import org.apache.ibatis.annotations.Mapper; @Mapper public interface UserMapper { List<User> listUser(); // 查询所有用户 User findById(int userid); // 根据ID查找单个用户 void saveUser(User user); // 插入新记录 void delUser(int userid); // 删除指定ID的数据 void updateUser(User user); // 更新现有记录 }
- 编写XML映射文件:以
users.xml
为例,实现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="com.example.demo.dao.UserMapper"> <select id="listUser" resultType="com.example.demo.entity.User"> SELECT FROM t_user; </select> <insert id="saveUser" parameterType="com.example.demo.entity.User"> INSERT INTO t_user(id, order_id) VALUES(#{id}, #{order_id}) </insert> <!-其他增删改查标签类似 --> </mapper>
其中
namespace
必须与Mapper接口全限定名一致,resultType
或parameterType
可引用已注册的类型别名简化书写。
测试连接与调试
- 启动应用后验证日志输出:观察控制台是否打印出正常的SQL执行记录,确认驱动加载成功且网络连通性正常,可通过设置
mybatis.configuration.log-impl=org.apache.ibatis.logging.stdout.StdOutImpl
启用详细日志。 - 执行基础查询:调用
UserMapper.listUser()
方法,检查是否能正确返回数据库中的数据,若出现异常,优先排查以下几点:- 驱动类是否存在于类路径下;
- URL格式是否符合Oracle规范(尤其是服务名是否正确);
- 用户名密码是否有权限访问目标Schema;
- 防火墙是否阻止了指定端口的通信。
高级优化选项
- 驼峰命名转换:配置
mybatis.configuration.map-underscore-to-camel-case=true
,使数据库列如下划线风格的user_name
自动映射到Java对象的驼峰属性userName
。 - 连接池调优:调整HikariCP或其他连接池的最大空闲连接数、超时时间等参数,提升高并发场景下的性能表现。
spring.datasource.max-idle=10 spring.datasource.min-idle=5 spring.datasource.initial-size=5
- 批量操作支持:在Mapper接口中声明集合类型的参数,配合
foreach
动态标签实现批量插入或更新,显著减少网络往返次数。
FAQs
Q1:为什么有时会出现“ORA-01887:不是有效的日期格式”?
A:Oracle对日期类型非常敏感,确保Java实体类中的Date字段格式与数据库端的DATE/TIMESTAMP类型严格对应,建议在SQL中使用TO_DATE函数显式转换字符串输入,INSERT INTO table_name (create_time) VALUES (TO_DATE(#{param}, 'YYYY-MM-DD'))
。
Q2:如何解决“Invalid column name”错误?
A:该错误通常由列名大小写不匹配引起,Oracle默认存储时会将未加引号的标识符转为大写,而MyBatis生成的SQL可能是小写形式,有两种解决方案:①在SQL中使用双引号包裹列名(如”column_name
”)强制保留原始大小写;②修改数据库表结构,统一采用全大写或全