主要作用:

注册驱动 实际开发中使用Class.forName("com.mysql,jdbc.Drive");这种方式,因为之前的方式会导致注册两次驱动

获得连接 Connection getConnection(String url,String username,String password)

url写法:jdbc:mysql://localhost:3306/jdbctest

jdbc 协议

mysql 子协议

localhost 主机名

3306 端口号

jdbctest 数据库名

如果连接的是本机,可以简写为jdbc:mysql:///jbdctest

Connection 连接对象

主要作用:

创建用来执行SQL语句的对象

Statement createStatement() 执行SQL语句,有SQL注入漏洞威胁

PrepareStatement prepareStatement(String sql) 预编译SQL语句,解决SQL注入

CallableStatement prepareCall(String sql) 执行SQL中的存储过程

事务的管理

setAutoCommit(boolean autoCommit) 设置事务是否自动提交

commit() 事务提交

rollback() 事务回滚

Statement 执行SQL

主要作用:

执行SQL语句

boolean execute(String sql) 执行SQL,执行查询语句返回true,否则返回false

ResultSet execute(String sql) 执行SQL中的查询语句

int executeUpdate(String sql) 执行SQL中的插入、更新、删除语句

执行批处理操作

addBatch(String sql) 添加到批处理

executeBatch() 执行批处理

clearBatch() 清空批处理

ResultSet 结果集

主要作用:

获取查询到的结果

next() 判断是否存在下一条记录

针对不同类型的数据可以使用getXXX()获取数据

getObject() 通用获取数据,可以获取任何类型的数据

JDBC的SQL注入漏洞问题

package com.kernel.test;

import org.junit.Test;

import java.sql.Connection;

import java.sql.ResultSet;

import java.sql.Statement;

/**

* 演示JDBC注入漏洞

*/

public class JDBCDemo04 {

@Test

/**

* 测试SQL注入

*/

public void demo1() {

//boolean result = login("aaa", "11");

//boolean result = login("aaa' or '1=1", "5454545");

boolean result = login("aaa' -- ", "sjjkhnjkhnk");

System.out.println(result);

}

public boolean login(String username, String password) {

Connection connection = null;

Statement statement = null;

ResultSet resultSet = null;

try {

connection = DBUtil.getConnection();

statement = connection.createStatement();

String sql = "select * from user where username='" + username + "' and password='" + password + "'";

resultSet = statement.executeQuery(sql);

if (resultSet.next()) {

return true;

} else {

return false;

}

} catch (Exception e) {

e.printStackTrace();

} finally {

DBUtil.release(resultSet, statement, connection);

}

return false;

}

}

我们来看下这是什么原因,有这样一行代码

boolean result = login("aaa' or '1=1", "5454545");

这时,sql就变成了这样

sql = "select * from user where username='aaa' or '1=1' and password='545445'";

SQL会首先判断and这个语句,and的结果为false,username='aaa',结果为true,true or false返回true

再来看第二条

sql "select * from user where username='aaa' -- and password='sjjkhnjkhnk'

-- 是注释的意思,意思就是注释后面的password=xxx,肯定返回true

如何解决呢

PrepareStatement是Statement的子接口,它的实例对象可以通过调用Connection.prepareStatement(sql)方法获得,相对于Statement对象而言:

PrepareStatement可以避免SQL注入漏洞的问题

Statement会使数据库频繁的编译SQL,可能造成数据库缓冲区溢出,而PrepareStatement可以对SQL进行预编译,提高数据库执行效率

PrepareStatement允许使用占位符替换SQL中的参数,简化编写

package com.kernel.test;

import org.junit.Test;

import java.sql.Connection;

import java.sql.PreparedStatement;

import java.sql.ResultSet;

import java.sql.Statement;

/**

* 演示JDBC注入漏洞

*/

