2025年JDBC复习

JDBC复习一 JDBC 1 概述 JDBC 是一套操作关系型数据库的接口即规则 数据库厂商需要实现这套接口 并且提供数据库驱动 jar 包 我们实际执行的是对应驱动包中的实现类 2 连接数据库 一 注册驱动 二 获取连接 三 执行 CRUD 操作

大家好,我是讯享网,很高兴认识大家。

一.JDBC

1、概述

JDBC是一套操作关系型数据库的接口即规则,数据库厂商需要实现这套接口,并且提供数据库驱动jar包。我们实际执行的是对应驱动包中的实现类

2、连接数据库

(一)注册驱动

(二)获取连接

(三)执行CRUD操作

Statement
//1.创建Statement对象 Statement st=con.createStatement(); String sql="create table test(id int auto_increment,name varchar(20))"; /* 方法介绍: executeUpdate(sql):执行create、insert、update、delete语句 executeQuery(sql):执行select语句,返回ResultSet结果集对象 */ int affects=st.executeUpdate(sql); //返回的是改变的行数 Result rs=st.executeQuery();//查询返回的是结果集 while(rs.next()){ 
   //是否存在下一个元素 int id=rs.getInt("id");//通过列名获取 int id=rs.getInt(1); //通过列号 } 

讯享网
Statement的缺陷:

SQL注入问题:因为SQL语句参数是用户输入的,所以可能会改变SQL语句原本的意义,安全性差。
示例(来自拉勾教育):
在这里插入图片描述
讯享网
如何解决:
使用PreparedStatement可以有效解决上述问题,并且在执行重复操作过多时,效率更高。
PreparedStatement接口的父接口为Statement,两者方法类似

讯享网public class TestLogin02 { 
    / * 使用预编译对象 PrepareStatement 完成登录案例 * @param args * @throws SQLException */ public static void main(String[] args) throws SQLException { 
    //1.获取连接 Connection connection = JDBCUtils.getConnection(); //2.获取Statement Statement statement = connection.createStatement(); //3.获取用户输入的用户名和密码 Scanner sc = new Scanner(System.in); System.out.println("请输入用户名: "); String name = sc.nextLine(); System.out.println("请输入密码: "); String pass = sc.nextLine(); System.out.println(pass); //4.获取 PrepareStatement 预编译对象 //4.1 编写SQL 使用 ? 占位符方式 String sql = "select * from jdbc_user where username = ? and password = ?"; PreparedStatement ps = connection.prepareStatement(sql); //4.2 设置占位符参数 ps.setString(1,name); ps.setString(2,pass); //5. 执行查询 处理结果集 ResultSet resultSet = ps.executeQuery(); if(resultSet.next()){ 
    System.out.println("登录成功! 欢迎您: " + name); }else{ 
    System.out.println("登录失败!"); } //6.释放资源 JDBCUtils.close(connection,statement,resultSet); } } 

(四)关闭连接

public class DBUtils { 
    private static final String DRIVER="com.mysql.jdbc.Driver"; private static final String URL="jdbc:mysql://localhost:3306/module02?characterEncoding=UTF-8"; private static final String USER="root"; private static final String PWD=""; public static void main(String[] args){ 
    Connection con= null; try { 
    Class.forName(DRIVER); con = DriverManager.getConnection(URL,USER,PWD); } catch (ClassNotFoundException | SQLException e) { 
    e.printStackTrace(); } finally { 
    try { 
    if(null!=con){ 
    con.close(); } } catch (SQLException throwables) { 
    throwables.printStackTrace(); } } } } 

3、协议说明(图片来源于拉勾教育)

在这里插入图片描述

4、控制事务

操作步骤:

  1. 获取连接
  2. 开启事务
  3. 获取到 PreparedStatement , 执行两次更新操作
  4. 正常情况下提交事务
  5. 出现异常回滚事务
  6. 最后关闭资源
    相关API:
    setAutoCommit(boolean autoCommit) :参数是 true 或 false 如果设置为 false,表示关闭自动提交,相当于开启事务
    commit() 提交事务
    rollback() 回滚事务
    注意 如果是手动提交事务,则需要在增删改查操作执行语句后 加上commit()。

二.数据库连接池

1、连接池概念

2、JDBC和连接池连接方式(图来自拉勾教育)

普通 JDBC方式
在这里插入图片描述
连接池方式:
在这里插入图片描述

3、如何使用

Java提供了公共的连接池接口:javax.sql.DataSource,不同厂商需要用自己的连接池去实现。

4、常见连接池

(一)DBCP

介绍

DBCP也是一个开源的连接池,是Apache成员之一,在企业开发中也比较常见,tomcat内置的连接池。

配置

将对应数据库的驱动即我们的jar包导入项目,也可将常用的一些数据库的jar包作为库添加至项目。

工具类(示例代码来自拉勾教育)
讯享网public class DBCPUtils { 
    //1.定义常量 保存数据库连接的相关信息 public static final String DRIVERNAME = "com.mysql.jdbc.Driver"; public static final String URL = "jdbc:mysql://localhost:3306/db5?characterEncoding=UTF-8"; public static final String USERNAME = "root"; public static final String PASSWORD = ""; //2.创建连接池对象 (有DBCP提供的实现类) public static BasicDataSource dataSource = new BasicDataSource(); //3.使用静态代码块进行配置 static{ 
    dataSource.setDriverClassName(DRIVERNAME); dataSource.setUrl(URL); dataSource.setUsername(USERNAME); dataSource.setPassword(PASSWORD); } //4.获取连接的方法 public static Connection getConnection() throws SQLException { 
    //从连接池中获取连接 Connection connection = dataSource.getConnection(); return connection; } //5.释放资源方法 public static void close(Connection con, Statement statement){ 
    if(con != null && statement != null){ 
    try { 
    statement.close(); //归还连接 con.close(); } catch (SQLException e) { 
    e.printStackTrace(); } } } public static void close(Connection con, Statement statement, ResultSet resultSet){ 
    if(con != null && statement != null && resultSet != null){ 
    try { 
    resultSet.close(); statement.close(); //归还连接 con.close(); } catch (SQLException e) { 
    e.printStackTrace(); } } } } 

