数据库驱动程序是JDBC程序和数据库之间的转换层,数据库驱动程序负责将JDBC调用映射成特定的数据库调用,使用Java JDBC API进行编程,能够为多种关系数据库提供统一访问。java
jdbc的驱动一般有四种类型mysql
JDBC-ODPC桥: 它将JDBC API映射到ODPC API。再让JDBC-ODPC调用数据库本地驱动代码(也就是数据库厂商提供的数据库操做二进制代码库,例如Oracle中的oci.dll) sql
本地API驱动 直接将JDBC API映射成数据库特定的客户端API,即经过客户端加载数据库厂商提供的本地代码库(数据库
网络协议驱动 这种类型的驱动给客户端提供了一个网络API,客户端上的JDBC驱动程序使用套接字(Socket)来调用服务器上的中间件程序,后者在将其请求转化为所需的具体API调用。 apache
本地协议驱动 这种类型的驱动使用Socket,直接在客户端和数据库间通讯。它是一种直接与数据库实例交互的JDBC 这种驱动是智能的,它知道数据库使用的底层协议,也是目前最主流使用的JDBC驱动。
编程
1.加载数据库驱动 服务器
使用Class类的forName()静态方法来加载驱动(由各个数据库厂商本身实现) 网络
对于oracle数据库而言数据库驱动类对应的字符串:oracle.jdbc.driver.OracleDriveroracle
Class.forName("oracle.jdbc.driver.OracleDriver");
app
对于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等资源
链接数据库的工具类
``` `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; } } ```