java核心技术之JDBC (一)
来源:互联网 发布:java开发年终总结范文 编辑:程序博客网 时间:2024/06/06 05:53
JDBC
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. 释放相关资源
package com. db.jdbc ;
import java. sql.Connection ;
import java. sql.DriverManager ;
import java. sql.ResultSet ;
import java. sql.SQLException ;
import java. sql.Statement ;
import org. junit.Test ;
public class jdbcTest {
final String url = "jdbc:mysql://localhost:3306/test" ;
final String user = "root";
final String password = "";
ResultSet rs = null;
Statement st = null;
Connection connection = null;
@Test
public void test_jdbc(){
try {
Class .forName( "com.mysql.jdbc.Driver");//加载驱动
connection = DriverManager.getConnection( url, user, password);//获取链接
st = connection. createStatement();//创建执行
rs = st. executeQuery("select * from test");//执行
while( rs.next ()){//处理结果
System .out. println(rs .getString( "name"));
}
} catch (Exception e) {
e .printStackTrace();
}finally {
try {
if( rs!=null){
rs.close ();
}
if( st!=null){
st.close ();
}
if( connection!=null){
connection.close ();
}
} catch (SQLException e) {
// TODO Auto-generated catch block
e .printStackTrace();
}
}
}
}
3.注册驱动的方式
- Class.forName("com.mysql.jdbc.Driver");
- System.setProperty("jdbc.drivers", "com.mysql.jdbc.Driver");
- DriverManager .registerDriver(new Driver());
测试代码:
@Test
public void test_register_Driver(){
try {
// Class.forName("com.mysql.jdbc.Driver");
// System.setProperty("jdbc.drivers", "com.mysql.jdbc.Driver");
DriverManager .registerDriver( new Driver());
Connection connection = DriverManager.getConnection( url, user, password);
Assert .assertEquals( false, connection.isClosed());
} catch (Exception e) {
e .printStackTrace();
}
}
这三个注册驱动的方式有什么不同喃?
4.statement
一个statement 只能维护一个resultSet
为什么喃?
我是这样理解的,一个连接可以通过不同的操作来获取不同的结果,每一个不同的结果都有不同的statement来装,而一个statement对象对应着一个resultset结果,如果一个statement装着不同的结果,那我们以哪个为准喃?所以一个statement 只能维护一个resultSet
@Test
public void test_statement() throws Exception{
Class .forName( "com.mysql.jdbc.Driver");
Connection connection = DriverManager.getConnection( url, user, password);
Statement st = connection.createStatement ();
ResultSet rs = st.executeQuery ("select * from test");
while( rs.next ()){
rs .close();
}
ResultSet rs1 = st.executeQuery ("select * from test");
while( rs1.next ()){
}
}
结果:报错
5.Statement和PrparedStatement的区别?
看看statement和 PrparedStatement执行同样的查询
@Test
public void test_statement() throws Exception{
Class .forName( "com.mysql.jdbc.Driver");
Connection connection = DriverManager.getConnection( url, user, password);
Statement st = connection.createStatement ();
String id = "1";
ResultSet rs = st.executeQuery ("select * from test where id="+id );
while( rs.next ()){
System .out. println(rs .getString( "name"));
}
}
结果: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
结果都是OK,到底有什么区别喃?
如果我们把id的值赋值为“or 1 or ”,上面查出来的就是全部。。
这个就是我们经常说sql注入攻击
第二个区别就是:preparedStetement 可以预编译语句,可以缓存起来,提高查询速度
下次继续写JDBC的事物,数据库隔离级别,存储过程,还有就是回答上面的那个问题,三个注入有什么区别?
1 0
- java核心技术之JDBC (一)
- 《Java核心技术》学习之路(一)
- java核心技术 之基础知识(一)
- JDBC核心技术之(二)事物
- java核心技术之基本程序设计结构(一)
- 小博老师解析Java核心技术 ——JDBC参数化查询(一)
- Java核心技术(多线程)一
- 《Java核心技术》读书笔记(一)
- Spring核心技术之JDBC支持
- Java核心技术(高级Swing)一列表
- Java核心技术 卷I 手记(一)
- java核心技术学习笔记(一)
- java基础的核心技术:多线程(一)
- Java核心技术卷一(1)
- Java核心技术卷一(2)
- Java核心技术卷一(五)
- Java核心技术卷一(四)
- Java多线程编程核心技术学习(一)
- 安卓逆向学习笔记(0)- HelloWorld.apk的文件结构
- 蓝桥杯试题 算法训练 安慰奶牛
- Activiti学习入门(1) -- 创建Activiti的23张表
- eXtremeDB JNI 的Connection
- 过滤器、监听器、拦截器的区别
- java核心技术之JDBC (一)
- elipse中配置jadclipe之后无法双击编译
- Servlet和JSP规范及版本对应关系
- unity之练习题
- 移动前端不得不了解的html5 head 头标签
- shell字符串总结
- 完整类实现:构造,析构,遍历二叉树
- 关于在MyEclipse中查看SVN服务器上的历史版本文件内容乱码的问题
- Activity的四种启动模式