(二)CP30

介绍

C3P0是一个开源的JDBC连接池,支持JDBC3规范和JDBC2的标准扩展。目前使用它的开源项目有Hibernate、Spring等。

配置

1.C3P0有两个jar包
2.将c3p0-config.xml也需要放至项目中的src文件或者 自建目录,将该目录改为资源文件根目录。
在这里插入图片描述
3.工具类

public class C3P0Utils { 
    //1.创建连接池对象 C3P0对DataSource接口的实现类 //使用的配置是 配置文件中的默认配置 //public static ComboPooledDataSource dataSource = new ComboPooledDataSource(); //使用指定的配置 public static ComboPooledDataSource dataSource = new ComboPooledDataSource("mysql"); //获取连接的方法 public static Connection getConnection() throws SQLException { 
    return dataSource.getConnection(); } //释放资源 public static void close(Connection con, Statement statement){ 
    if(con != null && statement != null){ 
    try { 
    statement.close(); //归还连接 con.close(); } catch (SQLException e) { 
    e.printStackTrace(); } } } public static void close(Connection con, Statement statement, ResultSet resultSet){ 
    if(con != null && statement != null && resultSet != null){ 
    try { 
    resultSet.close(); statement.close(); //归还连接 con.close(); } catch (SQLException e) { 
    e.printStackTrace(); } } } } 

(三)Druid

介绍

Druid(德鲁伊)是阿里巴巴开发的号称为监控而生的数据库连接池,Druid是目前最好的数据库连接池。在功能、性能、扩展性方面,都超过其他数据库连接池,同时加入了日志监控,可以很好的监控DB池连接和SQL的执行情况。

