一.什么是JDBC
JDBC(Java DataBase Connectivity,java数据库连接)是一种用于执行SQL语句的Java API,可以为多种关系数据库提供统一访问,它由一组用JAVA语言编写的类和接口组成。JDBC提供了一种基准,据此可以构建更高级的工具和接口,使数据库开发人员能够编写数据库应用程序。
二.常用的接口
1.Driver接口:
Driver接口是由数据库驱动程序已经实现了的接口,在进行Java Web开发时,程序员只需要根据程序使用的驱动程序类型,针对应的Driver接口装载就行,不同Driver的装载方法如下:
- 使用SQL Server 2005数据库驱动:Class.forName("sun.jdbc.odbc.jdbcOdbcDriver");
- 使用MySQL数据库驱动:Class.forName("com.mysql.jdbc.Driver");
- 使用Oracle数据库驱动:Class.forName("oracle.jdbc.driver.OracleDriver");
2.Connection接口:
Connection接口代表与特定的数据库的连接.要对数据表中的数据进行操作,首先要获取数据库连接.Connection实现就像在应用程序中与数据库之间开通了一条渠道.通过DriverManager类的getConnection()方法可获取Connection实例.
- 连接SqlServer数据库:Connection conn = DriverManager.getConnection("jdbc:microsoft:sqlserver://localhost:1433; DatabaseName=database","user","password");
- 连接MySQL数据库:Connection conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/database","user","password");
- 连接Oracle数据库:Connection conn = DriverManager.getConnection("jdbc:oracle:thin:@localhost:1521:database","user", "password");
常用的方法:
- 创建向数据库发送sql的Statement对象:createStatement();
- 创建向数据库发送预编译sql:prepareStatement(sql);
- 创建执行存储过程的callableStatement对象:prepareCall(sql);
- 设置食物是否自动提交:setAutoCommit(boolean autoCommit);
- 在链接上提交事务:commit();
- 在此链接上回滚事务:rollback();
3.Statement 接口:
Statement 是 Java 执行数据库操作的一个重要接口,用于在已经建立数据库连接的基础上,向数据库发送要执行的SQL语句。Statement 对象,用于执行不带参数的简单SQL语句。
Statement的子接口CallableStatement和 PreparedStatement。
- Statement:由createStatement创建,用于发送简单的SQL语句(不带参数)。
- PreparedStatement :继承自Statement接口,由preparedStatement创建,用于发送含有一个或多个参数的SQL语句。PreparedStatement对象比Statement对象的效率更高,并且可以防止SQL注入,所以我们一般都使用PreparedStatement。
- CallableStatement:继承自PreparedStatement接口,由方法prepareCall创建,用于调用存储过程。
常用Statement方法:
- 运行语句,返回是否有结果集:execute(String sql);
- 运行select语句,返回ResultSet结果集:executeQuery(String sql);
- 运行增删改操作,返回更新的行数:executeUpdate(String sql);
- 把多条sql语句放到一个批量处理中:addBatch(String sql);
- 向数据库发送一批sql语句执行:executeBatch();
4.ResultSet 接口:
ResultSet,数据库结果集的数据表,通常通过执行查询数据库的语句生成。
ResultSet提供检索不同类型的方法和都结果集进行滚动的方法:
- 获取数据库里是varchar、char等类型的数据对象:getString(int index)、getString(String columnName);
- 获取在数据库里是Float类型的数据对象:getFloat(int index)、getFloat(String columnName);
- 获取在数据库里是Date类型的数据:getDate(int index)、getDate(String columnName);
- 获取在数据库里是Boolean类型的数据:getBoolean(int index)、getBoolean(String columnName);
- 获取在数据里任意类型的数据:getObject(int index)、getObject(String columnName);
- 移动到下一行:next();
- 移动到前一行:Previous();
- 移动到指定行:absolute(int row);
- 移动resultSet的最前面:beforeFirst();
- 移动到resultSet的最后面:afterLast();
三. 使用JDBC的步骤
- 注册驱动(注册一次即可)
- 创建数据库连接
- 创建Statement
- 执行查询或更新
- 处理结果
- 释放资源
注:释放资源:后开先关,先开后关 ResultSet→PreperedStatement→Connection
实例: 运用的MySQL数据库当作实例
//外部资源db.properties文件
dirverName=com.mysql.jdbc.Driver
url=jdbc:mysql://localhost:3306/ceshi
username=root
password=root
JDBC工具类:
//静态变量
private static String Driver=null;
private static String url=null;
private static String userName=null;
private static String passWord=null;
static {
//读取外部的文件的信息
InputStream inputStream = Util.class.getClassLoader().getResourceAsStream("db.properties");
//创建属性对象解析输入流配置信息
Properties ps=new Properties();
//解析
try {
ps.load(inputStream);
//获取驱动
Driver=ps.getProperty("dirverName");
//获取数据库链接
url=ps.getProperty("url");
//获取用户名
userName=ps.getProperty("username");
//获取密码
passWord=ps.getProperty("password");
//加载驱动
Class.forName(Driver);
} catch (IOException e) {
e.printStackTrace();
//程序员自定义异常错误抛出
throw new RuntimeException("Io错误!!");
} catch (ClassNotFoundException e) {
e.printStackTrace();
throw new RuntimeException("驱动加载驱动失败!!");
}
//链接数据库
public static Connection getConection() throws SQLException {
Connection con =null;
con = DriverManager.getConnection(url, userName, passWord);
return con;
}
//释放资源
public static void getClose(ResultSet rs,PreparedStatement pst,Connection con){
if(rs!=null) {
try {
rs.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
if(pst!=null) {
try {
pst.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
if(con!=null) {
try {
con.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
main方法测试:
//main函数测试连接
public static void main(String[] args) {
try {
//定义PreparedStatement
PreparedStatement prepareStatement = null;
//创建连接
Connection con = Util.getConection();
//插入一条信息
String sql="insert into user(username,password) values(?,?)";
//预编译
prepareStatement=con.prepareStatement(sql);
//给占位符赋值
prepareStatement.setString(1, "zhangsan");
prepareStatement.setString(2, "123");
//执行sql
prepareStatement.executeUpdate();
//关闭资源
Util.getClose(null, prepareStatement, con);
} catch (SQLException e) {
e.printStackTrace();
}
}
结果: