1、JDBC(Java Data Base Connectivity,Java数据库连接)
是一种用于执行SQL语句的Java API,可以为多种关系数据库提供统一访问,它由一组用Java语言编写的类和接口组成。JDBC提供了一种基准,据此可以构建更高级的工具和接口,使数据库开发人员能够编写数据库应用程序。
2、数据库驱动
我们安装好数据库之后,我们的应用程序也是不能直接使用数据库的,必须要通过相应的数据库驱动程序,通过驱动程序去和数据库打交道。其实也就是数据库厂商的JDBC接口实现,即对Connection等接口的实现类的jar文件。
使用后依次关闭对象及连接:ResultSet → Statement → Connection
Driver接口由数据库厂家提供,对于Java开发者而言,只需要使用Driver接口就可以了。 在编程中要连接数据库,必须先装载特定厂商的数据库驱动程序。不同的数据库有不同的装载方法。
驱动:就是各个厂商实现Sun公司提出的JDBC接口。即对Connection等接口的实现类的jar文件。
装载mysql驱动:Class.forName(“com.mysql.jdbc.Driver”);
装载oracle驱动:Class.forName(“com.jdbc.driver.OracleDriver”);
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”);
常用方法:
close()----- 关闭该数据库连接
commit()------ 提交所有更改内容(事务)并释放该Connection对象锁定的资源
createStatement()-----基于本Connection对象,创建Statement对象
getAutoCommit()-----获取当前是否是自动提交模式
getMetaData()---- 获取本连接相关的数据库元数据
isClosed()----- 返回当前连接对象是否已经被关闭
preparedStatement()------ 基于本连接对象,创建PreparedStatement对象
rollback()----- 取消本轮事务中前面已经提交的更改(回滚)
setAutoCommmit(boolean autoCommit)------- 设置事务是否自动提交
prepareCall(sql)--------创建执行存储过程的callableStatement对象。
用于执行静态SQL语句并返回它所生成结果的对象。
三种Statement类:
①Statement:由createStatement创建,用于发送简单的SQL语句(不带参数)。
②PreparedStatement :继承自Statement接口,由preparedStatement创建,用于发送含有一个或多个参数的SQL语句。PreparedStatement对象比Statement对象的效率更高,并且可以防止SQL注入,所以我们一般都使用PreparedStatement。
③CallableStatement:继承自PreparedStatement接口,由方法prepareCall创建,用于调用存储过程。
常用Statement方法:
execute(String sql):运行语句,返回是否有结果集
executeQuery(String sql):运行select语句,返回ResultSet结果集。
executeUpdate(String sql):运行insert/update/delete操作,返回更新的行数。
addBatch(String sql) :把多条sql语句放到一个批处理中。
executeBatch():向数据库发送一批sql语句执行。
记得进行异常处理
Class.forName("com.MySQL.jdbc.Driver");
Connection conn = DriverManager.getConnection(url, user, password);
URL的格式:(第三行)
MySql:jdbc:mysql://localhost:xxx/xxx
简单的顺序输出表
/**
* 顺序查询
*/
package com.study.mysql.test;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
public class Test1 {
public static Connection conn;
public static Statement sql;
public static ResultSet rs;
public static final String url = "jdbc:mysql://localhost:3306/ming";
public static final String user = "root";
public static final String password = "******";
public Connection getConnection() {// 将连接数据库的方法放在一起
try {
Class.forName("com.mysql.jdbc.Driver");//注册驱动
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
try {
conn = DriverManager.getConnection(url, user, password);
} catch (SQLException e) {
e.printStackTrace();
}
return conn;// 返回Connection对象
}
public static void main(String[] args) {
Test1 t = new Test1();
t.getConnection();// 连接数据库
try {
sql = conn.createStatement();//实例化Statement对象
//执行sql语句
rs = sql.executeQuery("select * from test_02;");
while(rs.next()) {//如果当前语句不是最后一条,则进行循环(最后一条则返回false)
String id = rs.getString("id");//获取列名是id的字段值
String name = rs.getString("name");//获取列名是name的字段值
String sex = rs.getString("sex");//获取列名是sex的字段值
String birthday = rs.getString("birthday");//获取列名是birthday的字段值
System.out.print( " | " + "编号:" + id + " | ");
System.out.print(" 姓名:" + name+ " | ");
System.out.print(" 性别:" + sex+ " | ");
System.out.println(" 出生日期:" + birthday+ " | ");
}
}catch(Exception e) {
e.printStackTrace();
}
}
}
CURD(增删改查)操作
/**
* 简单的CURD
*/
package com.study.mysql.test;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.SQLException;
public class Test5 {
public static Connection conn;
public static PreparedStatement sql;// 声明预处理对象
public static java.sql.ResultSet rs;// 声明结果集对象
public static final String url = "jdbc:mysql://localhost:3306/ming";
public static final String user = "root";
public static final String password = "******";
public Connection getConnection() {// 连接数据库
try {
Class.forName("com.mysql.jdbc.Driver");
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
try {
conn = DriverManager.getConnection(url, user, password);
} catch (SQLException e) {
e.printStackTrace();
}
return conn;// 返回Connection对象
}
public void shutConn() {// 关闭连接
// 关闭连接,释放资源
if (rs != null) {// 查询结果集
try {
rs.close();
} catch (Exception e) {
e.printStackTrace();
}
rs = null;
}
if (sql != null) {// sql语句
try {
sql.close();
} catch (Exception e) {
e.printStackTrace();
}
}
if (conn != null) {// 连接
try {
conn.close();
} catch (Exception e) {
e.printStackTrace();
}
}
}
public static void main(String[] args) {
Test5 t = new Test5();
t.getConnection();// 获取连接
try {
sql = conn.prepareStatement("select * from test_02");
rs = sql.executeQuery();
System.out.println("------------------执行CURD前的数据------------------");
while (rs.next()) {
String id = rs.getString("id");// 获取列名是id的字段值
String name = rs.getString("name");// 获取列名是name的字段值
String sex = rs.getString("sex");// 获取列名是sex的字段值
String birthday = rs.getString("birthday");// 获取列名是birthday的字段值
System.out.print(" | " + "编号:" + id + " | ");
System.out.print(" 姓名:" + name + " | ");
System.out.print(" 性别:" + sex + " | ");
System.out.println(" 出生日期:" + birthday + " | ");
}
// 预处理添加数据
sql = conn.prepareStatement("insert into test_02 values(?,?,?,?)");
sql.setInt(1, 5);
sql.setString(2, "张一");
sql.setString(3, "女");
sql.setString(4, "2012-08-08");
sql.executeUpdate();
// 预处理更新数据
sql = conn.prepareStatement("update test_02 set birthday = ? where id = ?");
sql.setString(1, "2018-8-27");
sql.setInt(2, 3);
sql.executeUpdate();
// 预处理删除数据
sql = conn.prepareStatement("delete from test_02 where id = ? ");
sql.setInt(1, 1);
sql.executeUpdate();
System.out.println("------------------执行CURD后的数据------------------");
// 查询修改后的数据
sql = conn.prepareStatement("select * from test_02");
rs = sql.executeQuery();
while (rs.next()) {
String id = rs.getString("id");// 获取列名是id的字段值
String name = rs.getString("name");// 获取列名是name的字段值
String sex = rs.getString("sex");// 获取列名是sex的字段值
String birthday = rs.getString("birthday");// 获取列名是birthday的字段值
System.out.print(" | " + "编号:" + id + " | ");
System.out.print(" 姓名:" + name + " | ");
System.out.print(" 性别:" + sex + " | ");
System.out.println(" 出生日期:" + birthday + " | ");
}
} catch (Exception e) {
e.printStackTrace();
}
t.shutConn();// 关闭连接
}
}