mysql+jdbc

<一>  使用JDBC连接数据库

JDBC是由java编程语言编写的类及接口组成,同时它为程序开发人员提供了一组用于实现对数据库访问的JDBC API,并支持SQL语言。利用JDBC可以将JAVA代码连接到oracle、DB2、SQLServer、MYSQL等数据库,从而实现对数据库中的数据操作的目的。

《1》JDBC简介

JDBC全称为:Java Data Base Connectivity (java数据库连接),可以为多种数据库提供填统一的访问。JDBC是sun开发的一套数据库访问编程接口,是一种SQL级的API。它是由java语言编写完成,所以具有很好的跨平台特性,使用JDBC编写的数据库应用程序可以在任何支持java的平台上运行,而不必在不同的平台上编写不同的应用程序。

    JDBC的主要功能如下:

      (1)建立与数据库或者其他数据源的链接

        (2)向数据库发送SQL命令

      (3)处理数据库的返回结果

《2》JDBC中常用类和接口

            连接到数据库(Connection)、建立操作指令(Statement)、执行查询指令(executeQuery)、获得查询结果(ResultSet)等。

          1、驱动程序管理类(DriverManager)

             DriverManager类是JDBC的管理类,作用于用户和驱动程序之间。它跟踪在可用的驱动程序,并在数据库和相应驱动程序之间建立连接。另外,DriverManager类也处理诸如驱动程序登陆时间限制及登录和跟踪消息的显示事务。对于简单的应用程序,一般程序员需要在此类中直接使用唯一的方法时DriverManager.getConnection()。该方法将建立与数据库的链接。JDBC允许用户调用DriverManager的方法getDriver()、getDrivers()和registerDriver()及Driver的方法connect().

           2、声明类(Statement)

            Statement对象用于将SQL语句发送到数据库中。实际上有三种Statement对象,它们都作为在给定链接上执行SQL语句的包容器:Statement、PreparedStatement(它从Statement继承而来)和CallableStatement(它从PreparedStatement继承而来)。它们都专用于发送特定类型的SQL语句:

          (1)Statement对象用于执行不带参数的简单的SQL语句;Statement接口提供了执行语句和获取结果的基本方法。

          (2)PerparedStatement对象用于执行带或不带IN参数的预编译SQL语句;PeraredStatement接口添加处理IN参数的方法;

          (3)CallableStatement对象用于执行对数据库已存储过程的调用;CallableStatement添加处理OUT参数的方法。

             Statement提供了许多方法,最常用的方法如下:

              (1)execute()方法:运行语句,返回是否有结果集。

              (2)executeQuery()方法:运行查询语句,返回ReaultSet对象。

              (3)executeUpdata()方法:运行更新操作,返回更新的行数。

              (4)addBatch()方法:增加批处理语句。

              (5)executeBatch()方法:执行批处理语句。

               (6)clearBatch()方法:清除批处理语句。

   《3》数据库连接类 (Connection)

       Connection对象代表与数据库的链接。连接过程包括所执行的SQL语句和在该连接上所返回的结果。一个应用程序可与单个数据库有一个或多个连接,或者可与很多数据库有连接。打开连接与数据库建立连接的标准方法是调用DriverManager.getConnection()方法。

    String url="jdbc:mysql://127.0.0.1:3306/jdbc_test";

    String user="root";

    String password="123456";

    DriverManager.getConnection(url,user,password);

   《4》 结果集合类 (ResultSet)

     ResultSet包含符合SQL语句中条件的所有行记录,并且它通过一套get方法(这些get方法可以访问当前行中的不同列)提供了对这些行中数据的访问。ResultSet.next()方法用于移动到ResultSet中的下一行,使下一行成为当前行。

 《5》JDBC编程步骤

  (1)加载驱动程序:Class.forName(driverClass)

    加载mysql驱动:Class.forName("com.mysql.jdbc.Driver");

    加载oracle驱动:Class.forName("oracle.jdbc.driver.OracleDriver");

  (2)获得数据库连接

  DriverManager.getConnection("jdbc:mysql://127.0.0.1:3306/jdbc_test",user,password);

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

  (3)创建Statement对象:conn.createStatement();

  (4)向数据库发送SQL命令

  (5)处理数据库的返回结果(ResultSet类)

  (6) 关闭连接

  实例如下:

数据库:

CREATE DATABASE jdbc_test;
DROP TABLE IF EXISTS USER;

CREATE TABLE USER(
	id INT(4)  NOT NULL PRIMARY KEY AUTO_INCREMENT,
	username VARCHAR(20) NOT NULL,
	PASSWORD VARCHAR(20) NOT NULL ,
	gender CHAR(2),
	phone CHAR(11),
	description VARCHAR(50)
	
);

INSERT INTO USER (username,PASSWORD,gender,phone )VALUES('zhang','zhang123','男','12345678910');

