Java JDBC简介
数据库驱动程序是JDBC程序和数据库之间的转换层,数据库驱动程序负责将JDBC调用映射成特定的数据库调用,使用Java JDBC API进行编程,可以为多种关系数据库提供统一访问。
jdbc的驱动通常有四种类型
JDBC-ODPC桥: 它将JDBC API映射到ODPC API。再让JDBC-ODPC调用数据库本地驱动代码(也就是数据库厂商提供的数据库操作二进制代码库,例如Oracle中的oci.dll)
本地API驱动 直接将JDBC API映射成数据库特定的客户端API,即通过客户端加载数据库厂商提供的本地代码库(
网络协议驱动 这种类型的驱动给客户端提供了一个网络API,客户端上的JDBC驱动程序使用套接字(Socket)来调用服务器上的中间件程序,后者在将其请求转化为所需的具体API调用。
本地协议驱动 这种类型的驱动使用Socket,直接在客户端和数据库间通信。它是一种直接与数据库实例交互的JDBC 这种驱动是智能的,它知道数据库使用的底层协议,也是目前最主流使用的JDBC驱动。
JDBC编程(连接数据库)步骤
1.加载数据库驱动
使用Class类的forName()静态方法来加载驱动(由各个数据库厂商自己实现)
对于oracle数据库而言数据库驱动类对应的字符串:oracle.jdbc.driver.OracleDriver
Class.forName("oracle.jdbc.driver.OracleDriver");
对于mysql数据库而言数据库驱动类对应的字符串:com.mysql.jdbc.Driver
Class.forName("com.mysql.jdbc.Driver");
2.获取Connection对象
DriverManager类提供getConnection(String url, String user, String pass);
url: 数据库连接字符串
user: 用户名
pass: 密码
Mysql:
url: jdbc:mysql://hostname:port/databasename
oracle
url: jdbc:oracle:thin:@hostname:port:databasename
3.通过Connection对象创建Statement对象
Connection创建Statement对象的常用方法有如下2个
createStatement(String sql):创建基本的Statement对象
prepareStatement(String sql): 根据传入的SQL语句创建预编译的Statement对象
4.使用Statement执行SQL语句
execute(): 可以执行任何SQL语句,但比较麻烦
executeUpdate(): 主要用于执行DML和DDL语句。执行DML语句返回受SQL影响的行数,执行DDL语句返回
executeQuery(): 只能执行查询语句,执行后返回代表查询结果的ResultSet对象,该对象里保存了SQL语句查询的结果。程序可以通过操作该ResultSet对象来取出查询结果。
ResultSet对象主要提供了如 下方法
移动记录指针的方法
next()
previous()
first()
last()
获取指针指向的某行的"特定的列值"
getInt()
getString()
getObject()
...
该方法既可以使用列索引作为参数,也可以使用列名作为参数
5.回收数据库资源 包括关闭ResultSet、Statement、Connection等资源
下面以oracle为理,写一个jdbc增加删除修改的工具类
连接数据库的工具类
```
`package net.wanhe.util;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.Properties;
/**
- 数据的连接以及关闭
-
- @author Administrator
*
*/
public class JDBCUtil {
private static String driverName;
private static String url;
private static String user;
private static String password;
/**
- 静态初始化,初始化一次
*/
static {
try {
Properties p = new Properties();
// 配置文件放置在工程的下面
p.load(new FileInputStream("jdbc.properties"));
```
driverName = p.getProperty("driverName");
url = p.getProperty("url");
user = p.getProperty("user");
password = p.getProperty("password");
// 加载驱动
Class.forName(driverName);
```
} catch (FileNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (ClassNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
/**
- 获取数据库的连接对象(Connection对象)
*/
public static Connection getConnection(){
Connection conn=null;
try {
conn=DriverManager.getConnection(url, user, password);
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return conn;
}
/**
- 关闭数据库
*/
public static void close(Connection conn,PreparedStatement ps,ResultSet rs){
try {
if(rs!=null){
rs.close();
}
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
try {
if(ps!=null){
ps.close();
}
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
try {
if(conn!=null){
conn.close();
}
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}`
```
映射的接口
```
`package net.wanhe.jdbc;
import java.sql.ResultSet;
public interface RowMapper<T> {
/**
* 数据库中表的一条数据对应的一个对象
*/
T rowMapper(ResultSet rs);
}`
```
BaseDao的工具类
```
package net.wanhe.jdbc;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.ResultSetMetaData;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;
import org.apache.commons.beanutils.BeanUtils;
public class BaseDao<T> {
Class clazz;
/**
* 获取泛型信息
*/
public BaseDao(){
try {
clazz=ReflectionUtil.getGenericSuper(this.getClass());
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
/**
* 增加,删除,修改
*/
public void update(String sql,Object...parameterValues){
//建立连接
Connection conn=JDBCUtil.getConnection();
PreparedStatement ps=null;
try {
//获取预处理对象
ps=conn.prepareStatement(sql);
//给占位符赋值
setParameters(ps, parameterValues);
//执行sql语句
ps.executeUpdate();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}finally{
JDBCUtil.close(conn, ps,null);
}
}
/**
- 给占位符赋值
- @param ps
- @param parameterValues
- @throws SQLException
*/
private void setParameters(PreparedStatement ps, Object... parameterValues) throws SQLException {
for(int i=0;i<parameterValues.length;i++){
ps.setObject(i+1, parameterValues[i]);
}
}
/**
- 增加,返回自增长的值
- @param sql
- @param parameterValues
- @return
*/
public int insert(String sql,Object...parameterValues){
//建立连接
Connection conn=JDBCUtil.getConnection();
PreparedStatement ps=null;
ResultSet rs=null;
int pk=0;
try {
//获取预处理对象
ps=conn.prepareStatement(sql,new String[]{"id"});
//给占位符赋值
setParameters(ps, parameterValues);
//执行sql语句
ps.executeUpdate();
rs=ps.getGeneratedKeys();
if(rs.next()){
pk=rs.getInt(1);
}
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}finally{
JDBCUtil.close(conn, ps,null);
}
return pk;
}
/**
- 查询
- @param sql
- @return
*/
public List<T> query(String sql,RowMapper rm,Object...parameterValues){
List<T> list=new ArrayList<T>();
Connection conn=null;
PreparedStatement ps=null;
ResultSet rs=null;
try {
conn=JDBCUtil.getConnection();
ps=conn.prepareStatement(sql);
setParameters(ps, parameterValues);
rs=ps.executeQuery();
while(rs.next()){
T t=(T) rm.rowMapper(rs);
list.add(t);
}
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}finally{
JDBCUtil.close(conn, ps, rs);
}
return list;
}
}
```
©著作权归作者所有:来自51CTO博客作者万和IT教育的原创作品,如需转载,请注明出处,否则将追究法律责任