java基础->jdbc数据库操作

java基础---->jdbc数据库操作

Java数据库编程(JDBC

1JDBC简介

         JDBCJavaDataBase ConnectiveJava的数据库连接,JDBC本身提供的是一套与平台无关的数据库的操作标准。所以在整个JDBC中充斥着大量的操作接口。而且JDBC本身不是技术,而是一种服务。

         由于JDBC本身属于一个标准,所以一个数据库如果希望使用Java进行程序开发的话,那么各个数据库的生产商必须实现这些标准——提供专门的数据库的操作包。

         根据JDBC操作方式的不同,一共有以下三种常见形式:

                   · JDBC-ODBC桥连接:利用微软的ODBC技术进行操作

                            |- 操作过程:程序à JDBC à ODBCà数据库

                            |- 此方式属于Java默认支持的方式,但是由于其中间加入了ODBC端,所以性能很差

                   · JDBC连接:使用各个数据库生产商提供的数据库驱动程序

                            |- 操作过程:程序à JDBC à数据库

                            |- 由于中间缺少了ODBC环节,所以性能将有着明显的提升

                   · JDBC网络连接:通过网络协议进行数据库的连接操作

                   ·类:DriverManager

                   ·接口:ConnectionPreparedStatementStatementResultSet

2、连接数据库

         在进行数据库连接的时候需要使用以下的几个信息:

                   ·数据库的驱动程序:oracle.jdbc.driver.OracleDriver

                   ·连接地址:jdbc:oracle:thin:@localhost:1521:orcl

                   ·用户名:scott

                   ·密码:tiger

         要想连接需要使用Connection接口进行连接对象的保存,但是此接口必须依靠DriverManager类才可以完成对象的实例化操作。

import java.sql.Connection;
import java.sql.DriverManager;
public class ConnectionDemo {
	public static final String DBDRIVER = "oracle.jdbc.driver.OracleDriver";
	public static final String MysqlDBDRIVER = "com.mysql.jdbc.Driver";//mysql
	public static final String DBURL = "jdbc:oracle:thin:@localhost:1521:orcl";
public static final String MysqlDBURL = "jdbc:mysql://localhost:3306/test";//mysql
	public static final String DBUSER = "scott";
	public static final String DBPASSWORD = "tiger";
	public static void main(String[] args) throws Exception {
		Connection conn = null; // 表示的是数据库连接
		Class.forName(DBDRIVER); // 1、加载数据库驱动程序
		conn = DriverManager.getConnection(DBURL, DBUSER, DBPASSWORD); // 连接数据库
		System.out.println(conn); // 如果不为null,表示已连接
		conn.close(); // 数据库的操作必须关闭
	}
}

 

3、PreparedStatement接口实现增删改查

 

      在开发中不会使用Statement进行操作,而都使用其子接口PreparedStatement完成。

         PreparedStatement操作实际上属于预处理的操作。

         如果要创建PreparedStatement接口的对象需要依靠Connection接口中的prepareStatement()方法完成,而且必须传入一个预处理的SQL语句,所有的占位符使用“?”表示。

如果现在执行的是模糊查询,要使用LIKE语句。

 

建表:

CREATE TABLE USERINFO

ID       INTEGER NOT NULL,

 NAME     VARCHAR2(50),

 AGE      INTEGER,

 BIRTHDAYDATE)

增删改查语句:

