JDBC介绍
JDBC(Java DataBase Connectivity)是Java和数据库之间的一个桥梁,是一个规范而不是一个实现,能够执行SQL语句。它由一组用Java语言编写的类和接口组成。
第一部分:JDBC连接Mysql使用
一、加载驱动
Class.forName("com.mysql.jdbc.Driver");
注意:Class.forName需要捕获ClassNotFoundException.
二、连接数据库
Connection conn = DriverManager.getConnection("jdbc:mysql://数据库IP:3306/数据库名?useUnicode=true&characterEncoding=UTF-8", "用户名", "密码");
注意:捕捉SQLException异常
三、创建Statement或者PreparedStatement,执行SQL语句
3.1 使用Statement接口
Statement对象常用方法:
executeQuery(String sql) 用于向数据发送查询语句。
executeUpdate(String sql) 用于向数据库发送insert、update或delete语句
execute(String sql) 用于向数据库发送任意sql语句
addBatch(String sql) 把多条sql语句放到一个批处理中。
executeBatch() 向数据库发送一批sql语句执行。
Statement s = conn.createStatement();
// 准备sql语句
// 注意: 字符串要用单引号'
String sql = "select * from tb_name where name = 'name'";
//在statement中使用字符串拼接的方式,存在一定的问题
boolean execute = s.execute(sql);
System.out.println(execute);
3.2 使用PreparedStatement接口
PreparedStatement继承自Statement,都是接口
查询使用:ps.executeQuery();
增删改使用: ps.executeUpdate();
执行批处理: ps.addBatch(); ps.executeBatch();
PreperedStatement ps = null;
String sql = "select * from tb_name where name=? and password=?";
// 在此次传入,进行预编译
ps = conn.preparedStatement(sql);
ps.setString(1, username);
ps.setString(2, password);
// 执行sql,不需要传入sql
ResultSet rs = ps.executeQuery();
// 输出结果集
while (rs.next()){
System.out.println(rs.getString(1));
}
两者区别:PreparedStatement可以使用占位符;是预编译的,可以避免SQL注入的问题;批处理比Statement效率高
四、显示结果
ResultSet用于代表Sql语句执行后返回结果集。
PreparedStatement ps = null;
ResultSet rs = ps.executeQuery();
while (rs.next()){
System.out.println(rs.getString(1));
}
利用While(ResultSet.next()){…}循环将集合ResultSet中的结果遍历出来,
ResultSet也可用于封装执行结果的,该对象提供的用于获取数据的get方法:
获取任意类型的数据
getObject(int index)
getObject(string columnName)
获取指定类型的数据,例如:
getString(int index)
getString(String columnName)
五、释放资源
Jdbc程序运行完后,要记得释放创建的那些与数据库进行交互的对象,比如:ResultSet, Statement和Connection对象。
// 关闭链接,释放资源
if(rs!=null){
try{
rs.close();
}catch (Exception e) {
e.printStackTrace();
}
rs = null;
}
if(st!=null){
try{
st.close();
}catch (Exception e) {
e.printStackTrace();
}
}
if(conn!=null){
try{
conn.close();
}catch (Exception e) {
e.printStackTrace();
}
}
Demo-Statement
@Test
public void statementTest(){
Connection conn = null;
Statement st = null;
try {
// 1. 加载驱动
Class.forName("com.mysql.jdbc.Driver");
// 2. 连接数据库
conn = DriverManager.getConnection("jdbc:mysql://47.106.216.16:3306/db_tour_test?useUnicode=true&characterEncoding=UTF-8&serverTimezone=Asia/Shanghai&zeroDateTimeBehavior=convertToNull", "root", "a0Iu2020Gz-W");
// 3. 获取用于向数据库发送sql语句的statement
st = conn.createStatement();
// 4. 执行sql,获得结果
String sql = "select * from tb_poi";
boolean execute = st.execute(sql);
System.out.println(execute);
} catch (ClassNotFoundException e) {
e.printStackTrace();
} catch (SQLException e) {
e.printStackTrace();
}
finally {
try {
if (st != null)
st.close();
if (conn != null);
conn.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
Demo-PrepareStateMent
@Test
public void PrepareStatementTest(){
Connection conn = null;
PrepareStatement ps = null;
ResultSet rs = null;
try {
Class.forName("com.mysql.jdbc.driver");
conn = DriverManager.getConnection("jdbc:mysql://IP:3306/db_name", "username", "password");
String sql = "select * from tb_name limit ?, ?"
ps = conn.prepareStatement(sql);
ps.setInt(1, 0);
ps.setInt(2, 3);
// 不需传入sql
rs = ps.executeQuery();
While (rs.hasnext()){
System.out.print(rs.getCloumn(1))
}
} catch (ClassNotFoundException e){
e.printStackTrace();
} catch (SQLExceptione){
e.printStackTrace();
} finally {
try {
if (rs != null)
rs.close();
if (ps != null)
ps.close();
if (conn != null){
conn.close();
}
} catch(Exception e){
e.printStackTrace();
}
}
}
第二部分:JDBC事务操作
数据库事务(Transaction)是由若干个SQL语句构成的一个操作序列。数据库系统保证在一个事务中的所有SQL要么全部执行成功,要么全部不执行。
Connection conn = openConnection();
try {
// 关闭自动提交,开启手动事务:
conn.setAutoCommit(false);
// 执行多条SQL语句:
insert(); update(); delete();
// 提交事务:
conn.commit();
} catch (SQLException e) {
// 回滚事务:
conn.rollback();
} finally {
conn.setAutoCommit(true);
conn.close();
}
(开启手动事务的关键是con.setAutoCommit(false)
,JDBC事务默认是开启的,并且是自动提交)
KC A CO