sql注入问题
sql存在漏洞,会被攻击导致数据泄漏,sql会被拼接or
user='' ' or '1=1''
password='' ' or '1=1''
10.5PreparedStatement对象
PreparedStatement可以防止sql注入,效率更高
10.9数据库连接池
数据库连接完毕--执行完毕--释放
连接--释放十分浪费系统资源
池化技术:准备一些预先的资源,过来就连接预先准备好的
银行开门--业务员:等待--服务--
常用连接数 10个
最小连接数 10
最大连接数 15 业务最高承载上限
等待超时 100ms
编写连接池,实现一个接口 DataSoure
开源数据源实现
DBCP
C3P0
Durid:阿里巴巴
使用了这些数据库连接池后,我们在项目开发中就不需要编写连接数据库的代码了
C3P0:
配置:
<?xml version="1.0" encoding="UTF-8"?> <c3p0-config> <!-- c3p0的缺省(默认)配置 如果在代码中"ComboPooledDataSource ds=new ComboPooledDataSource();"这样写就表示使用的是c3p0的缺省(默认)--> <default-config> <property name="driverClass">com.mysql.cj.jdbc.Driver</property> <property name="jdbcUrl">jdbc:mysql://localhost:3306/school?useUnicode=true&characterEncoding=utf8&uesSSL=true&serverTimezone=UTC</property> <property name="user">root</property> <property name="password">123456</property> <property name="acquireIncrement">5</property> <property name="initialPoolSize">10</property> <property name="minPoolSize">5</property> <property name="maxPoolSize">20</property> </default-config> <!--如果在代码中"ComboPooledDataSource ds=new ComboPooledDataSource("MySQL");"这样写就表示使用的是name=MySQL --> <named-config name="MySQL"> <property name="driverClass">com.mysql.cj.jdbc.Driver</property> <property name="jdbcUrl">jdbc:mysql://localhost:3306/school?useUnicode=true&characterEncoding=utf8&uesSSL=true&serverTimezone=UTC</property> <property name="user">root</property> <property name="password">123456</property> <property name="acquireIncrement">5</property> <property name="initialPoolSize">10</property> <property name="minPoolSize">5</property> <property name="maxPoolSize">20</property> </named-config> </c3p0-config>
utils:
import com.mchange.v2.c3p0.ComboPooledDataSource; import java.sql.Connection; import java.sql.ResultSet; import java.sql.SQLException; import java.sql.Statement; public class JdbcUtils_C3P0 { private static ComboPooledDataSource dataSource=null; static { try{ //创建数据源 dataSource = new ComboPooledDataSource();//十分方便,只需要一个语句。 } catch (Exception e) { e.printStackTrace(); } } public static Connection getConnection() throws SQLException { return dataSource.getConnection(); } //新建一个release的方法类来实现 释放连接资源 的功能 public static void release(Connection conn, Statement st, ResultSet rs){ if (rs!=null) { try { rs.close(); } catch (SQLException e) { e.printStackTrace(); } } if (st!=null){ try { st.close(); } catch (SQLException e) { e.printStackTrace(); } } if (conn!=null){ try { conn.close(); } catch (SQLException e) { e.printStackTrace(); } } } }
test:
import com.kuang.lesson05.utils.JdbcUtils_C3P0; import java.sql.Connection; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.sql.SQLException; public class TestC3P0 { public static void main(String[] args) { Connection conn = null; PreparedStatement st = null; ResultSet rs =null; try { conn= JdbcUtils_C3P0.getConnection(); String sql="INSERT INTO grade(gradeid,gradename)VALUES(?,?)"; st=conn.prepareStatement(sql);//预编译sql,先写sql,然后不执行 //手动给参数赋值 st.setInt(1,6);//第一个问号,插入值6 st.setString(2,"大六");//第二个问号插入值 //注意点: sql.Date 数据库用的 java.sql.Date() // util.Date Java用的 new Date().getTime() 获得时间戳 // st.setDate(5,new java.sql.Date(new Date().getTime())); //执行 int i=st.executeUpdate(); if (i>0){ System.out.println("插入成功!"); } } catch (SQLException e) { e.printStackTrace(); }finally { JdbcUtils_C3P0.release(conn,st,rs); } } }