现在的位置: 首页 > 综合 > 正文

jdbc详解(增删改查、事务、存储过程)

2017年10月06日 ⁄ 综合 ⁄ 共 8436字 ⁄ 字号 评论关闭

jdbc详解(增删改查、事务、存储过程)

一、JDBC是什么?

JDBC全称java data base connectivity.相当于微软的ODBC(Open Database Connectivity),简单来说就是一组java
api
,实现了java和各种数据库的连接。现在持久层的各种框架MyBatis, Hibernate等等,其实就是对jdbc的封装。我们在开发过程中,不能只知道简单的调用MyBatis,
Hibernate
帮我们封装的方法来与数据库打交道,我们需要知道更底层到底是怎么实现的,Jdbc的各种接口包含在java.sqljavax.sql包中,其中java.sql属于JavaSEjavax.sql属于JavaEE主要包含以下类和接口:

DriverManager:这个是一个实现类,它是一个工厂类,用来生产Driver对象的

这个类的结构设计模式为工厂方法

Driver:这是驱动程序对象的接口,它指向一个实实在在的数据库驱动程序对象,那么这个数据库驱动程序对象是从哪里来的呢?

DriverManager工厂中有个方法:getDriver(String URL),通过这个方法可以得到驱动程序对象,这个方法是在各个数据库厂商按JDBC规范设计的数据库驱动程序包里的类中静态实现的,也就是在静态块中

Connection:这个接口可以指向一个数据库连接对象,那么如何得到这个连接对象呢?

是通过DriverManager工厂中的getConnection(String URL)方法得到的

Statement:用于执行静态的SQL语句的接口,通过Connection中的createStatement方法得到的

Resultset:用于指向结果集对象的接口,结果集对象是通过Statement中的execute等方法得到的

二、JDBC连接各种数据库方法

 1Oracle8/8i/9i数据库(thin模式)

 

    Class.forName("oracle.jdbc.driver.OracleDriver").newInstance();

    String url="jdbc:oracle:thin:@localhost:1521:orcl";

    //orcl为数据库的SID

    String user="test";

    String password="test";

    Connection conn= DriverManager.getConnection(url,user,password);

 

 2DB2数据库

 

    Class.forName("com.ibm.db2.jdbc.app.DB2Driver ").newInstance();

    String url="jdbc:db2://localhost:5000/sample";

    //sample为你的数据库名

    String user="admin";

    String password="";

    Connection conn= DriverManager.getConnection(url,user,password);

 

  3Sql Server7.0/2000数据库

 

    Class.forName("com.microsoft.jdbc.sqlserver.SQLServerDriver").newInstance();

    String url="jdbc:microsoft:sqlserver://localhost:1433;DatabaseName=mydb";

    //mydb为数据库

    String user="sa";

    String password="";

    Connection conn= DriverManager.getConnection(url,user,password);

 

  4Sybase数据库

 

    Class.forName("com.sybase.jdbc.SybDriver").newInstance();

    String url =" jdbc:sybase:Tds:localhost:5007/myDB";

    //myDB为你的数据库名

    Properties sysProps = System.getProperties();

    SysProps.put("user","userid");

    SysProps.put("password","user_password");

    Connection conn= DriverManager.getConnection(url, SysProps);

 

  5Informix数据库

 

    Class.forName("com.informix.jdbc.IfxDriver").newInstance();

    String url =

    "jdbc:informix-sqli://123.45.67.89:1533/myDB:INFORMIXSERVER=myserver;

    user=testuser;password=testpassword";

    //myDB为数据库名

    Connection conn= DriverManager.getConnection(url);

 

  6MySQL数据库

 

    Class.forName("org.gjt.mm.mysql.Driver").newInstance();

    String url ="jdbc:mysql://localhost/myDB?user=soft&password=soft1234&useUnicod

    e=true&characterEncoding=8859_1"

    //myDB为数据库名

    Connection conn= DriverManager.getConnection(url);

 

  7PostgreSQL数据库

 

    Class.forName("org.postgresql.Driver").newInstance();

    String url ="jdbc:postgresql://localhost/myDB"

    //myDB为数据库名

    String user="myuser";

    String password="mypassword";

    Connection conn= DriverManager.getConnection(url,user,password);

 

三、实验:对用户表tb_users实现增删改查、使用存储过程、事务

 

package com.figo.onlinemarket.test;

import java.sql.CallableStatement;

