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

news/2025/1/6 5:47:21/

在后端开发中,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);// 获取StatementStatement 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");// 预编译SQLPreparedStatement 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 接口方法名一致且返回类型一致。例如:
<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.Driverurl: jdbc:mysql://localhost:3306/web01username: rootpassword: 1234mybatis:configuration:log-impl: org.apache.ibatis.logging.stdout.StdOutImpl

yml文件中,若配置项值以0开头,需用''引起来,防止被解析为八进制。

通过对以上 Java 操作数据库技术的学习和实践,我们能更好地应对后端开发中的数据持久化需求,提升开发效率和应用性能。在实际项目中,可根据具体场景灵活选择 JDBC、MyBatis 及合适的配置方式,构建稳定可靠的后端系统。


http://www.ppmy.cn/news/1560651.html

相关文章

vscode实用插件(持续更新)

目录 Git History Diff Git Graph Error Lens Git History Diff 用于将当前分支的某个文件夹与远程分支的相同文件夹做对比&#xff0c;方便代码评审&#xff01;解决了为了一个问题而多次commit&#xff0c;导致代码不好评审&#xff0c;即不晓得和远程分支相比&#xff0…

【单片机】NPN+PNP组成的高边开关无法完全关断

项目场景&#xff1a; 采用NPNPNP组成高边开关&#xff0c;由单片机GPIO控制。 问题描述 原理图如下。发现CPS_ENABLE为低电平时&#xff0c;3.3V_C的电平不为0&#xff0c;约为0.9V。 原因分析与解决方案&#xff1a; 从原理上分析和独立电路测试没有问题&#xff0c;那么…

【运维专题】大数据面试笔试宝典之大数据运维面试(一)

持续分享有用、有价值、精选的优质大数据面试题 致力于打造全网最全的大数据面试专题题库 1、集群线上扩容如何达到自动化?线上扩容,规模正常都以 10+以上,如果都以课堂所示,人肉操作,时间投入与产出比不匹配,人力造成很大的不必要浪费,想学习老师线上集群实际扩容的方…

【网络协议】路由信息协议 (RIP)

未经许可&#xff0c;不得转载。 路由信息协议&#xff08;Routing Information Protocol&#xff0c;简称 RIP&#xff09;是一种使用跳数&#xff08;hop count&#xff09;作为路由度量标准的路由协议&#xff0c;用于确定源网络和目标网络之间的最佳路径。 文章目录 什么是…

leetcode:面试题 17.01. 不用加号的加法(python3解法)

难度&#xff1a;简单 设计一个函数把两个数字相加。不得使用 或者其他算术运算符。 示例: 输入: a 1, b 1 输出: 2 提示&#xff1a; a, b 均可能是负数或 0结果不会溢出 32 位整数 题解&#xff1a; class Solution:def add(self, a: int, b: int) -> int:sum_list [a…

vue cli更新遇到的问题(vue -V查询版本号不变的问题)

1.镜像地址选择 npm会去默认的registry远程仓库中下载指定内容 该过程可能十分缓慢 因此我们可以切换默认仓库为镜像地址 npm config set registry https://registry.npmmirror.com 通过该指令可以从最新的镜像地址下载指定内容(镜像地址可能会有变 有变请重新查询) 2.下载 …

条款51:编写 new 和 delete 时需固守常规( Adhere to convention when writing new and delete)

条款51&#xff1a;编写 new 和 delete 时需固守常规 1.1 new C要求new运算符即使在请求0字节时也返回一个合法的指针。 void* operator new(std::size_t size) { // 你的new操作符可能需要额外的参数using namespace std; if (size 0) { // 处理0字节请求&#xff0c;siz…

小程序租赁系统开发的优势与应用探索

内容概要 在如今这个数码科技飞速发展的时代&#xff0c;小程序租赁系统开发仿佛是一张神奇的魔法卡&#xff0c;能让租赁体验变得顺畅如丝。想象一下&#xff0c;无论你需要租用什么&#xff0c;从单车到房屋&#xff0c;甚至是派对用品&#xff0c;只需动动手指&#xff0c;…