public class JDBCDemo04 {

@Test

/**

* 测试SQL注入

*/

public void demo1() {

//boolean result = login("aaa", "11");

//boolean result = login("aaa' or '1=1", "5454545");

boolean result = logon("aaa' -- ", "sjjkhnjkhnk");

System.out.println(result);

}

/**

* 避免SQL注入漏洞

* @param username

* @param password

* @return

*/

public boolean logon(String username, String password) {

Connection connection = null;

PreparedStatement preparedStatement = null;

ResultSet resultSet = null;

try {

connection = DBUtil.getConnection();

String sql = "select * from user where username=? and password=?";

preparedStatement = connection.prepareStatement(sql);

preparedStatement.setString(1, username);

preparedStatement.setString(2, password);

resultSet = preparedStatement.executeQuery();

if (resultSet.next()) {

return true;

} else {

return false;

}

} catch (Exception e) {

e.printStackTrace();

} finally {

DBUtil.release(resultSet, (Statement) preparedStatement, connection);

}

return false;

}

/**

* 产生SQL注入漏洞

*

* @param username

* @param password

* @return

*/

public boolean login(String username, String password) {

Connection connection = null;

Statement statement = null;

ResultSet resultSet = null;

try {

connection = DBUtil.getConnection();

statement = connection.createStatement();

String sql = "select * from user where username='" + username + "' and password='" + password + "'";

resultSet = statement.executeQuery(sql);

if (resultSet.next()) {

return true;

} else {

return false;

}

} catch (Exception e) {

e.printStackTrace();

} finally {

DBUtil.release(resultSet, statement, connection);

}

return false;

}

}

为什么使用它就可以避免SQL注入漏洞呢?那是因为创建对象的时候就将sql传递进去,并进行了预编译,即使后面通过变量传递了关键字进来,也会认为这是字符串

数据库连接池

连接池是创建和管理一个连接的缓冲池的技术,这些连接准备好被任何需要它们的线程使用

应用程序直接获得链接的缺点

用户每次请求都需要向数据库获得连接,而数据库创建连接通常需要消耗较大的资源,创建时消耗的事件也比较长,在高并发业务场景下,如果采用这种方式获得连接,极大浪费数据库的资源,并且容易造成数据库服务器内存溢出

那么连接池是怎么解决这个问题的呢

连接池中默认存放了若干个数据库连接对象,当用户请求与数据库进行连接时,直接从数据库中取出,当用户完成操作需要释放数据库连接资源时,销毁的连接回到连接池继续等待下一次用户的请求

C3P0的使用

package com.kernel.test;

import com.mchange.v2.c3p0.ComboPooledDataSource;

import org.junit.Test;

import java.sql.Connection;

import java.sql.PreparedStatement;

import java.sql.ResultSet;

/**

* 演示连接池

*/

public class DataSourseDemo01 {

@Test

/**

* 手动设置连接池

*/

public void demo1() {

//获得连接

Connection connection = null;

PreparedStatement preparedStatement = null;

ResultSet resultSet = null;

try {

//创建连接池

ComboPooledDataSource dataSource = new ComboPooledDataSource();

//设置连接池参数

dataSource.setDriverClass("com.mysql.jdbc.Driver");

dataSource.setJdbcUrl("jdbc:mysql://127.0.0.1:3306/jdbctest");

dataSource.setUser("root");

dataSource.setPassword("123456");

dataSource.setMaxPoolSize(20);

connection = dataSource.getConnection();

String sql = "select * from user";

preparedStatement = connection.prepareStatement(sql);

resultSet = preparedStatement.executeQuery();

while (resultSet.next()) {

System.out.println(resultSet.getInt("uid") + "\t"

+ resultSet.getString("username") + "\t"

+ resultSet.getString("password") + "\t"

+ resultSet.getString("name"));

}

} catch (Exception e) {

e.printStackTrace();

} finally {

DBUtil.release(resultSet, preparedStatement, connection);

}

}

@Test

/**

* 读取配置文件设置连接池,默认读取src目录下的c3p0-config.xml文件

*/

public void demo2() {

//获得连接

Connection connection = null;

PreparedStatement preparedStatement = null;

ResultSet resultSet = null;

try {

//创建连接池

connection = DBUtil.getConnection();

String sql = "select * from user";

preparedStatement = connection.prepareStatement(sql);

resultSet = preparedStatement.executeQuery();

while (resultSet.next()) {

System.out.println(resultSet.getInt("uid") + "\t"

+ resultSet.getString("username") + "\t"

+ resultSet.getString("password") + "\t"

+ resultSet.getString("name"));

}

} catch (Exception e) {

e.printStackTrace();

} finally {

DButil2.release(resultSet, preparedStatement, connection);

}

}

}

编写C3P0的配置文件

com.mysql.jdbc.Driver

jdbc:mysql:///jdbctest

root

123456

5

20

©著作权归作者所有:来自51CTO博客作者灰白世界的原创作品,如需转载,请注明出处,否则将追究法律责任

