简介 |
JDBC(java DataBase Connectivity,java数据库连接)是一种用于执行SQL语句的Java API,可以为多种关系数据库可提供统一访问,它由一组用java语言编写的类和接口组成。
JDBC常用接口 |
java API提供对JDBC的管理链接;java Driver API支持JDBC管理到驱动器连接
1、Driver接口
Driver接口由数据库厂家提供,作为java开发人员,只需要使用Driver接口就可以了。在编程中要连接数据库,必须先装载特定厂商的数据库驱动程序,不同的数据库有不同的装载方法
2、Connection接口
connection与特定数据库的连接,在连接上下文中执行sql语句并返回结果。DriverManager.getConnection(url, user, password)方法建立在JDBC URL中定义的数据库Connection连接上。
连接MySql数据库:
Connection conn = DriverManager.getConnection("jdbc:mysql://host:port/database", "user", "password");
连接Oracle数据库:
Connection conn = DriverManager.getConnection("jdbc:oracle:thin:@host:port:database", "user", "password");
连接SqlServer数据库:
Connection conn = DriverManager.getConnection("jdbc:microsoft:sqlserver://host:port; DatabaseName=database", "user", "password");
常用方法:
createStatement():创建向数据库发送sql的statement对象。
prepareStatement(sql) :创建向数据库发送预编译sql的PrepareSatement对象。
prepareCall(sql):创建执行存储过程的callableStatement对象。
setAutoCommit(boolean autoCommit):设置事务是否自动提交。
commit() :在链接上提交事务。
rollback() :在此链接上回滚事务。
3、Statement接口
用于执行静态SQL语句并返回它所生成结果的对象
常用的Statement方法:
execute(String sql):运行语句,返回是否有结果集
executeQuery(String sql):运行select语句,返回ResultSet结果集。
executeUpdate(String sql):运行insert/update/delete操作,返回更新的行数。
addBatch(String sql) :把多条sql语句放到一个批处理中。
executeBatch():向数据库发送一批sql语句执行。
4、ResultSet接口
ResultSet提供检索不同类型字段的方法,常用的有:
getString(int index)、getString(String columnName):获得在数据库里是varchar、char等类型的数据对象。
getFloat(int index)、getFloat(String columnName):获得在数据库里是Float类型的数据对象。
getDate(int index)、getDate(String columnName):获得在数据库里是Date类型的数据。
getBoolean(int index)、getBoolean(String columnName):获得在数据库里是Boolean类型的数据。
getObject(int index)、getObject(String columnName):获取在数据库里任意类型的数据。
使用后依次关闭对象及连接:ResultSet → Statement → Connection
使用JDBC的步骤 |
加载JDBC驱动程序 → 建立数据库连接Connection → 创建执行SQL的语句Statement → 处理执行结果ResultSet → 释放资源
事务 |
在解释事务之前,我们先来了解一下事务是什么?
我们将一组语句构成一个事务。当所有语句都是顺利执行以后,事务可以被提交。否则,如果其中某个语句遇到错误,那么事务将被回滚,就好像任何语句都没有被执行一样。
实际例子:假设我们需要将钱从一个银行账号转移到另外一个账号。此时,一个非常重要的问题就是我们必须同时将钱从一个账号取出并且存入另一个账号。如果在将钱存入其他账号之前系统发生崩溃,那么我们必须撤销取款操作。
事务有什么特性或者说有什么作用?
原子性:最小的单元,如果一个是失败了,则一切的操作将全部失败。
一致性:如果事务出现错误,则回到最原始的状态
隔离性:多个事务之间无法访问,只有当事务完成后才可以看到结果
持久性:当一个系统崩溃时,一个事务依然可以提交,当事务完成后,操作结果保存在磁盘中,不会被回滚
思考与总结 |
问题一:我们都知道获取JDBC连接是一个耗时操作。而我们查看教程的时候,提倡我们获取数据库连接,操作完毕后要记得关闭,这样固然是正确的。但是,如果一个简单的操作就不停开启连接断开连接,这样会对性能大打折扣。
问题二:JDBC的工作原理?还有它底部运用什么设计模式,让它能够自适应不同数据库产商的驱动呢?
问题三:事务提交和普通提交的性能到底有多大的差别?
有一个概念叫做连接池,就是数据库连接这个耗时操作交个一个容器去管理。至于数据库什么时候连接什么时候被关闭,有几个数据库连接对象?这些完全托管给连接池,而不需要客户端去考虑,目前一个比较成熟的是c3p0的连接池。现在模拟一个单例的数据库连接,比较单例数据库连接与随开随关的性能比较。
工具类
public class DBUtil {
public static String DRIVER="com.mysql.jdbc.Driver";
public static String URL="jdbc:mysql://localhost:3306/test";
public static String USERNAME="root";
public static String PASSWORD="root";
private Connection connection=null;
private DBUtil(){
}
/**
* 获得DB工具类的对象,这种获取对象的方式慢慢被jdk推荐使用。
*/
public static DBUtil getInstance(){
return DBUtilClassInstance.dbUtil;
}
/**
* 采用内部类单例模式:天然线程安全,延迟加载,调用效率高。若不了解,参考我的文章设计模式-单例模式
*/
private static class DBUtilClassInstance{
private static DBUtil dbUtil= new DBUtil();
}
/**
* 获取JDBC连接
* @return
*/
public Connection getConnection(){
try {
if(null!=connection && !connection.isClosed()){
return connection;
}
Class.forName(DRIVER);
System.out.println("驱动程序加载成功!");
connection=DriverManager.getConnection(URL,USERNAME,PASSWORD);
return connection;
} catch (Exception e) {
System.out.println("未找到驱动程序!");
e.printStackTrace();
}
return null;
}
/**
* 通过读取文件连接
* @param fileName
* @return
* @throws SQLException
*/
public Connection getConnectionByLoadSettingFile(String fileName) throws SQLException {
if(null!=connection && !connection.isClosed()){
return connection;
}
Properties props=new Properties();
try {
InputStream in=DBUtil.class.getResourceAsStream("/"+fileName);
if(null==in)
System.out.println("找不到文件:"+fileName);
props.load(in);
} catch (Exception e) {
e.printStackTrace();
}
String driver=props.getProperty("jdbc.driver");
if(null!=driver)
System.setProperty("jdbc.drivers",driver);
String url=props.getProperty("jdbc.url");
String username=props.getProperty("jdbc.username");
String password=props.getProperty("jdbc.password");
connection=DriverManager.getConnection(url,username,password);
return connection;
}