配置
讯享网public class DruidUtils { 
    //1.定义成员变量 public static DataSource dataSource; //2.静态代码块 static{ 
    try { 
    //3.创建属性集对象 Properties p = new Properties(); //4.加载配置文件 Druid 连接池不能够主动加载配置文件 ,需要指定文件 InputStream inputStream=DruidUtils.class.getClassLoader().getResourceAsStream("druid.properties"); //5. 使用Properties对象的 load方法 从字节流中读取配置信息 p.load(inputStream); //6. 通过工厂类获取连接池对象 dataSource = DruidDataSourceFactory.createDataSource(p); } catch (Exception e) { 
    e.printStackTrace(); } } //获取连接的方法 public static Connection getConnection(){ 
    try { 
    return dataSource.getConnection(); } catch (SQLException e) { 
    e.printStackTrace(); return null; } } //释放资源 public static void close(Connection con, Statement statement){ 
    if(con != null && statement != null){ 
    try { 
    statement.close(); //归还连接 con.close(); } catch (SQLException e) { 
    e.printStackTrace(); } } } public static void close(Connection con, Statement statement, ResultSet resultSet){ 
    if(con != null && statement != null && resultSet != null){ 
    try { 
    resultSet.close(); statement.close(); //归还连接 con.close(); } catch (SQLException e) { 
    e.printStackTrace(); } } } } 

5.DBUtils工具类

(一)概念

  • Commons DbUtils是Apache组织提供的一个对JDBC进行简单封装的开源工具类库,使用它能够简化JDBC应用程序的开发,同时也不会影响程序的性能。
  • DBUtils就是JDBC的简化开发工具包。需要项目导入 commons-dbutils-1.6.jar。

(二)核心功能

  1. QueryRunner 中提供对sql语句操作的API.
    • 注意:手动模式
    • 实现增删改查:核心方法:update(Connection conn, String sql, Object… params)
    • 步骤
      • 创建QueryRunner(手动或自动)
      • 占位符方式 编写SQL
      • 设置占位符参数
      • 执行
  2. ResultSetHandler接口,用于定义select操作后,怎样封装结果集.实际应用中我们根据不同的需求去使用最合适的实现类。
  3. DbUtils类,他就是一个工具类,定义了关闭资源与事务处理相关方法.

三.批处理

  • 批处理可以一次执行大量的sql语句,在我们需要添加大量数据时,使用批处理效率很高。
  • mysql 批处理是默认关闭的,所以需要加一个参数才打开mysql 数据库批处理,在url中添加
    • 如:url=jdbc:mysql://127.0.0.1:3306/db5?characterEncoding=UTF-8&rewriteBatchedStatements=true

Mysql元数据

1.概念

除了表之外的数据都是元数据,可以分为三类

  • 查询结果信息: UPDATE 或 DELETE语句 受影响的记录数。
  • 数据库和数据表的信息: 包含了数据库及数据表的结构信息。
  • MySQL服务器信息: 包含了数据库服务器的当前状态,版本号等。
    常用命令有
    • 元数据相关的命令介绍
    • 1.查看服务器当前状态
    • 2.查看MySQl的版本信息
    • 3.查询表中的详细信息
    • 4.显示数据表的详细索引信息
    • 5.列出所有数据库
    • 6.显示当前数据库的所有表
    • 7.获取当前的数据库名

四.问题总结

在过程中因为IDEA中连接Mysql发生密码错误的问题浪费了太多时间,因为之前使用XAMPP时安装的Mysql文件没有卸载干净,也会导致发生密码错误的问题,即使在命令行和第三方工具都可以正常登陆。
最终彻底删除干净后重装Mysql,问题解决
步骤如下:1.win10在应用里卸载掉MySQL相关的软件
2.删除默认安装目录下的 MySQL文件(如果是默认C盘目录下的话就是 ProgramFiles和ProgramData文件中去找)
3.关掉任务管理器中进程里的mysqld.exe
4.删除注册表中的MySQL信息,重装Mysql即可

小讯
上一篇 2025-03-17 15:03
下一篇 2025-04-05 22:32

相关推荐

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容,请联系我们,一经查实,本站将立刻删除。
如需转载请保留出处:https://51itzy.com/kjqy/52982.html