jdbc连接mysql数据库的常用对象_JDBC常用对象相关推荐

  1. JDBC连接MySQL数据库及示例

    JDBC是Sun公司制定的一个可以用Java语言连接数据库的技术. 一.JDBC基础知识         JDBC(Java Data Base Connectivity,java数据库连接)是一种用 ...

  2. JDBC连接MySQL数据库及演示样例

    JDBC是Sun公司制定的一个能够用Java语言连接数据库的技术. 一.JDBC基础知识         JDBC(Java Data Base Connectivity,java数据库连接)是一种用 ...

  3. jaba窗体连接mysql增删改查_知识实现——Java使用jdbc连接MySql数据库,实现增删改查...

    Java使用jdbc连接MySql数据库,实现增删改查 首先,导入MySql连接数据库的jar包,我用的是 mysql连接jar包 DB类,用于获得数据库连接 import java.sql.Driv ...

  4. java mysql教程基于_java基于jdbc连接mysql数据库功能实例详解

    本文实例讲述了java基于jdbc连接mysql数据库的方法.分享给大家供大家参考,具体如下: 一.JDBC简介 Java 数据库连接,(Java Database Connectivity,简称JD ...

  5. mysql分页查询出租房屋信息_分页查询信息(使用jdbc连接mysql数据库实现分页查询任务)...

    分页查询信息 使用jdbc连接mysql数据库实现分页查询任务 通过mysql数据库提供的分页机制,实现商品信息的分页查询功能,将查询到的信息显示到jsp页面上. 本项目时一个简单的运用eclipse ...

  6. Java新手入门200例124之用JDBC连接Mysql数据库

    文章目录 作者简介 引言 导航 热门专栏推荐 一.创建web项目 二.加入Mysql驱动 三.编写查询代码 四.测试查询代码 五.编写插入代码 六.编写修改代码 七.编写删除代码 小结 导航 热门专栏 ...

  7. java JDBC连接MySQL数据库调用存储过程进行查询

    java JDBC连接MySQL数据库调用存储过程进行查询 主程序代码 工具类 文件信息 存储过程 结果截图 主程序代码 package Mysql;import util.JDBCUtils; im ...

  8. Java JDBC 连接MySQL数据库方法(IJ版)

    Java JDBC 连接MySQL数据库方法(IJ版) 首先说一下IJ建立项目步骤: 1.新建一个Empty Project 2.新建一个Module 3.在src里新建一个Package 4.在Pa ...

  9. JAVA-数据库之JDBC连接MySQL数据库

    相关资料: <21天学通Java Web开发> JDBC连接MySQL数据库 1.如果需要通过JDBC来连接MySQL数据库,还必须先在MySQL数据库服务器中创建数据库和表. Conne ...

  10. JDBC连接MySQL数据库代码模板

    下面这个例子是最简单的JDBC连接MySQL数据库的例子. 一般步骤: 1.注册驱动: 2.建立连接: 3.创建语句: 4.处理结果: 5.释放资源. 注意: 1.软件开发环境:MyEclipse 8 ...

最新文章

  1. python免费试听-线上儿童编程免费试听-品质保障
  2. python绘制折线图中文图例不显示_python使用matplotlib绘图时图例显示问题的解决...
  3. C语言学习之用选择法对10个整数排序
  4. 线性插值算法实现图像_C程序实现插值搜索算法
  5. Python刷题-1
  6. Ubuntu on WSL 2 GA
  7. unity3d点击屏幕选中物体
  8. 中国南方航空新开广州直飞宿务航线
  9. 【Web前端】笔试题含解析
  10. vue-element-admin——登录页面添加自定义背景
  11. wincc 服务器授权型号,WINCC 授权详解
  12. 小学计算机课教师教学笔记,小学信息技术教师教育随笔
  13. 运营前线2:一线运营专家的运营方法、技巧与实践01 在腾讯两年,我学会了这15条内容运营干货...
  14. jQuery计算时间差和阴阳历转换
  15. 剖析 OceanConnect 物联网特性
  16. 面试开课吧合并区间算法
  17. 【关于Spring那些事】——与君初相识
  18. 【Matlab】MATLAB绘图
  19. 人工智能的就业方向有哪些?
  20. sql数据库命令大全

热门文章

  1. Python版——博客网站四 编写日志创建页
  2. nodejs的package.json依赖dependencies中 ^ 和 ~ 的区别
  3. css预处理器sass使用教程(多图预警)
  4. 高效使用Bitmaps(一) 大Bitmap的加载
  5. php写的squid验证辅助器
  6. ubuntu文本模式获得权限修改profile
  7. 定制或外购适配器规格需求列表
  8. ABB RAPID 在 Notepad++ 中语法高亮的实现
  9. Pytorch超简单安装教程
  10. oracle使用loop将增加十天,使用loop循环操作DML语句