关于JDBC的一些个人理解

最近回顾了java基础方面的一些东西,这里就jdbc写一个个人总结,如果有不对的地方,欢迎各位批评指正。

1.什么是jdbc?

简单地说,jdbc技术就是用来对数据库做操作的。它为应用程序访问数据库提供了统一的接口,屏蔽了各种数据库之间的异构性,保证了程序的可移植性。在jdbc中开发者可以通过jdbc api将标准的sql语句通过jdbc驱动管理器传递给相应的jdbc驱动,并由该驱动传送给指定的数据库服务器。

2.jdbc开发步骤

1.加载驱动、建立与数据库的连接
        加载JDBC驱动程序:Class.forName("驱动程序类名");
        建立数据库连接:Connection con = DriverManage.getConnection(String url, String username, String password);
2.执行SQL语句:statement对象和PreparedStatement对象
        Statement stmt = con.createStatement();
        boolean a = stmt .execute(sql);  、
3.处理结果集
4.关闭数据库连接 

其中url指向数据库的地址,user为数据库用户名,passcard为数据库密码。通常情况下为了减少代码的冗余,这些东西都被写在配置文件中。
上诉execute(String sql)方法用于执行ddl语句,其返回为boolean值,返回为true表示有结果集,返回为false表示无结果集。除此之外,可用executeUpdate(String sql)方法执行DML语句,返回的结果表示受影响的行数,是个数字。executeQuery(String sql)方法用于执行dql查询语句,返回的结果是一个ResultSet对象,可以通过遍历来处理结果集。(其他更多api,例如批量执行等可查阅jdbc api文档)

3.statement对象和preparedStatement对象

preparedStatement是statement对象的一个子接口,创建preparedStatement对象的时候就指定了sql语句,并立刻发送给DBMS进行编译,也就是预编译。在执行预编译语句的时候DBMS就可以直接运行编译后的SQL语句,不需要像其他SQL语句一样先编译。而通过Statement对象执行sql语句时,需要将Sql语句发送给DBMS,由DBMS首先进行编译再执行,效果极差。
预编译语句还支持带参数的SQL语句,对相同的SQL可以替换参数多次使用。因此使用预编译语句可减少执行时间,提高执行效率。Statement主要用于执行静态sql,即内容不变的sql。PreparedStatement可以重用执行计划,比较适合反复往数据库中加一批数据。
执行计划:面向数据库。sql语句面向人,数据库不认识sql语句,sql语句会翻译成执行计划(类似.java文件编译成字节码文件),数据库会根据执行计划做相应的操作,当sql语句完全一样的情况下会重用执行计划。

statement对象的使用上面已经有过案例了,下面的preparedStatement对象的一个使用demo。`

......
PreparedStatement ps = new PreparedStatement("update table set a = ? where b = ?");
ps.setLong(1,"aa");			//1表示第一个参数,aa是参数值
ps.setInt(2,10);
ps.executeUpdate();
......

通过上诉这个例子,我们还可以看出,preparedStatement对象还可以有效的防止注入攻击,因为用户输入的内容只会作为sql中的参数传入,而不会作为sql语句的一部分,因为sql语句在创建preparedStatement对象的时候已经编译了。

注入攻击:用户输入含sql成分的参数,参数在拼接sql的时候造成了sql语句的语义更改。
举个例子:select count(*) from table where passcard= ‘1’ or ‘1’ = ‘1’;用户在这里输入了1’ or ‘1’ = ‘1作为密码,结果是登录成功。
但使用peparedStatement时这里的1’ or ‘1’ = '1会作为?的参数传入,这个时候不会造成注入攻击。

4.连接池技术

当并发访问数据库时,每次与数据库交互都需要创建数据库连接,这样会造成巨大的资源浪费,会严重影响系统的性能,这个时候就需要使用数据库连接池。
所谓连接池,就是在系统初始运行的时候,主动去创建足够的数据库连接,来组成连接池,当程序中需要访问数据库时不需要重复创建连接,而是去连接池中去取,取完了之后也不关闭,而是把这个连接归还给连接池。
使用步骤:
1.初始化连接池对象:BasicDataSource ds = new BasicDataSource();
2.设置必须参数driver、url、username、password.例:ds.setUlr(url);
3.设置管理策略参数:最大连接数()、初始化连接数等。
4.取出数据库中的数据库连接:Connection conn = ds.getConnection
5.执行sql语句:Statement st = conncreateStatement();
6.处理结果
7.归还连接到连接池 conn.close();注意这个close()方法不是关闭连接!而是把连接归还到连接池
同样的,我们可以把连接池相关的一些参数信息写到*.properties文件中。

猜你喜欢

转载自blog.csdn.net/weixin_40086687/article/details/83932182