数据库-JDBC

1 JDBC

1.1 JDBC的概念

利用Java语言/程序连接并访问数据库的一门技术,本质上是一堆接口,各个厂商提供了实现JDBC接口的实现类,并且在jar包里,只需要把jar包导入工程就可以操作数据库了

1.2 JDBC的实现过程

  1. 注册数据库驱动
Class.forName("com.mysql.jdbc.Driver");

让JDBC程序加载mysql驱动程序,并管理驱动
驱动程序,实现了JDBC API定义的接口以及和数据库服务器交互的功能,加载驱动是为了方便使用这些功能

  1. 获取数据库连接
Connection conn = DriverManager.getConnection(
        "jdbc:mysql://localhost:3306/jt_db?characterEncoding=utf-8",
        "root", "root");

DriverManager.getConnection() 用于获取数据连接,返回的Connection连接对象

  1. 获取传输器
    该方法返回用于向数据库服务器发送sql语句的Statement传输器对象
Statement stat = conn.createStatement();
  1. 发送SQL到服务器执行并返回执行结果
//数据库发送查询类型的sql语句,返回一个ResultSet对象中
String sql = "select * from account";
ResultSet rs = stat.executeQuery(String sql);
//向数据库发送更新(增加、删除、修改)类型的sql语句,返回一个int值,表示影响的记录行数
String sql = "insert into account values(null, 'john', 3500)";
int rows = stat.executeUpdate( sql );
  1. ResultSet结果集对象处理结果
    ResultSet对象用于封装sql语句查询的结果,也是一个非常重要的对象。该对象上提供了遍历数据及获取数据的方法。
String sql = "select * from account";
ResultSet rs = stat.executeQuery( sql );
//5.处理结果
while( rs.next() ) {
	int id = rs.getInt("id");
	String name = rs.getString("name");
	double money = rs.getDouble("money");
	System.out.println(id+" : "+name+" : "+money);
}
  • 释放资源
    此处释放资源必须按照一定的顺序释放,越晚获取的越先关闭。所以先关闭
    rs对象,再关闭stat对象,最后关闭conn对象。
rs.close();
stat.close();
conn.close();

为了避免上面的程序抛出异常,释放资源的代码不会执行,应该把释放资源的代码放在finally块中

2 SQL注入攻击

2.1 SQL注入攻击产生的原因

如果用户在提交参数时,在参数中掺杂了一些SQL关键字(比如or)或者特殊符号(#、-- 、’ 等),就可能会导致SQL语句语义的变化,从而执行一些意外的操作

2.2 防止SQL注入攻击

  • 使用正则表达式对用户提交的参数进行校验。如果参数中有(# – ’ or等)这些符号就直接结束程序,通知用户输入的参数不合法
  • 使用PreparedStatement对象来替代Statement对象。

2.3 PreparedStatement对象是如何防止SQL注入攻击

使用PreparedStatement对象

  • 先将SQL语句的骨架发送给服务器编译并确定下来,编译之后,SQL语句的骨架和语义就不会再被改变了
  • 再将SQL语句中的参数发送给服务器,即使参数中再包含SQL关键字或者特殊符号,也不会导致SQL语句的骨架或语义被改变,只会被当作普通的文本来处理
  • 在执行上面的SQL语句时,服务器会将SQL参数和SQL骨架结合在一起,最终生成一条完整的SQL对象
    如果参数是字符串,拼接时会自动加上’’"

2.4 PreparedStatement对象的使用

Connection conn = null;
PreparedStatement ps = null;
ResultSet rs = null;
try {
	//1.注册驱动并获取连接
	conn = JdbcUtil.getConn();
	//2.获取传输器,执行sql并返回执行结果
	String sql = "select * from user where username=? and password=?";
	ps = conn.prepareStatement( sql );
	//设置SQL语句中的参数
	ps.setString( 1 , user );
	ps.setString( 2 , pwd );
	//执行SQL语句
	rs = ps.executeQuery();//这里不要再传输SQL语句
	//3.处理结果
	if( rs.next() ) { //有数据 -- 用户名密码都正确
		System.out.println("恭喜您登录成功!");
	}else { //没数据 -- 用户名或密码不正确
		System.out.println("登录失败, 用户名或密码不正确!");
	}
} catch (Exception e) {
	e.printStackTrace();
} finally {
	//4.释放资源
	JdbcUtil.close(conn, ps, rs);
}

3 数据库连接池

3.1 连接池的概念

就是将连接存放在容器中,供整个程序共享

3.2 连接池的执行过程

在程序启动时,就创建一批连接放在一个连接池中(容器),当用户需要连接时,就从连接池中获取一个连接对象,用完连接后,不要关闭,而是将连接再还回连接池中

3.3 连接池的优势

  • 在传统方式中,每次用户需要连接访问数据库时,都是创建一个连接对象,基于这个连接对象访问数据库,用完连接后,会将连接关闭
  • 使用连接池,可以实现连接的复用
  • 因为每次创建连接和关闭连接非常的耗时间而且耗资源,所以减少连接创建和关闭的次数可以提高程序执行的效率

3.4 常用的连接池

C3P0:功能简单易用,稳定性好但性能很差
HikariCP:性能无敌
Druid:功能全面有强大的监控特性,中文文档比较全面

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值