INSERT INTO USER (username,PASSWORD,gender,phone )VALUES('lisi','lisi123','男','13551258273');

  

package com.rl.login;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.Statement;

import com.mysql.jdbc.PreparedStatement;

public class Login {
	public static void main(String[] args) {
		String url="jdbc:mysql://localhost:3306/jdbc_test";
	  	String user ="root";
	  	String password="123456";
	  	Connection conn=null;
	  	Statement st=null;
	  	PreparedStatement pst=null;
	  	ResultSet rs=null;
		try {
			/*1  加载数据库驱动*/
			Class.forName("com.mysql.jdbc.Driver");//夹包中的Driver类的全路径
			/*建立连接*/
			conn=DriverManager.getConnection(url, user, password);
			/*创间statement或preparestatement对象*/
			
			/*方式一 用statement*/
			st=conn.createStatement();
			/*通过数据库的连接操作数据库,实现增删改查(使用Statement类)*/
			String sql="select * from user where username='zhang'";
			rs=st.executeQuery(sql);
			/**/
			while(rs.next()){
				System.out.println(rs.getString("username")+rs.getString("password"));
			}
			/*方式二 用preparestatement*/
			/*通过数据库的连接操作数据库,实现增删改查(使用Statement类)*/
			  String s=""+"insert into user(username,password) values(?,123)";
			  pst=(PreparedStatement) conn.prepareStatement(s);
			        
	          pst.setString(1, "xiaoshuai1");
	          pst.execute();
			
			
			
			 //关闭资源   逆序关闭
			if(rs!=null){
				rs.close();
			}
			if(st!=null){
				st.close();
			}
			if(pst!=null){
				pst.close();
			}
			 if(conn!=null){
				 conn.close(); 
			 }
	            
		       
		} catch (Exception e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}
}

  使用preparestatement实现带参数的增,删,改。查

  增加:

		  String s=""+"insert into user(username,password) values(?,123)";
		  pst=(PreparedStatement) conn.prepareStatement(s);
			        
	          pst.setString(1, "xiaoshuai1");
	          pst.execute();

  修改:

 String s="update user set username=? ,password=? where id=1 ";
    PreparedStatement pst=conn.prepareStatement(s);
    
  pst.setString(1, "zhangsan");
  pst.setString(2, "123");
            
    pst.execute(); 

  

  删除:

  String s="delete from user where username=? and password=?";
			  pst=(PreparedStatement) conn.prepareStatement(s);
			        
	          pst.setString(1, "zhang");
	          pst.setString(2, "zhang123");
	          pst.execute();

 

  查询: 

String s="select * from user where username=? and password=?";
  pst=(PreparedStatement) conn.prepareStatement(s);
			        
	          pst.setString(1, "zhang");
	          pst.setString(2, "zhang123");
	          pst.execute();

  自定义一个JDBC工具类:

package com.test.utils;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;

public final class JDBCUtils {
    private static String driver="com.mysql.jdbc.Driver";
    private static String url="jdbc:mysql://localhost:3306/store28";
    private static String user="root";
    private static String password="root1234";
    
    private JDBCUtils(){}
    
    static {
        /**
         * 驱动注册
         */
        try {
            Class.forName(driver);
        } catch (ClassNotFoundException e) {
            throw new ExceptionInInitializerError(e);
        }
        
    }
    
    /**
     * 获取 Connetion
     * @return
     * @throws SQLException
     */
    public static Connection getConnection() throws SQLException{
        return DriverManager.getConnection(url, user, password);
    }
    
    /**
     * 释放资源
     * @param conn
     * @param st
     * @param rs
     */
    public static void colseResource(Connection conn,Statement st,ResultSet rs) {
        closeResultSet(rs);
        closeStatement(st);
        closeConnection(conn);
    }
    
