java核心技术之JDBC (一)
2015-01-11 01:02
211 查看
JDBC
[align=justify][/align]
1.什么是JDBC
JDBC的全称是Java DataBase Connection,也就是Java数据库连接,我们可以
用它来操作关系型数据库。JDBC接口及相关类在java.sql包和javax.sql包里。我们
可以用它来连接数据库,执行SQL查询,存储过程,并处理返回的结果。
JDBC接口让Java程序和JDBC驱动实现了松耦合,使得切换不同的数据库变得更加
简单
2.jdbc使用过程
1. 注册驱动 (Driver)
2. 建立连接(创建Connection)
3. 创建执行sql语句(通常是创建Statement或者其子类)
4. 执行语句
5. 处理执行结果(在非查询语句中,该步骤是可以省略的)
6. 释放相关资源
[align=left]package com. db.jdbc ;[/align] [align=left] [/align] [align=left]import java. sql.Connection ;[/align] [align=left]import java. sql.DriverManager ;[/align] [align=left]import java. sql.ResultSet ;[/align] [align=left]import java. sql.SQLException ;[/align] [align=left]import java. sql.Statement ;[/align] [align=left]import org. junit.Test ;[/align] [align=left] [/align] [align=left]public class jdbcTest {[/align] [align=left] final String url = "jdbc:mysql://localhost:3306/test" ;[/align] [align=left] final String user = "root";[/align] [align=left] final String password = "";[/align] [align=left] ResultSet rs = null;[/align] [align=left] Statement st = null;[/align] [align=left] Connection connection = null;[/align] [align=left] @Test[/align] [align=left] public void test_jdbc(){[/align] [align=left] try {[/align] [align=left] Class .forName( "com.mysql.jdbc.Driver");//加载驱动[/align] [align=left] connection = DriverManager.getConnection( url, user, password);//获取链接[/align] [align=left] st = connection. createStatement();//创建执行[/align] rs = st. executeQuery("select * from test");//执行 [align=left] while( rs.next ()){//处理结果[/align] [align=left] System .out. println(rs .getString( "name"));[/align] [align=left] }[/align] [align=left] [/align] [align=left] } catch (Exception e) {[/align] [align=left] e .printStackTrace();[/align] [align=left] }finally {[/align] [align=left] try {[/align] [align=left] if( rs!=null){[/align] [align=left] rs.close ();[/align] [align=left] }[/align] [align=left] if( st!=null){[/align] [align=left] st.close ();[/align] [align=left] }[/align] [align=left] if( connection!=null){[/align] [align=left] connection.close ();[/align] [align=left] }[/align] [align=left] [/align] [align=left] } catch (SQLException e) {[/align] // TODO Auto-generated catch block [align=left] e .printStackTrace();[/align] [align=left] }[/align] [align=left] [/align] [align=left] }[/align] [align=left] }[/align] [align=left]}[/align] |
[align=left]
[/align]
[align=left]
[/align]
3.注册驱动的方式
Class.forName("com.mysql.jdbc.Driver"); System.setProperty("jdbc.drivers", "com.mysql.jdbc.Driver"); DriverManager .registerDriver(new Driver()); 测试代码: [align=left]@Test[/align] [align=left] public void test_register_Driver(){[/align] [align=left] try {[/align] [align=left]// Class.forName("com.mysql.jdbc.Driver");[/align] [align=left]// System.setProperty("jdbc.drivers", "com.mysql.jdbc.Driver");[/align] [align=left] DriverManager .registerDriver( new Driver());[/align] [align=left] Connection connection = DriverManager.getConnection( url, user, password);[/align] [align=left] Assert .assertEquals( false, connection.isClosed());[/align] [align=left] } catch (Exception e) {[/align] [align=left] e .printStackTrace();[/align] [align=left] }[/align] [align=left] }[/align] |
4.statement
一个statement 只能维护一个resultSet
为什么喃?
我是这样理解的,一个连接可以通过不同的操作来获取不同的结果,每一个不同的结果都有不同的statement来装,而一个statement对象对应着一个resultset结果,如果一个statement装着不同的结果,那我们以哪个为准喃?所以一个statement
只能维护一个resultSet
[align=left]@Test[/align] [align=left]public void test_statement() throws Exception{[/align] [align=left] Class .forName( "com.mysql.jdbc.Driver");[/align] [align=left] Connection connection = DriverManager.getConnection( url, user, password);[/align] [align=left] Statement st = connection.createStatement ();[/align] ResultSet rs = st.executeQuery ("select * from test"); [align=left] while( rs.next ()){[/align] [align=left] rs .close();[/align] [align=left] }[/align] ResultSet rs1 = st.executeQuery ("select * from test"); [align=left] while( rs1.next ()){[/align] [align=left] [/align] [align=left] }[/align] [align=left] [/align] [align=left] }[/align] [align=left]结果:报错[/align] |
看看statement和 PrparedStatement执行同样的查询 [align=left]@Test[/align] [align=left]public void test_statement() throws Exception{[/align] [align=left] Class .forName( "com.mysql.jdbc.Driver");[/align] [align=left] Connection connection = DriverManager.getConnection( url, user, password);[/align] [align=left] Statement st = connection.createStatement ();[/align] [align=left] String id = "1";[/align] ResultSet rs = st.executeQuery ("select * from test where id="+id ); [align=left] while( rs.next ()){[/align] [align=left] System .out. println(rs .getString( "name"));[/align] [align=left] }[/align] [align=left] [/align] [align=left] }[/align] 结果:OK @Test public void test_prestatement() throws Exception{ Class .forName( "com.mysql.jdbc.Driver"); Connection connection = DriverManager.getConnection( url, user, password); PreparedStatement ps = connection.prepareStatement( "select * from test where id=?"); ps .setString( 1, "1"); ResultSet rs = ps.executeQuery (); while( rs.next ()){ System .out. println(rs .getString( "name")); } } 结果:OK |
如果我们把id的值赋值为“or 1 or ”,上面查出来的就是全部。。
这个就是我们经常说sql注入攻击
第二个区别就是:preparedStetement 可以预编译语句,可以缓存起来,提高查询速度
下次继续写JDBC的事物,数据库隔离级别,存储过程,还有就是回答上面的那个问题,三个注入有什么区别?
相关文章推荐
- 小博老师解析Java核心技术 ——JDBC普通查询操作
- Java核心技术及面试指南 JDBC部分的面试题总结以及答案
- 小博老师解析Java核心技术 ——JDBC普通增删改操作
- 小博老师解析Java核心技术 ——JDBC数据库操作类封装
- 01500105_MLDN-魔乐科技-李兴华【Java核心技术】_JDBC连接Oracle数据库
- 小博老师解析Java核心技术 ——JDBC数据库操作类封装
- 小博老师解析Java核心技术 ——JDBC普通增删改操作
- 24.Java核心技术—JDBC
- 小博老师解析Java核心技术 ——JDBC普通查询操作
- [翻译]Java 核心技术(第7版)(2)
- 新一代Java核心技术即将出现
- JAVA2核心技术卷1 学习笔记3 对象和类
- Java 核心技术专题
- JAVA2核心技术阅读笔记(一)
- Java2核心技术第七版的学习笔记(三) Fundamental Programming Structures in Java(Java语言的基础)(四):
- JAVA2核心技术第1卷 笔记 02
- IBM:Java 核心技术专题
- ShapeTest [java核心技术2 第7章]
- Java的数据库连接编程(JDBC)技术
- Java2核心技术第七版的学习笔记(三) Fundamental Programming Structures in Java(Java语言的基础)(二)