zoukankan      html  css  js  c++  java
  • Mysql(五) JDBC

    一、JDBC

        JDBC(Java DataBase Connectivity) Java 数据库连接API
        JDBC完成三件事: 与一个数据库连接          向数据库发送SQL语句                处理数据库返回的结果 
        Java.sql包提供了JDBC API,声明了访问数据库的接口和类, 可以通过它编写访问数据库的程序。 
        JDBC API只是定义了相关的规范(提供相应的接口),并不 能直接访问数据库,它依赖于数据库厂商提供具体的实现。 
       

         1、相关实现

            

        2、Java.sql包中的接口和类 :

           Driver接口和DriverManager
           Connection接口
           Statement接口
           PreparedStatement接口
           ResultSet接口

           (1)Driver接口和DriverManager

    所有JDBC驱动程序都必须实现Driver接口, JDBC驱动程序由 数据库厂商提供。
    DriverManager用来建立和数据库的连接已经管理JDBC驱动 程序。
    getConnection(String url,String user,String pwd):建立和 数据库的连接,返回Connection对象 

         (2)Connection接口

    Connection接口代表Java程序和数据库的连接, Connection接口常用方法:
    createStatement():创建并返回Statement对象
    prepareStatement(String sql):创建并返回 PreparedStatement对象 

        (3)Statement接口

    Statement用来执行SQL语句。 
    对于insertupdatedelete语句,可以调用 executeUpdate(String sql)方法,该方法返回一个int型数据, 表示受影响的记录数。
    对于select语句,可以调用executeQuery(String sql)方法, 该方法返回一个ResultSet对象(查询结果集) 

        (4)PreparedStatement接口

    PreparedStatement也用来执行SQL语句,不同的是,其可以使 用动态的参数(?)。
    在访问数据库时,如果某条SQL语句被多次执行,但每次都参 数不同,在这种情况下,使用PreparedStatementStatement 更方便, PreparedStatement允许sql语句中包含参数。

        (5)ResultSet接口
    ResultSet接口表示select语句查询得到的记录结果集合,ResultSet接口的记录行号从1开始,一个Statement对象在同 一时刻只能打开一个ResultSet对象。
    调用ResultSetnext()方法,可以进行顺序查询,可以使游 标定位到下一条记录,该方法返回一个boolean型数据,当 游标移动到最后一行之后返回false
    调用ResultSetgetXXX()方法,可以获取某个字段的值。 XXX为字段的类型。 

        3、JDBC程序访问数据库的步骤

        4、驱动类名

    驱动类的名称由数据库厂商提供,不同的数据库厂商类名也不 相同。 

    MySQL驱动类: com.mysql.jdbc.Driver
    Oracle驱动类: oracle.jdbc.driver.OracleDriver
    SqlServer驱动类: com.microsoft.sqlserver.jdbc.SQLServerDriver

       5、建立与数据库的连接

    Connection con = DriverManager.getConnection(url,user,password);
    url表示连接数据库的地址,不同的数据库, url也不相同。
    userpassword分别表示连接数据库的用户名和密码。
    url的一般形式为:
    jdbc:drivertype:driversubtype://parameters
    drivertype表示驱动程序的类型, driversubtype是子类型, parameter通常用来设定数据库服务器的IP地址、端口号和数据 库的名称
     

      6、事务处理
    在数据库操作中,一项事务是指由一条或多条对数据库更新 的SQL语句所组成的不可分割的工作单元。 

    只有当事务中的所有操作都正常完成,整个事务才能被提交 到数据库。如果有一项操作没有完成,则必须撤销整个事务。 

    事务的原则:要么全部完成,要么什么都不做。


    Connection类中提供了3个控制事务的方法:

    setAutoCommit(boolean autoCommit):设置是否自动提交事 务
    commit():提交事务
    rollback():撤销事务
    默认情况下,事务为自动提交。即每一条数据库更新的SQL 语句代表一项事务,操作成功后,系统将自动调用commit() 来提交,否则将调用rollback()来撤销事务。 
    可以通过调用setAutoCommit(false)来禁止自动提交事务。 可以把多条更新数据库的SQL语句作为一个事务,在所有操 作完成后,调用commit()来进行整体提交。若其中一项SQL操作失败,就不会执行commit(),而是产生相应的SQLException,此时就可以在捕获异常的代码块中调用rollback()方法撤销事务。 

       7、数据库连接池

    之前的数据库连接方式,是在需要时创建一个连接,当访问 数据库结束后,即将创建的连接销毁。 

    数据库的连接池的基本思想:在数据源中为数据库连接建立 多个连接,保存在连接池(connect pool)中;预先在连接池 中放入一定数量的连接,当Java程序访问数据库时,只需从 连接池中取出一个空闲状态的数据库连接。当程序访问数据 库结束,再将数据库连接放回连接池。这样就可以提高访问
    数据库的效率,因为连接池只是将连接回收,而不是销毁。 要清楚,数据库连接的创建与销毁是非常耗费资源的。 

    二、

    1、

    /*
     * 通过Java连接MySQL数据库。
     */
    package day23;
    
    import java.sql.Connection;
    import java.sql.DriverManager;
    import java.sql.SQLException;
    import java.sql.Statement;
    
    public class ConnectionTest {
    	public static void main(String[] args) {
    		Connection con = null;
    		Statement st = null;
    		try {
    			// 可以创建驱动类的对象来令驱动类初始化,只是创建
    			// 的对象是多余的(根本不使用该对象)
    			// new com.mysql.jdbc.Driver();
    			// 加载并初始化驱动类。
    			Class.forName("com.mysql.jdbc.Driver");
    			// 获得数据库的连接,返回Connection接口类型的对象。
    			con = DriverManager.getConnection("jdbc:mysql://000.0.0.0:3306/test?useSSL=false", "root", "");
    			// System.out.println(con);
    			// 创建可执行的sql语句。
    			st = con.createStatement();
    			// 执行更新语句。返回受影响的记录数。
    			int count = st.executeUpdate("insert into student(id, name) values (8, '新增')");
    			System.out.println(count);
    		} catch (ClassNotFoundException e) {
    			e.printStackTrace();
    		} catch (SQLException e) {
    			e.printStackTrace();
    		} finally {
    			// 资源释放的顺序:
    			// 先创建的后释放,后创建的先释放。
    			if (st != null) {
    				try {
    					st.close();
    				} catch (SQLException e) {
    					e.printStackTrace();
    				}
    			}
    			if (con != null) {
    				try {
    					con.close();
    				} catch (SQLException e) {
    					e.printStackTrace();
    				}
    			}
    		}
    	}
    }
    

      

    2、TryWithResources:

    import java.sql.Connection;
    import java.sql.DriverManager;
    import java.sql.ResultSet;
    import java.sql.SQLException;
    import java.sql.Statement;
    
    public class TryWithResources {
    	public static void main(String[] args) {
    		try {
    			Class.forName("com.mysql.jdbc.Driver");
    		} catch (ClassNotFoundException e) {
    			e.printStackTrace();
    		}
    		try (Connection con = DriverManager.getConnection("jdbc:mysql://***.0.0.1:3306/test?useSSL=false", "root", "");
    				Statement st = con.createStatement();
    				ResultSet rs = st.executeQuery("select id, name, age, sex from student");) {

                                                  // 判断是否有下一条记录,如果存在,返回true,同时
                                                  // 移动游标(指针),使其指向下一条记录。如果不存在,
                                                  // 返回false。

    			while (rs.next()) {

                                                    // 根据字段的索引获得当前记录该字段的值。索引从1开始。
                                                      // int id = rs.getInt(1);
                                                   // 根据字段的名字获得当前记录该字段的值。
                                                    int id = rs.getInt("id");
                                                    String name = rs.getString("name");
                                                     int age = rs.getInt("age");
                                                     String sex = rs.getString("sex");

    			}
    		} catch (SQLException e) {
    			e.printStackTrace();
    		}
    	}
    
    }
    

      3、PreparedStatement

    import java.sql.Connection;
    import java.sql.DriverManager;
    import java.sql.ResultSet;
    import java.sql.SQLException;
    import java.sql.Statement;
    
    public class DBUtil {
    	public static Connection getConnection() {
    		Connection con = null;
    		try {
    			Class.forName("com.mysql.jdbc.Driver");
    			con = DriverManager.getConnection("jdbc:mysql://127.0.0.1:3306/test?useSSL=false", "root", "");
    		} catch (ClassNotFoundException e) {
    			e.printStackTrace();
    		} catch (SQLException e) {
    			e.printStackTrace();
    		}
    		return con;
    	}
    
    	public static void release(ResultSet rs, Statement st, Connection con) {
    		if (rs != null) {
    			try {
    				rs.close();
    			} catch (SQLException e) {
    				e.printStackTrace();
    			}
    		}
    		if (st != null) {
    			try {
    				st.close();
    			} catch (SQLException e) {
    				e.printStackTrace();
    			}
    		}
    		if (con != null) {
    			try {
    				con.close();
    			} catch (SQLException e) {
    				e.printStackTrace();
    			}
    		}
    	}
    }
    

      

    import java.sql.Connection;
    import java.sql.PreparedStatement;
    import java.sql.SQLException;
    import java.sql.Statement;
    
    public class PreparedTest {
    
    	public static void main(String[] args) {
    
    	}
    
    	public void insert(int id, String name, int age, String sex) {
    		try (Connection con = DBUtil.getConnection(); Statement st = con.createStatement();) {
    			String sql = "insert into student(id, name, age, sex) values (" + id + ", '" + name + "'," + age + ",'"
    					+ sex + "')";
    			StringBuilder bu = new StringBuilder();
    			bu.append("insert into student(id, name, age, sex) values (").append(id).append(",'").append(name)
    					.append("',").append(age).append(",'").append(sex).append("')");
    			st.executeUpdate(sql);
    		} catch (SQLException e) {
    			e.printStackTrace();
    		}
    	}
    	/*
    	 * PreparedStatement与Statement
    	 * PreparedStatement是预处理的SQL语句对象,当重复
    	 * 执行时,PreparedStatement在性能上可能会好于
    	 * Statement(这要取决于底层数据库是否支持预处理)。
    	 * PreparedStatement在程序的可读性上,也好于
    	 * Statement,因此,我们应该总是有限的考虑使用
    	 * PreparedStatement。
    	 */
    	public void insert2(int id, String name, int age, String sex) {
    		try (Connection con = DBUtil.getConnection();
    				PreparedStatement ps = con
    						.prepareStatement("insert into student(id, name, age, sex) values(?,?,?,?)")) {
    			ps.setInt(1, id);
    			ps.setString(2, name);
    			ps.setInt(3, age);
    			ps.setString(4, sex);
    			ps.executeUpdate();
    		} catch (SQLException e) {
    			e.printStackTrace();
    		}
    	}
    
    }
    

      4、Transaction

    import java.sql.Connection;
    import java.sql.PreparedStatement;
    import java.sql.SQLException;
    
    public class Transaction {
    
    	public static void main(String[] args) {
    		Connection con = DBUtil.getConnection();
    		try (PreparedStatement ps1 = con.prepareStatement("update account set money = money - 100 where id = 1");
    				PreparedStatement ps2 = con
    						.prepareStatement("updatedd account set money = money + 100 where id = 2");) {
    			// 将自动提交设置为假。
    			con.setAutoCommit(false);
    			ps1.executeUpdate();
    			ps2.executeUpdate();
    			// 事务执行完毕,没有异常,提交。
    			con.commit();
    			con.setAutoCommit(true);
    		} catch (SQLException e) {
    			try {
    				// 失败,进行回滚操作。恢复到事务执行之前的
    				// 状态。
    				con.rollback();
    				con.setAutoCommit(true);
    			} catch (SQLException e1) {
    				e1.printStackTrace();
    			}
    			e.printStackTrace();
    		}
    	}
    
    }
    

      






















     

  • 相关阅读:
    ifdef有大用处
    osgEarth编译
    CyanogenMod 7.1 for Sony Ericsson X8 下载 CM7.1 for 索爱X8下载
    ArcGIS影像配准与空间配准
    ArcGIS Server的切图原理深入
    Arcgis server的rest服务url写法解读
    地图切片公式
    新随笔
    solr的java调用
    配置文件
  • 原文地址:https://www.cnblogs.com/liuwei6/p/7280399.html
Copyright © 2011-2022 走看看