-jdbc预处理对象&连接池&DBUtils(十九)

第一章 PreparedStatement

1.1 SQL注入问题

SQL注入:用户输入的内容作为了SQL语句语法的一部分,改变了原有SQL真正的意义。 假设有登录案例SQL语句
如下:

SELECT * FROM 用户表 WHERE NAME = 用户输入的用户名 AND PASSWORD = 用户输的密码;

此时,当用户输入正确的账号与密码后,查询到了信息则让用户登录。但是当用户输入的账号为XXX 密码为:
XXX’ OR ‘a’=’a 时,则真正执行的代码变为:

SELECT * FROM 用户表 WHERE NAME = ‘XXX’ AND PASSWORD =’ XXX’ OR ’a’=’a’;

此时,上述查询语句时永远可以查询出结果的。那么用户就直接登录成功了,显然我们不希望看到这样的结果,这
便是SQL注入问题。 为此,我们使用PreparedStatement来解决对应的问题。

1.2 API详解:预处理对象

preparedStatement:预编译对象,是Statement对象的子类。
特点:

  • 性能高
  • 会把sql语句先编译
  • 能过滤掉用户输入的关键字。
    PreparedStatement预处理对象,处理的每条sql语句中所有的实际参数,都必须使用占位符?替换。
String sql = "select * from user where username = ? and password = ?";

PreparedStatement使用,需要通过以下3步骤完成:
① PreparedStatement预处理对象代码:
在这里插入图片描述
②设置实际参数:
在这里插入图片描述
③执行SQL语句:
在这里插入图片描述

第二章 使用连接池重写工具类

2.1 连接池原理

连接池理解为存放多个连接的集合。
在这里插入图片描述
使用连接池技术的目的:解决建立数据库连接耗费资源和时间很多的问题,提高性能。

2.2 编写标准的数据源(规范)

Java为数据库连接池提供了公共的接口:javax.sql.DataSource,各个厂商需要让自己的连接池实现这个接口。
这样应用程序可以方便的切换不同厂商的连接池!
常见的连接池:C3P0、DRUID.、DBCP连接池。

2.3 C3P0连接池

2.3.1 C3P0连接池工具类编写

DDD开源免费的连接池!目前使用它的开源项目有:Spring、Hibernate等。使用C3P0连接池需要导入jar包,
c3p0使用时还需要添加配置文件“c3p0-config.xml”
使用步骤:
① 添加jar包
② 编写配置文件 c3p0-config.xml,放在src中(注:文件名一定不要写错)
③ 编写工具类

  • 编写配置文件 c3p0-config.xml
<c3p0-config>
 <!-- 使用默认的配置读取连接池对象 --> 
 <default-config>
  <!-- 连接参数 -->
   <property name="driverClass">com.mysql.jdbc.Driver</property> 
   <property name="jdbcUrl">jdbc:mysql://localhost:3306/day17</property>
    <property name="user">root</property> 
    <property name="password">root</property>
     <!-- 连接池参数 --> 
     <property name="initialPoolSize">5</property>
     <property name="maxPoolSize">10</property>
     <property name="checkoutTimeout">2000</property> 
     <property name="maxIdleTime">1000</property> 
       </default-config>
       </c3p0-config>

c3p0连接池常用的配置参数:
在这里插入图片描述
初始连接数 :刚创建好连接池的时候准备的连接数量 最大连接数 :连接池中最多可以放多少个连接 最大等待时 间 :连接池中没有连接时最长等待时间 最大空闲回收时间 :连接池中的空闲连接多久没有使用就会回收

  • 编写C3P0工具类
public class JdbcUtils {
 //创建一个C3P0的连接池对象(使用c3p0-config.xml中default-config标签中对应的参数) 
 public static DataSource ds = new ComboPooledDataSource(); 
 //从池中获得一个连接
public static Connection getConnection() throws SQLException { return ds.getConnection(); }
//释放资源 
public static void closeAll(ResultSet rs, Statement stmt, Connection conn){ 
  if (rs != null) { 
       try {rs.close(); 
       } catch (SQLException e) { 
       throw new RuntimeException(e);
        }
        rs = null; }
  if (stmt != null)  {
       try {stmt.close(); 
       } catch (SQLException e) { 
       throw new RuntimeException(e);
        }
        stmt = null; }
  if (conn != null) { 
        try {conn.close();
         } catch (SQLException e) { 
         throw new RuntimeException(e); 
         }
         conn = null; } } }

2.3.3 C3P0连接池工具类的使用

public class Demo { 
public static void main(String[] args) throws Exception { 
   // 拿到连接 
   Connection conn = JdbcUtils.getConnection();
   // 执行sql语句
   String sql = "INSERT INTO student VALUES (NULL, ?, ?, ?);"; 
   PreparedStatement pstmt = conn.prepareStatement(sql); 
   pstmt.setString(1, "李四");
   pstmt.setInt(2, 30);
   pstmt.setDouble(3, 50); 
   int i = pstmt.executeUpdate(); 
   System.out.println("影响的函数: " + i);
   // 关闭资源
   JdbcUtils.close(conn, pstmt); }
}

第三章 DBUtils

如果只使用JDBC进行开发,我们会发现冗余代码过多,为了简化JDBC开发,本案例我们讲采用apache commons
组件一个成员:DBUtils。
DBUtils就是JDBC的简化开发工具包。需要项目导入commons-dbutils-1.6.jar才能够正常使用DBUtils工具。

1.1 概述

DBUtils是java编程中的数据库操作实用工具,小巧简单实用。DBUtils封装了对JDBC的操作,简化了JDBC操作,
可以少写代码。
Dbutils三个核心功能介绍

  • QueryRunner中提供对sql语句操作的API.
  • ResultSetHandler接口,用于定义select操作后,怎样封装结果集.
  • DbUtils类,它就是一个工具类,定义了关闭资源与事务处理的方法

1.2 QueryRunner核心类介绍

1.2.1 提供数据源

  • 构造方法
    QueryRunner(DataSource) 创建核心类,并提供数据源,内部自己维护Connection
  • 普通方法
    update(String sql , Object … params) 执行DML语句
    query(String sql , ResultSetHandler , Object … params) 执行DQL语句,并将查询结果封
    装到对象中

1.2.2 提供连接

  • 构造方法
    QueryRunner() 创建核心类,没有提供数据源,在进行具体操作时,需要手动提供Connection
  • 普通方法
    update(Connection conn , String sql , Object … params) 使用提供的Connection,完成
    DML语句
    query(Connection conn , String sql , ResultSetHandler , Object … params) 使用提供
    的Connection,执行DQL语句,并将查询结果封装到对象中。

1.6 小结

DBUtils工具

  • 作用:简化JDBC的操作

DBUtils常用类与方法

  • QueryRunner 用来执行SQL语句对象
    update(Connection conn, String sql, Object… params) 插入表记录、更新表记录、删除表记录
    query(Connection conn, String sql, ResultSetHandler handler, Object… params) 查询表记录
  • ResultSetHandler 处理结果集的对象
  • BeanHandler:将结果集中第一条记录封装到一个指定的javaBean中。
    BeanListHandler:将结果集中每一条记录封装到指定的javaBean中,将这些javaBean在封装到List集合中
    ScalarHandler:它是用于单数据。例如select count(*) from 表操作。
    ColumnListHandler:将结果集中指定的列的字段值,封装到一个List集合中
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值