【学习总结|DAY027】JAVA操作数据库

在后端开发中,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/webuserpassword分别是数据库用户名和密码。

(二)查询数据

假设我们有user表,包含idusernamepassword等字段,现要查询usernamedaqiaopassword123456的用户信息。首先创建 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 语句,通过ResultSetnext()方法逐行获取数据,并根据列名或编号获取具体字段值。

(三)增删改数据

以更新用户密码为例,将id1的用户密码更新为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语句(如INSERTUPDATEDELETE)时,使用executeUpdate()方法,它返回受影响的行数。

(四)预编译 SQL

预编译 SQL 能防止 SQL 注入且性能更高。例如查询usernamepassword动态变化的用户信息:

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.propertiesapplication.yamlapplication.yml配置文件。application.properties格式较为臃肿、层级结构不清晰。application.yamlapplication.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 及合适的配置方式,构建稳定可靠的后端系统。

相关推荐
小吴编程之路5 小时前
MySQL 索引核心特性深度解析:从底层原理到实操应用
数据库·mysql
炽烈小老头5 小时前
【每天学习一点算法 2026/03/08】相交链表
学习·算法·链表
~莫子5 小时前
MySQL集群技术
数据库·mysql
HalvmånEver5 小时前
7.高并发内存池大页内存申请释放以及使用定长内存池脱离new
java·spring boot·spring
凤山老林5 小时前
SpringBoot 使用 H2 文本数据库构建轻量级应用
java·数据库·spring boot·后端
就不掉头发5 小时前
Linux与数据库进阶
数据库
与衫5 小时前
Gudu SQL Omni 技术深度解析
数据库·sql
咖啡の猫6 小时前
Redis桌面客户端
数据库·redis·缓存
oradh6 小时前
Oracle 11g数据库软件和数据库静默安装
数据库·oracle
赶路人儿6 小时前
UTC时间和时间戳介绍
java·开发语言