一、DDL
/**
* DDL语句
*/
package com.study.mysql.test;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.Statement;
public class Test6 {
public static final String url = "jdbc:mysql://localhost:3306/ming";
public static final String user = "root";
public static final String password = "******";
private static Connection conn = null;
private static Statement st = null;
public static void main(String[] args) {
Test6 t = new Test6();
t.DDL();
}
public void DDL() {
try {
Class.forName("com.mysql.jdbc.Driver");
conn = DriverManager.getConnection(url, user, password);
String sql = "CREATE TABLE person(id INT PRIMARY KEY AUTO_INCREMENT,NAME VARCHAR(10),sex VARCHAR(5),age INT,psot VARCHAR(10),email VARCHAR(20),phone INT)";
st = conn.createStatement();
int result = st.executeUpdate(sql);//发送sql语句
} catch (Exception e) {
e.printStackTrace();
} finally {//关闭连接
try {
if (st != null) {
st.close();
}
if (conn != null) {
conn.close();
}
} catch (Exception e) {
e.printStackTrace();
}
}
}
}
二、DML(insert…)
/**
* DML(插入等操作)
*/
package com.study.mysql.test;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.Statement;
public class Test7 {
public static final String url = "jdbc:mysql://localhost:3306/ming";
public static final String user = "root";
public static final String password = "mynewroot";
private static Connection conn = null;
private static Statement st = null;
public void DML() {
try {
Class.forName("com.mysql.jdbc.Driver");
conn = DriverManager.getConnection(url, user, password);// 获取连接
String sql = "insert into person(NAME,sex,age) values ('张三','男',20)";
st = conn.createStatement();
int result = st.executeUpdate(sql);
System.out.println("影响了" + result + "行");
} catch (Exception e) {
e.printStackTrace();
} finally {
try {
if (st != null) {
st.close();
}
if (conn != null) {
conn.close();
}
} catch (Exception e) {
e.printStackTrace();
}
}
}
public static void main(String[] args) {
Test7 t = new Test7();
t.DML();
}
}
三、DQL
当我们知道SQL语句是完成修改语句时,我们就知道使用executeUpdate语句来完成操作;
如果SQL语句是完成查询操作的时候,我们就使用executeQuery来完成。
如果我们不知道SQL语句完成什么操作的时候,就可以使用execute方法来完成。
/**
* DQL
*/
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 Test8 {
public static final String url = "jdbc:mysql://localhost:3306/ming";
public static final String user = "root";
public static final String password = "mynewroot";
private static Connection conn = null;
private static Statement st = null;
private static ResultSet rs = null;
public void DQL() {
try {
Class.forName("com.mysql.jdbc.Driver");
conn = DriverManager.getConnection(url, user, password);
st = conn.createStatement();// 创建Statement对象
String sql = "select * from person";
rs = st.executeQuery(sql);// 执行sql语句
while (rs.next()) {
int id = rs.getInt("id");
String name = rs.getString("NAME");
String sex = rs.getString("sex");
System.out.println("编号:" + id + " 姓名:" + name + " 性别:" + sex);
}
} catch (Exception e) {
e.printStackTrace();
} finally {
if (rs != null)
try {
rs.close();
} catch (SQLException e1) {
e1.printStackTrace();
throw new RuntimeException(e1);
}
if (st != null) {
try {
st.close();
} catch (SQLException e) {
e.printStackTrace();
throw new RuntimeException(e);
}
}
if (conn != null) {
try {
conn.close();
} catch (SQLException e) {
e.printStackTrace();
throw new RuntimeException(e);
}
}
}
}
public static void main(String[] args) {
Test8 t = new Test8();
t.DQL();
}
}
四、事务处理
1、在JDBC中处理事务,都是通过Connection完成的。
2、Connection的三个方法与事务有关:
- setAutoCommit(boolean):设置是否为自动提交事务,如果true(默认值为true)表示自动提交,也就是每条执行的SQL语句都是一个单独的事务,如果设置为false,那么相当于开启了事务了;con.setAutoCommit(false) 表示开启事务。
- commit():提交结束事务。
- rollback():回滚结束事务。
3、 什么时候使用事务
当需要一次执行多条SQL语句时,可以使用事务。通俗一点说,就是,如果这几条SQL语句全部执行成功,才对数据库进行一次更新;如果有一条SQL语句执行失败,则这几条SQL语句全部不进行执行,这个时候需要用到事务。
把想要一次性提交的几个sql语句用事务进行提交
Statement stmt = null;
stmt = conn.createStatement();
stmt.executeUpdate(sql1);
stmt.executeUpdate(Sql2);
.
.
.
conn.commit(); //使用commit提交事务
4、JDBC处理事务的格式
try{
con.setAutoCommit(false);//开启事务,设置事务不自动提交(默认情况是自动提交的)
......
con.commit();//提交事务
} catch() {
con.rollback();//回滚事务
}
5、例子
转账前:
/**
* 事务处理
*/
package com.study.mysql.test;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.SQLException;
public class Test9 {
Connection conn = null;
PreparedStatement ppst = null;
/**
* 进行模拟转账的操作
*/
public void transferAccounts(String from, String to, double money) {
try {
JDBCutil.driver();// 注册驱动
conn = JDBCutil.getConnection();// 获取数据库连接
conn.setAutoCommit(false);
updateBalance(conn, from, -money);// 给from减去相应余额
updateBalance(conn, to, +money);// 给to加上相应余额
conn.commit();// 提交事务
} catch (Exception e) {
try {
System.out.println("转账失败!");
conn.rollback();// 如果语句有一条失败,就会滚事务
} catch (SQLException e1) {
e1.printStackTrace();
}
} finally {// 关闭连接,释放资源
JDBCutil.close(conn, ppst);
}
}
/**
* 修改指定用户的余额
*/
public void updateBalance(Connection conn, String name, double balance) {
try {
String sql = "update account set balance = balance + ? where name = ?";
PreparedStatement ppst = conn.prepareStatement(sql);
ppst.setDouble(1, balance);
ppst.setString(2, name);
ppst.executeUpdate();
} catch (Exception e) {
e.printStackTrace();
}
}
public static void main(String[] args) {
Test9 t = new Test9();
t.transferAccounts("zs", "ls", 100);
}
}
转账后:
6、关于事务的讲解可以看这2篇文章
五、简化一下程序
可以发现很多步骤每次一直重复写,代码量大,而且看起来很繁琐。那么我们可以把这些方法封装到一个类中,要用的时候直接调用即可。
/**
* 将注册驱动、连接、创建Statement对象、关闭连接凑一起
*/
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 JDBCutil {
public static String url = "jdbc:mysql://localhost:3306/ming";
public static final String user = "root";
public static final String password = "mynewroot";
public static Connection conn = null;
public static Statement st = null;
public static ResultSet rs = null;
/**
* 一、注册驱动程序
*/
public static void driver() {
try {
Class.forName("com.mysql.jdbc.Driver");
} catch (Exception e) {
e.printStackTrace();
}
}
/**
* 二、获取连接对象,该方法返回一个连接
*/
public static Connection getConnection() {
try {
conn = DriverManager.getConnection(url, user, password);
} catch (Exception e) {
e.printStackTrace();
}
return conn;
}
/**
* 三、释放资源、断开连接 --------注意参数个数
*/
public static void close(Connection conn, Statement st) {
if (st != null) {
try {
st.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
if (conn != null) {
try {
conn.close();
} catch (Exception e) {
e.printStackTrace();
}
}
}
public static void close(Connection conn, Statement st, ResultSet rs) {
if (rs != null) {
try {
rs.close();
} catch (Exception e) {
e.printStackTrace();
}
}
if (st != null) {
try {
st.close();
} catch (Exception e) {
e.printStackTrace();
}
}
if (conn != null) {
try {
conn.close();
} catch (Exception e) {
e.printStackTrace();
}
}
}
}
-
使用jdbc工具类来获取连接对象
conn = JDBCutil.getConnection();
-
关闭连接
JDBCutil.close(conn, st);
JDBCutil.close(conn, st,rs);
- 注册驱动
JDBCutil.driver();