INSERT INTO 表名称(列名称1,列名称2 VALUES (1,值2…) ;

UPDATE 表名称 SET字段=值,字段=值,.. [WHERE更新条件]

DELETE FROM 表名称 [WHERE删除条件]

         数据库的更新操作本身非常的容易,直接使用executeUpdate()语句,但是如果要是查询的话就不一样,查询使用的方法是executeQuery()方法完成,方法:public ResultSet executeQuery(String sql) throwsSQLException

         查询的时候是将所有的内容都保存在了ResultSet接口的对象之中。取得ResultSet对象之后,就可以通过next()方法往下取每一行的数据,但是需要注意的是,如果要想取出某一列的内容,则使用getXxx()的形式,其中Xxx表示的是具体的数据类型,例如:getFloat()getInt()getDate()既可以根据列名称,也可以根据列编号,从1开始

package com;

import java.sql.Connection;

import java.sql.DriverManager;

import java.sql.PreparedStatement;

import java.sql.ResultSet;

import java.util.Date;

 

publicclass Insert {

    publicstaticfinal String DBDRIVER = "oracle.jdbc.driver.OracleDriver";

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

    publicstaticfinal String DBUSER = "wangshengzhuang";

    publicstaticfinal String DBPASSWORD = "wangshengzhuang";

 

    publicstaticvoid main(String[] args) throws Exception {

       Connection conn = null;

       Class.forName(DBDRIVER);

        conn = DriverManager.getConnection(DBURL, DBUSER, DBPASSWORD);

       // 插入数据

       String insertSql = "insertinto userinfo(id,name,age,birthday) values(?,?,?,?)";

       PreparedStatement pstmt = conn.prepareStatement(insertSql);

       pstmt.setInt(1, 1);

       pstmt.setString(2, "wangshengzhuang");

       pstmt.setInt(3, 23);

       pstmt.setDate(4, new java.sql.Date(new Date().getTime()));

       Integer len = pstmt.executeUpdate();

       System.out.println("插入" + len + "行数据");

 

       // 修改数据

       String updateSql = "update  userinfo set age=24 where id=?";

       pstmt = conn.prepareStatement(updateSql);

       pstmt.setInt(1, 1);

       len = pstmt.executeUpdate();

       System.out.println("修改" + len + "行数据");

 

       // 查询数据

       String querySql = "select* from userinfo where id=?";

       pstmt = conn.prepareStatement(querySql);

       pstmt.setInt(1, 1);

       ResultSet rs = pstmt.executeQuery();

       while (rs.next()) {

           Integer id = rs.getInt(1);

           String name = rs.getString(2);

           Integer age = rs.getInt(3);

           Date date = rs.getDate(4);

           System.out.println("id-->" + id + "name-->" + name + "age-->" + age

                  + "birthday-->" + date);

 

       }

 

       // 删除数据

       String deleteSql = "deletefrom userinfo where id=?";

       pstmt = conn.prepareStatement(deleteSql);

       pstmt.setInt(1, 1);

       len = pstmt.executeUpdate();

       System.out.println("删除" + len + "行数据");

 

       rs.close();

       pstmt.close();

       conn.close(); // 数据库的操作必须关闭

 

    }

 

}

4、批处理和事务

JDBC 2.0之后增加了许多的新功能,例如:可滚动的结集、使用ResultSet更新数据库、批处理等等,   所谓的批处理就是指所有的操作可以一次性的提交到数据库之中。

         如果要使用批处理则需要使用Statement接口中的addBatch()方法。

package com;

 

import java.sql.Connection;

import java.sql.DriverManager;

import java.sql.PreparedStatement;

import java.util.Date;

 

publicclass Batch {

    publicstaticfinal String DBDRIVER = "oracle.jdbc.driver.OracleDriver";

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

    publicstaticfinal String DBUSER = "wangshengzhuang";

    publicstaticfinal String DBPASSWORD = "wangshengzhuang";

 

    publicstaticvoid main(String[] args) throws Exception {

       Connection conn = null;

       Class.forName(DBDRIVER);

       conn = DriverManager.getConnection(DBURL, DBUSER, DBPASSWORD);

       // 插入数据

       String insertSql = "insertinto userinfo(id,name,age,birthday) values(?,?,?,?)";

       PreparedStatement pstmt = conn.prepareStatement(insertSql);

 

       pstmt.setInt(1, 1);

       pstmt.setString(2, "wangshengzhuang");

       pstmt.setInt(3, 23);

       pstmt.setDate(4, new java.sql.Date(new Date().getTime()));

       pstmt.addBatch();

 

       pstmt.setInt(1, 2);

       pstmt.setString(2, "wangshengqi");

       pstmt.setInt(3, 24);

       pstmt.setDate(4, new java.sql.Date(new Date().getTime()));

       pstmt.addBatch();

 

       int score[] = pstmt.executeBatch();

       for (int i = 0; i < score.length; i++) {

           System.out.println(score[i]);

       }

 

       pstmt.close();

       conn.close(); // 数据库的操作必须关闭

 

    }

 

}

此时,一次性的会将所有的SQL语句发送到数据库之中执行,一次性更新5条记录。那么如果现在假设这5条记录都是有关联的5条。

         在使用批处理的操作中发现,如果中间有一条语句出错了,则默认情况下是将出错之前的代码进行提交,这是由于JDBC采用了自动的事务提交的方式才造成的结果。

         如果此时要进行事务处理的话,则需要按照如下的方式进行:

                  1  取消自动提交:public void setAutoCommit(booleanautoCommit) throws SQLException

                  2  执行更新操作:

                  1  如果没有错误,则提交事务:public void commit() throwsSQLException

                  4  如果有错误,则进行回滚:public void rollback() throwsSQLException

package com;

 

import java.sql.Connection;

import java.sql.DriverManager;

import java.sql.PreparedStatement;

import java.util.Date;

 

publicclass Transaction {

 

    publicstaticfinal String DBDRIVER = "oracle.jdbc.driver.OracleDriver";

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

    publicstaticfinal String DBUSER = "wangshengzhuang";

    publicstaticfinal String DBPASSWORD = "wangshengzhuang";

 

    publicstaticvoid main(String[] args) throws Exception {

       Connection conn = null;

       Class.forName(DBDRIVER);

       conn = DriverManager.getConnection(DBURL, DBUSER, DBPASSWORD);

       conn.setAutoCommit(false);

       // 插入数据

 

       String insertSql = "insertinto userinfo(id,name,age,birthday) values(?,?,?,?)";

       PreparedStatement pstmt = conn.prepareStatement(insertSql);

    

           pstmt.setInt(1, 1);

           pstmt.setString(2, "wangshengzhuang");

           pstmt.setInt(3, 23);

           pstmt.setDate(4, new java.sql.Date(new Date().getTime()));

           pstmt.executeUpdate();

 

           pstmt.setInt(1, 1);

           pstmt.setString(2, "wangshengqi");

           pstmt.setInt(3, 24);

           pstmt.setDate(4, new java.sql.Date(new Date().getTime()));

           try{

           pstmt.executeUpdate();

           conn.commit();

 

       }catch (Exception e) {

           System.out.println("回滚");

           conn.rollback();

       }

 

       pstmt.close();

       conn.close(); // 数据库的操作必须关闭

 

    }

 

}