一.JDBC简介
1.数据访问技术
2.JDBC和ODBC
Jdbc:是用于执行sql语句的java API。由java语言编写的类和接口组成。
ODBC:ODBC (Open DataBase Connectivity): 依赖微软os平台,导致Java的平台无关性技术特性和面向对象编程的特性都丧失、同时对数据库系统的访问效率也比较低——不能满足企业级大数据量的访问要求
3.两者之间关系
都是用来连接数据库的启动程序,jdbc与odbc由于具有数据独立性甚至平台无关性,因此对Internet对数据的操作提供了很好的操作
4.JDBC体系结构
5.JDBC驱动器
1.JDBC-ODBC桥:是把所有 JDBC的调用传递给ODBC ,再由ODBC调用本地数据库驱动代码.
2.本地API驱动:本地API驱动直接把JDBC调用转变为数据库的标准调用再去访问数据库.
3.网络协议驱动:JDBC先把对数局库的访问请求传递给网 络上的中间件服务器.中间件服务器------------数据库Server
4.本地协议驱动:本地协议驱动---------数据库Server
JDBC访问数据库过程
1.加载驱动
public JDBCTools() {
//加载驱动类
try {
Class.forName(“com.mysql.jdbc.Driver”);
} catch (ClassNotFoundException e) {e.printStackTrace();
}
}
2.加载链接
public Connection getConnection() throws SQLException {
//url jdbc:mysql://localhost:3306/+javaee_day06
//三个参数(url,user,password)
conn=DriverManager.getConnection(
“jdbc:mysql://localhost:3306/javaee_day06”,
“root”,
“123”);
return conn;
}
3.执行sql语句
A.第一种写法
JDBCTools tools = new JDBCTools();
String name = “Alice”;
Connection conn = tools.getConnection();
String sql = “select *from user where userName=?”;
// PreparedStatement 更安全
PreparedStatement ps = conn.prepareStatement(sql);
//参数的相关设置写法
ps.setString(1, “Alice”);// 第一个?的值是Bob
// ps.setString(2, “Bob”);//第二个?的值是Bob
// ps.setObject(, x);//最简单的写法
B.第二种写法
JDBCTools tools = new JDBCTools();
Connection conn = tools.getConnection();
Statement statement = conn.createStatement();
// 1.执行查询,结果集类型就是resultSet不安全
ResultSet rs = statement.executeQuery(“select *from user where userName=”+name);
4.返回结果集且循环结果,同时关闭驱动
A.
while (rs.next()) {
// 1.以几列获取
rs.getInt(1);
// 2. 以列名获取
rs.getInt(“userid”);
rs.getString(“userName”);
System.out.println(rs.getObject(“userid”) + “\t” + rs.getObject(2) + “\t” + rs.getObject(3) + “\t”+ rs.getObject(4) + “\t” + rs.getObject(5) + “\t”);
}
// 倒着关闭
rs.close();//关闭ResultSet对象
statement.close();//关闭Statement对象
conn.close();//关闭 Connection 对象
B. 用元数据来查询结果System.out.println("----------------------------------");
String sql3=“select *from user”;
ResultSet rs3=tools.executeQuery(sql3);
/ /对元数据的操作
ResultSetMetaData resultSetMetaData=rs3.getMetaData();//获取元数据
System.out.println(“总列数:”+resultSetMetaData.getColumnCount());
System.out.println(“第一名:”+resultSetMetaData.getColumnTypeName(1));
for(int i=1;i<=resultSetMetaData.getColumnCount();++i) {
System.out.print(“列名:”+resultSetMetaData.getColumnName(i)+"\t");
}
System.out.println();
while(rs3.next()) {
System.out.println(“数据:”+rs3.getObject(“userid”)+"\t");
}
C.通过元数据来取值
ResultSetMetaData resultSetMetaData=rs3.getMetaData();//获取元数据
//获取列名
String namee=resultSetMetaData.getColumnName(1);
while(rs3.next()) {
System.out.print(“列名值:”+rs3.getString(namee));
}
注意:
//1.执行查询的时候
ResultSet rs = ps.executeQuery();
// 2.执行 增删改
statement.executeUpdate(sql);
//3.执行查询和增删改
execute:
总结:
1.工具类:
package cn.goketech.jdbc;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
public class JDBCTools {
private Connection conn;
private PreparedStatement ps;
private ResultSet rs;
public JDBCTools() {
//加载驱动类
try {
Class.forName(“com.mysql.jdbc.Driver”);
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
}
//二.应用层
/**
* 1.获取链接
* @return
* @throws SQLException
/
public Connection getConnection() throws SQLException {
//url jdbc:mysql://localhost:3306/+javaee_day06
//三个参数(url,user,password)
conn=DriverManager.getConnection(
“jdbc:mysql://localhost:3306/javaee_day06”,
“root”,
“123”);
return conn;
}
/*
* 执行查询方法
* @param sql
* @return
*
* …表示可变参数
*/
public ResultSet executeQuery(String sql,Object …obj) {
try {
//1.产生链接
conn=getConnection();
//2.用链接产生prepareStatement
ps=conn.prepareStatement(sql);
//3.设置参数(?)
for(int i=0;i<obj.length;++i) {
ps.setObject(i+1, obj[i]);
}
//4.执行查询
rs=ps.executeQuery();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return rs;
}
/**
* 执行增删改
* @param sql1
* @param obj
* @return
*/
public int executeUpdate(String sql1,Object... obj) {
int count=0;
try {
conn=getConnection();
ps=conn.prepareStatement(sql1);
for(int i=0;i<obj.length;++i) {
ps.setObject(i+1, obj[i]);
}
count =ps.executeUpdate();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return count;
}
public int executeUpdate2(String sql2,Object... obj) {
int count=0;
try {
conn=getConnection();
ps=conn.prepareStatement(sql2);
for(int i=0;i<obj.length;++i) {
ps.setObject(i+1, obj[i]);
}
count =ps.executeUpdate();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return count;
}
/**
* 关闭连接
*/
public void close() {
try {
rs.close();
ps.close();
conn.close();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
2.测试工具类
package cn.goketech.test;
import java.sql.ResultSet;
import java.sql.ResultSetMetaData;
import java.sql.SQLException;
import cn.goketech.jdbc.JDBCTools;
public class TestTools {
public static void main(String[] args) {
// TODO Auto-generated method stub
JDBCTools tools=new JDBCTools();
String sql=“select *from user “;
ResultSet rs=tools.executeQuery(sql);
try {
while(rs.next()) {
// 1.以几列获取
rs.getInt(1);
// 2. 以列名获取
rs.getInt(“userid”);
rs.getString(“userName”);
System.out.println(rs.getObject(“userid”) + “\t” + rs.getObject(2) + “\t” + rs.getObject(3) + “\t”
+rs.getObject(4) + “\t” + rs.getObject(5) + “\t”);
}
tools.close();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
// System.out.println(”----------------------------------”);
// String sql1=“insert into user(userName,sex,age,phoneNumber) values(?,?,?,?)”;
// int count =tools.executeUpdate(sql1,“Clover”,“女”,18,“456”);
//
// System.out.println(“count=”+count);
System.out.println("----------------------------------");
String sql2="delete from user where userid=?";
int count2 =tools.executeUpdate(sql2,1002);
System.out.println("count2="+count2);
System.out.println("----------------------------------");
String sql3="select *from user";
ResultSet rs3=tools.executeQuery(sql3);
//对元数据的操作
try {
ResultSetMetaData resultSetMetaData=rs3.getMetaData();//获取元数据
System.out.println("总列数:"+resultSetMetaData.getColumnCount());
System.out.println("第一列名类型:"+resultSetMetaData.getColumnTypeName(1));
String namee=resultSetMetaData.getColumnName(1);
for(int i=1;i<=resultSetMetaData.getColumnCount();++i) {
System.out.print("列名:"+resultSetMetaData.getColumnName(i)+"\t");
}
System.out.println();
while(rs3.next()) {
System.out.print("列名值:"+rs3.getString(namee));
System.out.println("数据:"+rs3.getObject("userid")+"\t");
}
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
3.测试工具类
package cn.goketech.test;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import cn.goketech.jdbc.JDBCTools;
public class Test {
public static void main(String[] args) {
// TODO Auto-generated method stub
JDBCTools tools = new JDBCTools();
String name = “Alice”;
try {
Connection conn = tools.getConnection();
Statement statement = conn.createStatement();
String sql = “select *from user where userName=?”;
// PreparedStatement 更安全
PreparedStatement ps = conn.prepareStatement(sql);
ps.setString(1, “Alice”);// 第一个?的值是Bob
// ps.setString(2, “Bob”);//第二个?的值是Bob
// ps.setObject(, x);//最简单的写法
// 1.执行查询,结果集类型就是resultSet不安全
// ResultSet rs = statement.executeQuery(“select *from user where
// userName=”+name);
ResultSet rs = ps.executeQuery();
while (rs.next()) {
// 1.以几列获取
rs.getInt(1);
// 2. 以列名获取
rs.getInt(“userid”);
rs.getString(“userName”);
System.out.println(rs.getObject(“userid”) + “\t” + rs.getObject(2) + “\t” + rs.getObject(3) + “\t”
+ rs.getObject(4) + “\t” + rs.getObject(5) + “\t”);
}
// 倒着关闭
rs.close();
statement.close();
conn.close();
// 2.执行 增删改
// statement.executeUpdate(sql);
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
总结:
/**
- 一. 驱动层
- 1.加载驱动
- 二.应用层
- 1.链接 Connection
- 2.操作接口Statement
- 3.结果集 ResultSe
- 4.关闭操作
*/
}