    /**
     * 释放连接 Connection
     * @param conn
     */
    public static void closeConnection(Connection conn) {
        if(conn !=null) {
            try {
                conn.close();
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }
        //等待垃圾回收
        conn = null;
    }
    
    /**
     * 释放语句执行者 Statement
     * @param st
     */
    public static void closeStatement(Statement st) {
        if(st !=null) {
            try {
                st.close();
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }
        //等待垃圾回收
        st = null;
    }
    
    /**
     * 释放结果集 ResultSet
     * @param rs
     */
    public static void closeResultSet(ResultSet rs) {
        if(rs !=null) {
            try {
                rs.close();
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }
        //等待垃圾回收
        rs = null;
    }
}

  

 《4》 事务

  事务(Transaction)是作为单个逻辑工作单位执行的一系列操作,这些操作作为一个整体一起向系统提交,要么都执行,要么都不执行。

    1、事务的特点

    (1)原子性:事务是一个完整的操作

    (2)一致性:当食物完成时,数据必须处于一致状态

    (3)隔离性:对数据进行修改的所有兵法事务彼此隔离

    (4)永久性:事务完成后,它对数据库的修改被永久的保存

    2、JDBC对事务管理的支持

    (1)我们通过提交Commit()或是回退rollback()来管理事务的操作

    (2)事务操作默认是自动提交的

    (3)可以通过调用setAutoCommit(false)来禁止自动提交。

    3、批处理

     批处理规范

    JDBC升级到2.0后增强了statement接口,使它能够以批处理的方式执行更新操作(select等语句不能使用)。批处理操作指的是一次可以提交多句更新语句,这些更新语句一起执行。批处理相对逐句提交,使性能大幅度提高。它的具体步骤如下:

  String URL="jdbc:mysql://127.0.0.1:3306/jdbc_test";
        String USER="root";
        String PASSWORD="123456";
        //1.加载驱动程序
        Class.forName("com.mysql.jdbc.Driver");
        //2.获得数据库链接
        Connection conn=DriverManager.getConnection(URL, USER, PASSWORD);
        //设置事务不自动提交
        conn.setAutoCommit(false);
        //3.通过数据库的连接操作数据库,实现增删改查(使用Statement类)
        Statement st=conn.createStatement();
        st.addBatch("insert into user(username,password) values('zhang1','456')");
        st.addBatch("insert into user(username,password) values('zhang3','4561')");
        
        st.executeBatch();
        conn.commit();  //提交
        
        //关闭资源    
        st.close();    
        conn.close();

  

获得原来JDBC事务的模式:

boolean currentTransactionModle = con.getAutoCommit();

设置成事务模式(关闭自动提交):
con.setAutoCommit(false);
Statement stm = con.createStatement();
三个异构的sql语句:
String sql1 = "delete from user where id = 8";
String sql2 = "update user set name='java' where id = 7";
String sql3 = "insert into user(name,password) values('jdbc','jdbc')";
添加到Statement的批量处理缓冲区中:
stm.addBatch(sql1);
stm.addBatch(sql2);
stm.addBatch(sql3);
执行批量更新:
stm.executeBatch();
提交本次批量更新的事务:
con.commit();
回复原来的事务模式:
con.setAutoCommit(currentTransactionModle);

//结果集滚动显示
    public static void scrpllResult(Connection conn){
        try{
            String sql="select * from employees";                         //结果集可以滚动      //并发性,结果集只读,不可以修改
            PreparedStatement pstmt=conn.prepareStatement(sql, ResultSet.TYPE_SCROLL_SENSITIVE, ResultSet.CONCUR_READ_ONLY);
            ResultSet rs=pstmt.executeQuery();
        while(rs.next()){  //向下一行遍历
                System.out.print("工号:"+rs.getLong(1));
                System.out.println("名字"+rs.getString("last_name"));
           }while(rs.previous()){//向上一行遍历
                System.out.print("工号:"+rs.getLong(1));
                System.out.println("工资"+rs.getInt("salary"));
             }
               rs.absolute(6);//表示直接跳到第几行
            if(rs.next()){
                System.out.print("工号:"+rs.getLong(1));
                System.out.println("..........部门编号:"+rs.getString("department_id"));
              }
                rs.close();
                pstmt.close();
            }catch(SQLException e){
                e.printStackTrace();
            }
        }    

  

public class Paging {
    public static void main(String[] args) {
        Connection conn = getConnection("h3", "111111");    // 获取数据库连接
            paging(conn,1,3);//方法名调用数据库连接,且定义显示第几行到第几行
        releaseConnection(conn);// 释放数据库连接
   }
//分页查询
    public static void paging(Connection conn,int startIndex,int total){
        try{
            String sql="select * from employees limit ?,?";
            PreparedStatement pstmt=conn.prepareStatement(sql);
            pstmt.setInt(1, startIndex);
            pstmt.setInt(2, total);
            ResultSet rs=pstmt.executeQuery();
        while(rs.next()){
                System.out.print("工号:"+rs.getInt(1));
               System.out.println("部门编号:"+rs.getInt("department_id"));
            }rs.close();
            pstmt.close();
          }catch(SQLException e){
            e.printStackTrace();
        }
    }
//数据库连接
    public static Connection getConnection(String user, String pass) {
            Connection conn = null;//声明连接对象
            String driver = "com.mysql.jdbc.Driver";// 驱动程序类名
            String url = "jdbc:mysql://localhost:3306/test?" // 数据库URL
                    + "useUnicode=true&characterEncoding=UTF8";// 防止乱码
            try {
                Class.forName(driver);// 注册(加载)驱动程序
                conn = DriverManager.getConnection(url, user, pass);// 获取数据库连接
            } catch (Exception e) {
                e.printStackTrace();
            }
             return conn;
        }
// 释放数据库连接
    public static void releaseConnection(Connection conn) {
            try {
                if (conn != null)
                    conn.close();
            } catch (Exception e) {
                e.printStackTrace();
            }
       }
}

  

猜你喜欢

转载自www.cnblogs.com/MyJavaStudy/p/9186737.html