jdbc连接mysql数据库的常用对象_JDBC常用对象

主要作用:

注册驱动 实际开发中使用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博客作者灰白世界的原创作品,如需转载,请注明出处,否则将追究法律责任

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/266606.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

latex大括号 多行公式_如何快速入门 LaTeX,在 XMind 2020 中轻松输入方程。

数学方程输入对于很多理工科朋友来说是一件让人头疼的事情。不仅是数学方程本身就纷繁复杂花样百出,各种输入语法更是劝退无数人。然而很多看似复杂的东西其实并非如想象中的难,抓住本质即可快速入门。今天和大家分享下如何快速入门 LaTeX,在…

全国计算机等级考试题库二级C操作题100套(第08套)

更多干货推荐可以去牛客网看看,他们现在的IT题库内容很丰富,属于国内做的很好的了,而且是课程刷题面经求职讨论区分享,一站式求职学习网站,最最最重要的里面的资源全部免费!!!点击进…

部署及配置Lync Server 2013 监控功能

在上面一篇文章中我们已经部署了存档功能,并且在标准版环境搭建了一台SQLServer服务器作为后端数据库服务器,有了这台服务器我们可以做什么呢?存档,当然还有监控,以及整个CMS。当然这都是一步一步演变的,并…

python处理excel的方法有哪些_python简单处理excel方法

1 # codingutf-8 2 3 import xlrd # 读模块4 import xlwt # 写模块5 6 7 def read_excel():8 """9 读取excel文件方法说明(此函数只是对xlrd用法的说明,看看就好。xlrd已经很好用了)10 :return:11 """12 # 打开…

mysql 客户服务号获取_《MySQL排错指南》——1.4 获取查询信息-阿里云开发者社区...

本节书摘来自异步社区出版社《MySQL排错指南》一书中的第1章,第1.4节,作者:【美】Sveta Smirnova(斯维特 斯米尔诺娃),更多章节内容可以访问云栖社区“异步社区”公众号查看。1.4 获取查询信息正如前一节看到的一样,数…

全国计算机等级考试题库二级C操作题100套(第09套)

第09套: 给定程序中,函数fun的功能是将不带头节点的单向链表结点数据域中的数据从小到大排序。即若原链表结点数据域从头至尾的数据为:10、4、2、8、6,排序后链表结点数据域从头至尾的数据为:2、4、6、8、10。 请在程序的下划线处…

基于交换芯片的五元组的PCL规则过滤功能

2019独角兽企业重金招聘Python工程师标准>>> 基于交换芯片的五元组的PCL规则过滤功能作者: 韩大卫吉林师范大学2012.12.10Not Approved by Document Control Review Copy Only基于Marvell 98DX51xx/81xx交换芯片的五元组等的策略规则(PCL)过滤功能.现将部分的功能的…

python生成树状图_python 生成 树状结构

forwarding_recp re.compile(".*?发件人:(.*?);.*?发送时间:.*?收件人:(.*?)主题", re.S)def parse_addr(addr, split_str,): l[]ifaddr:for a inaddr.split(split_str): l.append(utils.parseaddr(a)[1])returnldef gen_forwarding(con): #参数是解析过后的邮…

remove()与empty()的区别

1、empty() - 从被选元素中删除子元素; 2、remove() - 删除被选元素(及其子元素); 3、remove() 方法也可接受一个参数,允许您对被删元素进行过滤。转载于:https://www.cnblogs.com/hwldyz/p/9335717.html

2013年6月和12月CISA考试报名,认证,CPE维持和备考要点

2013年6月和12月CISA考试报名,认证,CPE维持和备考要点 2013年6月和12月CISA考试报名,认证,CPE维持和备考要点 消息来源:http://www.isaca.org/CERTIFICATION/CISA-CERTIFIED-INFORMATION-SYSTEMS-AUDITOR/REGISTER-FOR-THE-EXAM/Pages/default.aspx在线报名费用 早…

全国计算机等级考试题库二级C操作题100套(第10套)

第10套: 给定程序中,函数fun的功能是:判定形参a所指的NN(规定N为奇数)的矩阵是否是"幻方",若是,函数返回值为1; 不是,函数返回值为0。“幻方"的判定条件是…

mysql字节对齐_结构体字节对齐(转)

结构体字节对齐在用sizeof运算符求算某结构体所占空间时,并不是简单地将结构体中所有元素各自占的空间相加,这里涉及到内存字节对齐的问题。从理论上讲,对于任何变量的访问都可以从任何地址开始访问,但是事实上不是如此&#xff0…

python docx 合并文档 图片_不再为处理PDF烦恼,python处理操作PDF全攻略

本篇聊下Python对pdf的各种操作,包含pdf转word,pdf转图片,pdf翻转,加密,加水印等。pdf转换word文档 保留格式pdf转换为word文档,被大众经常使用的是纯Python库pdfminer和python-docx搭配使用,不…

new blog

new blog转载于:https://www.cnblogs.com/uuzlove/p/9336405.html

windows server 2012 初安装体验

昨天晚上的windows server 2012 已时行 了发布了,为之在之前我已进行了下载测试安装,本来晚间想用来在虚拟机下进行安装VM-tool工具的,但是却因种种原因没有成功,为之补一下前面没有安装的过程截图。 进入下载页后,下载…

python 多进程 调用模块内函数_python子进程模块subprocess详解与应用实例 之一

分类: Python/Ruby 2014-09-09 10:59:42 subprocess--子进程管理器 一、subprocess 模块简介 subprocess最早是在2.4版本中引入的。 subprocess模块用来生成子进程,并可以通过管道连接它们的输入/输出/错误,以及获得它们的返回值。 它用来代替…

安卓APP_ 控件(1)—— TextView

摘自:安卓APP_ 控件(1)—— TextView 作者:丶PURSUING 发布时间: 2021-03-28 21:53:49 网址:https://blog.csdn.net/weixin_44742824/article/details/115283233 本文为学习笔记,是安卓APP学习的…

python udp 大文件_Python:通过UDP发送大对象

我是套接字编程的新手,最近为它挑选了Python。我有几个问题,我似乎无法找到明确的答案。Python:通过UDP发送大对象我正在研究通过UDP发送数据,并写了一个简单的python脚本来做到这一点。可以很好地发送小对象(准确地说是小腌制对象…

Flask入门系列(转载)

一、入门系列: Flask入门系列(一)–Hello World 项目开发中,经常要写一些小系统来辅助,比如监控系统,配置系统等等。用传统的Java写,太笨重了,连PHP都嫌麻烦。一直在寻找一个轻量级的后台框架,学…

iphone3G恢复到3.1.2遇到的问题

1.报错1015 2.进入DFU模式,刷到下载数据停止不动。 3.进入菠萝,进度条走到最后停止不动。 4.红雪走到waiting for reboot停止不动。 针对上述问题: 首先,要找到完全对应手机系统原版本的固件。然后,红雪进入DFU模式刷机…