import java.sql.Connection;

import java.sql.DriverManager;

import java.sql.PreparedStatement;

import java.sql.ResultSet;

import java.sql.SQLException;

import java.sql.Statement;

 

/**

 * @author zhuzhifei 20130222

 * jdbc增删改查、存储过程、事务操作

 */

public class JdbcTest {

 

         /**

          * @param args

          */

         public static void main(String[] args) {

                   // TODO Auto-generated method stub

                   jdbcExample();

         }

    private static void jdbcExample()

    {

             Connection con=null;

             try {

                            //加载oracle驱动

                       Class.forName("oracle.jdbc.driver.OracleDriver");

                            String url="jdbc:oracle:thin:@10.132.81.134:1521:dsdb1";

                     

                            try {

                                     //建立数据库连接相当于.netSqlConnection

                                     con=DriverManager.getConnection(url,"mpos","mpos");

                                     //设置是否自动提交事务

                                     con.setAutoCommit(false); //这个非常重要,否则事务回滚不起作用

                                     //设置隔离级别,不允许脏读

                                     con.setTransactionIsolation(Connection.TRANSACTION_READ_COMMITTED);

                                //相当于.netSqlCommond,用于执行sql

                                     Statement stmt=con.createStatement();

                                     //

                                     String sqlInsert="insert into tb_users(userId,name,password,address) values(SEQ_TB_USERS.nextval,'test','test','shanghai china')";

                                     stmt.execute(sqlInsert);

                                    

                                     //

                                     String sqlUpdate="update tb_users set address='sh' where name='test'";

                                     stmt.executeUpdate(sqlUpdate);

                                    

                                     //

                                     String sqlDelete="delete from tb_users where name='test'";

                                     stmt.execute(sqlDelete);

                                    

                                     //查:相当于.netDataTable,返回的是一张数据表

                                     String sqlSelect="select * from tb_users";

                                ResultSet resultSet=stmt.executeQuery(sqlSelect);

                                //输出表中的内容

                                while(resultSet.next())

                                {

                                         System.out.println(resultSet.getLong(1));

                                         System.out.println(resultSet.getString(2));

                                         System.out.println(resultSet.getString(3));

                                }

                               

                                     //增也可以使用PreparedStatement继承至Statement,可以传参

                                     String sqlPrepare="insert into tb_users(userId,name,password,address) values(?,?,?,?)";

                                     PreparedStatement ps=con.prepareStatement(sqlPrepare);

                                     ps.setLong(1, 6);

                                     ps.setString(2, "daniel");

                                     ps.setString(3, "123456");

                                     ps.setString(4, "New York");

                                     ps.executeUpdate();

                                    

                                //使用存储过程CallableStatement继承至Statement

                                String sqlCall="{call p_insertUser(?,?,?,?,?,?,?,?,?)}";

                                CallableStatement cs=con.prepareCall(sqlCall);

                                //给参数赋值

                                cs.setString(1, "test1");

                                cs.setString(2, "test2");

                                cs.setString(3, "test3");

                                cs.setString(4, "test4");

                                cs.setString(5, "test5");

                                cs.setString(6, "test6");

                                cs.setString(7, "test7");

                                cs.setString(8, "test8");

                                cs.setString(9, "test9");

                                cs.execute();

                               

                                //提交事务

                                con.commit();

                                //关闭连接

                                stmt.close();

                                con.close();

                                ps.close();

                                cs.close();

                            } catch (SQLException e) {

                                     // TODO Auto-generated catch block

                                     e.printStackTrace();

                                     if(con!=null)

                                     {

                                               try {

                                                        //回滚事务

                                                        con.rollback();

                                               } catch (SQLException e1) {

                                                        // TODO Auto-generated catch block

                                                        e1.printStackTrace();

                                               }

                                     }

                                    

                            }

                   } catch (ClassNotFoundException e) {

                            // TODO Auto-generated catch block

                            e.printStackTrace();

                   }

    }

}

 

注意:可能会出现这个错误:

java.lang.ClassNotFoundException: oracle.jdbc.driver.OracleDriver

这是因为没有提交驱动程序的类库,添加方法:项目右键PropertiesàJava Build PathàLibrariesàAdd External
JARS
à你本机oracle安装位置

F:\oracle\product\10.2.0\db_1\jdbc\lib\ojdbc14.jar,添加好就OK

抱歉!评论已关闭.