Mysql基本使⽤2-Jdbc和线程池C3P0
JDBC 的概述
JDBC(Java DataBase Connectivity, java 数据库连接) 是⼀种⽤于执⾏ SQL 语句的 Java API 可以为多种关系数据库提供统⼀访问它由⼀组⽤ java 语⾔编写的类和接⼝组成 。JDBC 提供了⼀个种基准,据此可以构建更⾼级的⼯具和接⼝,使数据库开发⼈员能够编写数据库应⽤程序
核⼼API的功能
类名作⽤
DriverManager 实现类注册驱动,创建连接
Connection 接⼝表⽰数据的连接
Statement 接⼝执⾏Sql 语句的对象
ResultSet 接⼝数据库返回的结果集
Connection 接⼝的⽅法
⽅法名说明
createStatement获取Statement 对象
Statement 接⼝中的⽅法
⽅法说明
int executeUpdate((String Sql))更新 insert , update ,delete, DML 语句ResultSet executeQuery(String Sql)查询Select
ResultSet 接⼝⽅法
resultSet接⼝⽅法描述
boolean next()获取游标判断是否有下⼀⾏数据
getXXX(参数)获取这条记录的某个字段
JDBC 的流程步骤
1. 注册驱动
2. 获取链接
3. 获取执⾏平台
4. 执⾏sql 语句
5. 处理对象
6. 释放资源 先开够放 rs -> stmt 、ptmt -> conn
代码实现
// 注册驱动反射原理
Class.forName("sql.cj.jdbc.Driver");
// 获取链接
//mysql 8.0 url 建议这么写
String url="jdbc:mysql://localhost:3306/jdbcTest?useUnicode=true&characterEncoding=UTF-8"+"&use
SSL=false&serverTimezone=Asia/Shangh ai&zeroDateTimeBehavior=CONVERT_TO_NULL";
String user ="root";
String pass ="userroot";
Connection connection = Connection(url, user, pass);
//获取执⾏对象
Statement statement = ateStatement();
// 准备Sql 语句
String sql ="SELECT * FROM user";
//执⾏sql 语句返回过对象
ResultSet resultSet = uteQuery(sql);
// 处理返回的结果集对象
()){
System.out.print("uid:"+ Int("uid")+",");
System.out.print("username:"+ String("username")+",");
System.out.print("password:"+ String("password")+",");
System.out.print("name:"+ String("name")+"!");
System.out.println();
}
// 释放资源
if(resultSet != null){
try{
resultSet.close();
}catch(SQLException e){
e.printStackTrace();
}
resultSet = null;
}
if(statement != null){
try{
statement.close();
}catch(SQLException e){
e.printStackTrace();
}
statement = null;
}
if(connection != null){
try{
connection.close();
}catch(SQLException e){
e.printStackTrace();
}
}
jdbctemplate查询一条数据
}
Sql 注⼊
什么事Sql 注⼊
造成SQL注⼊的原因是因为程序没有有效过滤⽤户的输⼊,使攻击者成功的向服务器提交恶意的SQL查询代码,程序在接收后错误的将攻击者的输⼊作为查询语句的⼀部分执⾏,导致原始的查询逻辑被改变,额外的执⾏了攻击者精⼼构造的恶意代码
PreparedSteament 的执⾏原理
PreparedSteament 使⽤代码
String sql ="INSERT INTO users VALUES (?, ?, ?);";
// 会先将SQL语句发送给数据库预编译。PreparedStatement会引⽤着预编译后的结果。
PreparedStatement pstmt = conn.prepareStatement(sql);
// 设置参数
pstmt.setString(1,1);
pstmt.setInt(2,"张三");
pstmt.setString(3,"123456");
// 再次设置参数
pstmt.setString(1,2);
pstmt.setInt(2,"李四");
pstmt.setString(3,"66666");
####PreparedSteament 的好处
1. prepareStatement()会先将SQL语句发送给数据库预编译。PreparedStatement会引⽤着预编译后的结果。可以多次传⼊不同的参数
给PreparedStatement对象并执⾏。减少SQL编译次数,提⾼效率
2. 安全性⾼,没有sql 注⼊隐患
3. 提⾼可读性
链接池
连接池(Connection pooling)是程序启动时建⽴⾜够的数据库连接,并将这些连接组成⼀个连接池,由程序动态地对池中的连接进⾏申请,使⽤,释放。
个⼈理解:创建数据库连接是⼀个很耗时的操作,也容易对数据库造成安全隐患。所以,在程序初始化的时候,集中创建多个数据库连接,并把他们集中管理,供程序使⽤,可以保证较快的数据库读写速度,还更加安全可靠
1. 之前JDBC 访问数据库的步骤
创建数据库 —> 执⾏sql 语句 —> 关闭链接
2. 获取数据库连接需要消耗⽐较多的资源,⽽每次操作都要重新获取新的连接对象,执⾏⼀次操作就把连接关闭,⽽数据库创建连接通
常需要消耗相对较多的资源,创建时间也较长。这样数据库连接对象的使⽤率低。
连接池解决的问题
1. 程序⼀开始就创建⼀定数量的链接放⼊⼀个容器中,这个容器就是连接池
2. 使⽤时直接从连接池取出⼀个已经创建的链接对象
3. 关闭的时候并不是真正关闭连接 ⽽是将链接对象再次放回连接池中
4. 连接的重复使⽤节省数据库的资源消耗
1. javax.sql.DataSource 表⽰数据库连接池 是JDK 提供的⼀个接⼝
C3P0 的连接池使⽤
C3P0是⼀个开源的连接池。Hibernate框架,默认推荐使⽤C3P0作为连接池实现
C3P0 常⽤的配置参数
参数说明
initialPoolSize刚创建连接池的链接数量
参数说明
maxPoolSize连接池 最多放多少链接
checkoutTimeout连接池中没有连接时最长等待时间
maxIdleTime连接池中的空闲连接多久没有使⽤就会回收。默认是0,0表⽰不回收
C3P0配置⽂件
配置⽂件的要求
1. ⽂件名:l
2. 放在源代码即src⽬录下
3. 配置⽂件 l
<?xml version="1.0" encoding="UTF-8"?>
<c3p0-config>
<!-- 默认配置,如果没有指定则使⽤这个配置 -->
<default-config>
<property name="user">root</property>
<property name="password">userroot</property>
<property name="jdbcUrl">jdbc:mysql://localhost:3306/imooc?useUnicode=true&characterEncoding=UTF-8&useSSL=false&serverTim ezone=Asia/Shanghai&zeroDateTimeBehavior=CONVERT_TO_NULL</property>
<property name="driverClass"&sql.cj.jdbc.Driver</property>
<property name="checkoutTimeout">30000</property>
<property name="idleConnectionTestPeriod">30</property>
<property name="initialPoolSize">3</property>
<property name="maxIdleTime">30</property>
<property name="maxPoolSize">100</property>
<property name="minPoolSize">2</property>
<property name="maxStatements">200</property>
</default-config>
<!-- 命名的配置,可以通过⽅法调⽤实现 -->
<named-config name="test">
<property name="user">zhanghanlun</property>
<property name="password">123456</property>
<property name="jdbcUrl">jdbc:mysql://localhost:3306/zhanghanlun</property>
<property name="driverClass"&sql.jdbc.Driver</property>
<!-- 如果池中数据连接不够时⼀次增长多少个 -->
<property name="acquireIncrement">5</property>
<!-- 初始化数据库连接池时连接的数量 -->
<property name="initialPoolSize">20</property>
<!-- 数据库连接池中的最⼤的数据库连接数 -->
<property name="maxPoolSize">25</property>
<!-- 数据库连接池中的最⼩的数据库连接数 -->
<property name="minPoolSize">5</property>
</named-config>
</c3p0-config>
C3P0 API 介绍
1. ⽆参构照⽅法 使⽤默认配置
public ComboPooledDataSource()
⽆参构造使⽤默认配置(使⽤xml中default-config标签中对应的参数)
2. 有参构照
public Connection getConnection() throws SQLException
从连接池中取出⼀个连接
使⽤步骤
1. 导⼊jar 包 c3p0-0.9.1.
2.jar
2. 编写c3p0-0.9.1.2.jar 的配置⽂件 配置相对参数
3. 将配置⽂件放在 resources ⽂件夹下
4. 创建连接池对象ComboPooledDataSource,
5. 从连接池中获取连接对象
6. 使⽤连接对象操作数据库
7. 关闭资源
注:配置⽂件的名称必须l
代码实现
//创建连接池对象
DataSource dataSource = new ComboPooledDataSource();
//连接池中获取链接对象
Connection connection = Connection();
String sql = "delete * FROM student where  id=?;";
/
/执⾏sql 语句操作数据库
PreparedStatement psm = connection.prepareStatement(sql);
psm.setInt(1, 1);
int i = uteUpdate();
System.out.println(i);
*//* ResultSet resultSet = uteQuery();
while (()) {
System.out.Int("id"));
System.out.String("name"));
}*//*
} catch (SQLException e) {
e.printStackTrace();
}finally {
connection.close();
resultSet.close();
psm.close();
comboPooledDataSource.close();
}
JdbcTemplate 的基本使⽤
JdbcTemplate是Spring对JDBC的封装,⽬的是使JDBC更加易于使⽤。JdbcTemplate是Spring的⼀部分。JdbcTemplate处理了资源的建⽴和释放。他帮助我们避免⼀些常见的错误,⽐如忘了总要关闭连接。他运⾏核⼼的JDBC⼯作流,如Statement的建⽴和执⾏,⽽我们只需要提供SQL语句和提取结果。
JdbcTemplate 执⾏sql 的⽅法

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。