在后端开发中,Java 操作数据库是核心技能。本文将详细介绍 JDBC、MyBatis 及 SpringBoot 配置文件相关知识,并给出实用代码示例。
一、JDBC(Java DataBase Connectivity)
(一)简介
JDBC 是 sun 公司定义的操作关系型数据库的 API 规范。它如同一个标准接口,各数据库厂商实现此接口并提供驱动 jar 包。例如,我们在使用 MySQL 数据库时,需引入mysql-connector-j
依赖。在代码中,通过Class.forName("com.mysql.cj.jdbc.Driver");
注册驱动(在较新版本的 JDBC 中,这一步骤可省略),然后利用DriverManager.getConnection(url, user, password);
获取数据库连接,其中url
是数据库连接地址,如jdbc:mysql://localhost:3036/web
,user
和password
分别是数据库用户名和密码。
(二)查询数据
假设我们有user
表,包含id
、username
、password
等字段,现要查询username
为daqiao
且password
为123456
的用户信息。首先创建 maven 项目并引入相关依赖,同时准备好User
实体类。代码如下:
java
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
public class JdbcQueryExample {
public static void main(String[] args) throws Exception {
// 注册驱动(可省略)
Class.forName("com.mysql.cj.jdbc.Driver");
// 获取连接
String url = "jdbc:mysql://localhost:3306/web01?serverTimezone=UTC";
String user = "root";
String password = "1234";
Connection conn = DriverManager.getConnection(url, user, password);
// 获取Statement
Statement stmt = conn.createStatement();
// 执行SQL查询
ResultSet resultSet = stmt.executeQuery("SELECT * FROM user WHERE username = 'daqiao' AND password = '123456'");
// 处理结果
while (resultSet.next()) {
int id = resultSet.getInt("id");
String username = resultSet.getString("username");
String password = resultSet.getString("password");
// 可继续获取其他字段信息
System.out.println("id: " + id + ", username: " + username + ", password: " + password);
}
// 释放资源
resultSet.close();
stmt.close();
conn.close();
}
}
这里使用Statement
执行 SQL 语句,通过ResultSet
的next()
方法逐行获取数据,并根据列名或编号获取具体字段值。
(三)增删改数据
以更新用户密码为例,将id
为1
的用户密码更新为1234567890
。代码如下:
java
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.sql.Statement;
public class JdbcUpdateExample {
public static void main(String[] args) throws Exception {
// 准备工作
Class.forName("com.mysql.cj.jdbc.Driver");
String url = "jdbc:mysql://localhost:3306/web";
Connection connection = DriverManager.getConnection(url, "root", "root@1234");
Statement statement = connection.createStatement();
// 执行SQL更新
int rowsAffected = statement.executeUpdate("update user set password = '1234567890' where id = 1");
System.out.println("受影响行数: " + rowsAffected);
// 释放资源
statement.close();
connection.close();
}
}
执行DML
语句(如INSERT
、UPDATE
、DELETE
)时,使用executeUpdate()
方法,它返回受影响的行数。
(四)预编译 SQL
预编译 SQL 能防止 SQL 注入且性能更高。例如查询username
和password
动态变化的用户信息:
java
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
public class JdbcPreparedStatementExample {
public static void main(String[] args) throws Exception {
// 获取连接
Connection conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/web", "root", "1234");
// 预编译SQL
PreparedStatement pstmt = conn.prepareStatement("SELECT * FROM user WHERE username =? AND password =?");
pstmt.setString(1, "linchong");
pstmt.setString(2, "123456");
// 执行查询
ResultSet resultSet = pstmt.executeQuery();
// 处理结果
while (resultSet.next()) {
int id = resultSet.getInt("id");
String username = resultSet.getString("username");
// 输出字段值
System.out.println("id: " + id + ", username: " + username);
}
// 释放资源
resultSet.close();
pstmt.close();
conn.close();
}
}
这里使用PreparedStatement
,通过setString()
等方法设置参数,避免了 SQL 注入风险,且在多次执行类似 SQL 语句时,数据库可缓存编译后的语句,提高性能。
二、MyBatis
(一)简介
MyBatis 是优秀的持久层框架,简化了 JDBC 开发。它起源于 Apache 的 iBatis 项目,历经迁移和发展。其官网为https://mybatis.org/mybatis-3/zh_CN/index.html
。
(二)入门程序
以查询所有用户数据为例,首先创建 SpringBoot 工程并引入 MyBatis 相关依赖,准备user
表和User
实体类,在application.properties
中配置数据库连接信息,如:
java
spring.datasource.url=jdbc:mysql://localhost:3306/web
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
spring.datasource.username=root
spring.datasource.password=1234
然后编写 MyBatis 的持久层接口UserMapper
:
java
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Select;
import java.util.List;
@Mapper
public interface UserMapper {
@Select("select * from user")
public List<User> findAll();
}
在测试类中(需添加@SpringBootTest
注解),可通过@Autowired
注入UserMapper
并调用findAll()
方法获取用户数据。
(三)JDBC 与 MyBatis 对比
JDBC 代码存在硬编码、繁琐、资源浪费和性能降低等问题。例如查询用户数据时,需手动创建连接、处理结果集和释放资源。而 MyBatis 通过简单的接口定义和配置,大大简化了操作,提高了开发效率。
(四)数据库连接池
数据库连接池负责管理数据库连接,如 Druid(阿里巴巴开源)、C3P0、DBCP、Hikari(SpringBoot 默认)等。以 Druid 为例,引入druid-spring-boot-starter
依赖,并在application.properties
中配置:
java
spring.datasource.type=com.alibaba.druid.pool.DruidDataSource
spring.datasource.url=jdbc:mysql://localhost:3306/web
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
spring.datasource.username=root
spring.datasource.password=1234
连接池可重用连接、提升系统响应速度并避免连接遗漏。
(五)增删改查操作
- 删除用户:
java
import org.apache.ibatis.annotations.Delete;
@Mapper
public interface UserMapper {
@Delete("delete from user where id = #{id}")
public void deleteById(Integer id);
}
- 添加用户:
java
import org.apache.ibatis.annotations.Insert;
@Mapper
public interface UserMapper {
@Insert("insert into user(username,password,name,age) values(#{username},#{password},#{name},#{age})")
public void insert(User user);
}
- 更新用户:
java
import org.apache.ibatis.annotations.Update;
@Mapper
public interface UserMapper {
@Update("update user set username=#{username}, password=#{password}, name=#{name}, age=#{age} where id=#{id}")
public void update(User user);
}
- 查询用户:
java
import org.apache.ibatis.annotations.Param;
import org.apache.ibatis.annotations.Select;
@Mapper
public interface UserMapper {
@Select("select * from user where username=#{username} and password=#{password}")
public User findByUsernameAndPassword(@Param("username") String uname, @Param("password") String pwd);
}
在 MyBatis 中,#{}
是占位符,会生成预编译 SQL,安全且性能高;${}
是拼接符,存在 SQL 注入风险,常用于表名、字段名动态设置。
(六)XML 映射配置
MyBatis 支持 XML 配置 SQL 语句,规则如下:
- XML 映射文件与 Mapper 接口同包同名。
- XML 文件的
namespace
属性为 Mapper 接口全限定名。 - XML 文件中
sql
语句的id
与 Mapper 接口方法名一致且返回类型一致。例如:
XML
<mapper namespace="com.itheima.mapper.UserMapper">
<select id="findAll" resultType="com.itheima.pojo.User">
select id, username, password, name, age from user
</select>
</mapper>
一般简单增删改查可用注解,复杂 SQL 功能建议用 XML 配置。
三、SpringBoot 配置文件
SpringBoot 支持application.properties
、application.yaml
、application.yml
配置文件。application.properties
格式较为臃肿、层级结构不清晰。application.yaml
和application.yml
简洁且以数据为中心,使用缩进表示层级关系,数值前需空格,注释用#
。例如:
java
spring:
datasource:
driver-class-name: com.mysql.jdbc.Driver
url: jdbc:mysql://localhost:3306/web01
username: root
password: 1234
mybatis:
configuration:
log-impl: org.apache.ibatis.logging.stdout.StdOutImpl
在yml
文件中,若配置项值以0
开头,需用''
引起来,防止被解析为八进制。
通过对以上 Java 操作数据库技术的学习和实践,我们能更好地应对后端开发中的数据持久化需求,提升开发效率和应用性能。在实际项目中,可根据具体场景灵活选择 JDBC、MyBatis 及合适的配置方式,构建稳定可靠的后端系统。