Mysql(五) JDBC

1、JDBCjava

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

     一、相关实现sql

        

    二、Java.sql包中的接口和类 :
数据库

       Driver接口和DriverManager
       Connection接口
       Statement接口
       PreparedStatement接口
       ResultSet接口
服务器

       (1)Driver接口和DriverManager
oracle

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

     (2)Connection接口
sqlserver

Connection接口表明Java程序和数据库的链接, Connection接口经常使用方法:
createStatement():建立并返回Statement对象
prepareStatement(String sql):建立并返回 PreparedStatement对象 
性能

    (3)Statement接口
ui

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为字段的类型。 

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

    四、驱动类名

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

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

   五、创建与数据库的链接

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

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

只有当事务中的全部操做都正常完成,整个事务才能被提交 到数据库。若是有一项操做没有完成,则必须撤销整个事务。 

事务的原则:要么所有完成,要么什么都不作。


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

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

   七、数据库链接池

以前的数据库链接方式,是在须要时建立一个链接,当访问 数据库结束后,即将建立的链接销毁。 

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

2、

一、

/*
 * 经过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();
				}
			}
		}
	}
}

  

二、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();
		}
	}

}

  三、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();
		}
	}

}

  四、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();
		}
	}

}
相关文章
相关标签/搜索