Java JDBC下执行SQL的不同方式
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Java JDBC下执行SQL的不同方式相关的知识,希望对你有一定的参考价值。
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; } } ``` ?
以上是关于Java JDBC下执行SQL的不同方式的主要内容,如果未能解决你的问题,请参考以下文章
请问为啥我的这几行代码总报sql异常?明明在mysql下执行的很好,但到jdbc下执行就不行