一、相关概念
JDBC(Java Data Base Connectivity,java数据库连接)是一种用于执行SQL语句的Java API,可以为多种关系数据库提供统一访问,它由一组用Java语言编写的类和接口组成。JDBC提供了一种基准,据此可以构建更高级的工具和接口,使数据库开发人员能够编写数据库应用程序。
二、常用接口及使用JDBC的步骤
加载JDBC驱动程序 → 建立数据库连接Connection → 创建执行SQL的语句Statement → 处理执行结果ResultSet → 释放资源
1.Driver接口:注册驱动 (只做一次)
Driver接口由数据库厂家提供,作为java开发人员,只需要使用Driver接口就可以了。在编程中要连接数据库,必须先装载特定厂商的数据库驱动程序,不同的数据库有不同的装载方法。
方式一:Class.forName(“com.MySQL.jdbc.Driver”);
推荐这种方式,不会对具体的驱动类产生依赖。
方式二:DriverManager.registerDriver(com.mysql.jdbc.Driver);
会造成DriverManager中产生两个一样的驱动,并会对具体的驱动类产生依赖。
2.Connection接口:建立连接
Connection与特定数据库的连接(会话),在连接上下文中执行sql语句并返回结果。DriverManager.getConnection(url, user, password)方法建立在JDBC URL中定义的数据库Connection连接上。
连接MySql数据库:Connection conn = DriverManager.getConnection("jdbc:mysql://host:port/database", "user", "password");
URL用于标识数据库的位置,通过URL地址告诉JDBC程序连接哪个数据库,URL的写法为:
其他参数如:?useSSL=falseuseUnicode=true&characterEncoding=utf8
常用方法:
-
- createStatement():创建向数据库发送sql的statement对象。
- prepareStatement(sql) :创建向数据库发送预编译sql的PrepareSatement对象。
- prepareCall(sql):创建执行存储过程的callableStatement对象。
- setAutoCommit(boolean autoCommit):设置事务是否自动提交。
- commit() :在链接上提交事务。
- rollback() :在此链接上回滚事务。
备注:使用properties配置文件
1.在src底下声明一个文件 xxx.properties ,里面的内容吐下:
driverClass=com.mysql.jdbc.Driver
url=jdbc:mysql://localhost/student
name=root
password=root
2.在工具类里面,使用静态代码块,读取属性:
static String driverClass = null;
static String url = null;
static String username = null;
static String password = null;
static {
try {
//1.创建一个属性配置对象
Properties properties = new Properties();
//InputStream is = new FileInputStream("jdbc.properties");
//JDBCUtil为当前类名
InputStream is = JDBCUtil.class.getClassLoader().getResourceAsStream("jdbc.properties");
//导入输入流
properties.load(is);
//读取属性
driverClass = properties.getProperty("driverClass");
url = properties.getProperty("url");
username = properties.getProperty("username");
password = properties.getProperty("password");
} catch (IOException e) {
e.printStackTrace();
}
}
3.Statement接口:创建执行SQL语句的statement
用于执行静态SQL语句并返回它所生成结果的对象。
三种Statement类:
-
- Statement:由createStatement创建,用于发送简单的SQL语句(不带参数)。
- PreparedStatement :继承自Statement接口,由preparedStatement创建,用于发送含有一个或多个参数的SQL语句。PreparedStatement对象比Statement对象的效率更高,并且可以防止SQL注入,所以我们一般都使用PreparedStatement。相比较以前的statement, 预先处理给定的sql语句,对其执行语法检查。 在sql语句里面使用 ? 占位符来替代后续要传递进来的变量。 后面进来的变量值,将会被看成是字符串,不会产生任何的关键字。
- CallableStatement:继承自PreparedStatement接口,由方法prepareCall创建,用于调用存储过程。
String sql = "insert into user values(null,?,?)";
PreparedStatement ps = con.prepareStatement(sql);
ps.setString(1, username);
ps.setString(2,password);
常用Statement方法:
-
- execute(String sql):运行语句,返回是否有结果集
- executeQuery(String sql):运行select语句,返回ResultSet结果集。
- executeUpdate(String sql):运行insert/update/delete操作,返回更新的行数。
- addBatch(String sql) :把多条sql语句放到一个批处理中。
- executeBatch():向数据库发送一批sql语句执行。
4.ResultSet接口:处理执行结果(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还提供了对结果集进行滚动的方法:
-
- next():移动到下一行
- Previous():移动到前一行
- absolute(int row):移动到指定行
- beforeFirst():移动resultSet的最前面。
- afterLast() :移动到resultSet的最后面。
int result = ps.executeUpdate();
if(result>0) {
System.out.println("插入成功");
}else {
System.out.println("插入失败");
}
5.释放资源
使用后依次关闭对象及连接:ResultSet → Statement → Connection
public static void release(Connection con,Statement st, ResultSet rs) {
closeRs(rs);
closeSt(st);
closeCon(con);
}
private static void closeRs(ResultSet rs) {
try {
if(rs!=null) {
rs.close();
}
}catch(SQLException e) {
e.printStackTrace();
}finally {
rs = null;
}
}
private static void closeSt(Statement St) {
try {
if(St!=null) {
St.close();
}
}catch(SQLException e) {
e.printStackTrace();
}finally {
St = null;
}
}
private static void closeCon(Connection Con) {
try {
if(Con!=null) {
Con.close();
}
}catch(SQLException e) {
e.printStackTrace();
}finally {
Con = null;
}
}
三、数据库的CRUD sql
1.insert
INSERT INTO t_stu VALUES (NULL,'wangqiang2',28);
// 1. 获取连接对象
conn = JDBCUtil.getConn();
// 2. 根据连接对象,得到statement
st = conn.createStatement();
//3. 执行添加
String sql = "insert into t_stu values(null , 'aobama' , 59)";
//影响的行数, ,如果大于0 表明操作成功。 否则失败
int result = st.executeUpdate(sql);
if(result >0 ){
System.out.println("添加成功");
}else{
System.out.println("添加失败");
}
2.delete
DELETE FROM t_stu WHERE id = 6
// 1. 获取连接对象
conn = JDBCUtil.getConn();
// 2. 根据连接对象,得到statement
st = conn.createStatement();
//3. 执行添加
String sql = "delete from t_stu where name='aobama'";
//影响的行数, ,如果大于0 表明操作成功。 否则失败
int result = st.executeUpdate(sql);
if(result >0 ){
System.out.println("删除成功");
}else{
System.out.println("删除失败");
}
3.query
SELECT * FROM t_stu
// 1. 获取连接对象
conn = JDBCUtil.getConn();
// 2. 根据连接对象,得到statement
st = conn.createStatement();
// 3. 执行sql语句,返回ResultSet
String sql = "select * from t_stu";
rs = st.executeQuery(sql);
// 4. 遍历结果集
while (rs.next()) {
String name = rs.getString("name");
int age = rs.getInt("age");
System.out.println(name + " " + age);
}
4.update
UPDATE t_stu SET age = 38 WHERE id = 1;
// 1. 获取连接对象
conn = JDBCUtil.getConn();
// 2. 根据连接对象,得到statement
st = conn.createStatement();
//3. 执行添加
String sql = "update t_stu set age = 26 where name ='qyq'";
//影响的行数, ,如果大于0 表明操作成功。 否则失败
int result = st.executeUpdate(sql);
if(result >0 ){
System.out.println("更新成功");
}else{
System.out.println("更新失败");
}
使用单元测试,测试代码
- 定义一个类, TestXXX , 里面定义方法 testXXX.
- 添加junit的支持。
右键工程 --- bulid path Configure add Library --- Junit --- Junit4
- 在方法的上面加上注解 , 其实就是一个标记。
@Test
public void testQuery() { ... }
- 光标选中方法名字,然后右键执行单元测试。 或者是打开outline视图, 然后选择方法右键执行。