JDBC(工具类,控制事务) - G-holic/Java-Web GitHub Wiki
抽取JDBC工具类:JDBCUtils
* 目的:简化书写
* 分析:
1.注册驱动也抽取
2.抽取一个方法连接对象
* 需求:不想传递参数(麻烦),还得保证供给类的通用性。
* 解决:配置文件
jdbc.properties
url=
user=
pasword=
3.抽取一个方法释放资源
* 代码实现
package cn.itcast.util;
import java.io.FileReader;
import java.io.IOException;
import java.net.URL;
import java.sql.*;
import java.util.Properties;
/**
* JDBC工具类
*/
public class JdbcUtils {
private static String url;
private static String user;
private static String password;
private static String driver;
/**
* 文件的读取,只需读取一次即可拿到这些值。使用静态代码块
*/
static {
//读取资源文件,获取值
try {
//1.创建Properties()集合类
Properties pro = new Properties();
//获取src路径下的文件的方式---->ClassLoader 类加载器
ClassLoader classLoader = JdbcUtils.class.getClassLoader();
URL res = classLoader.getResource("jdbc.properties");
String path = res.getPath();
System.out.println(path);
//2.加载文件
//pro.load(new FileReader("E:\\java\\itcast\\day04_jdbc\\src\\jdbc.properties"));
pro.load(new FileReader(path));
//3.获取数据,赋值
url = pro.getProperty("url");
user = pro.getProperty("user");
password = pro.getProperty("password");
driver = pro.getProperty("driver");
//4.注册驱动
try {
Class.forName(driver);
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
} catch (IOException e) {
e.printStackTrace();
}
}
/**
* 获取连接
* @return 连接对象
*/
public static Connection getConnection() throws SQLException {
return DriverManager.getConnection(url,user,password);
}
/**
*释放资源
* @param stmt
* @param conn
*/
public static void close(Statement stmt,Connection conn){
if (stmt != null){
try {
stmt.close();
conn.close();
} catch (SQLException throwables) {
throwables.printStackTrace();
}
}
if (conn != null){
try {
conn.close();
} catch (SQLException throwables) {
throwables.printStackTrace();
}
}
}
/**
*释放资源
* @param rs
* @param stmt
* @param conn
*/
public static void close(ResultSet rs,Statement stmt, Connection conn){
if (rs != null){
try {
rs.close();
} catch (SQLException throwables) {
throwables.printStackTrace();
}
}
if (stmt != null){
try {
stmt.close();
conn.close();
} catch (SQLException throwables) {
throwables.printStackTrace();
}
}
if (conn != null){
try {
conn.close();
} catch (SQLException throwables) {
throwables.printStackTrace();
}
}
}
}
* 练习:
* 需求:
1.通过键盘录入用户名和密码
2.判断用户是否登录成功
* select * from user where username = '' and password = '';
* 如果这个sql有查询结果则成功,反之失败
* 步骤:
1.创建数据库表 user
create rable user(
id int primary key auto_increment,
username varchar(32),
password varchar(32)
);
insert into values(null,'zhangsan','123');
insert into values(null,'lisi','234');
2.代码实现:
package cn.itcast.jdbc;
import cn.itcast.util.JdbcUtils;
import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.Scanner;
/**
* * 练习:
* * 需求:
* 1.通过键盘录入用户名和密码
* 2.判断用户是否登录成功
*/
public class JdbcDemoTest {
public static void main(String[] args) {
//1.键盘录入,接收用户名和密码
Scanner sc = new Scanner(System.in);
System.out.println("请输入用户:");
String username = sc.nextLine();
System.out.println("请输入密码:");
String password = sc.nextLine();
//2.调用方法
boolean flag = new JdbcDemoTest().login(username,password);
//3.判断结果,输出不同语句
if (flag){
//登录成功
System.out.println("登录成功!");
}else {
System.out.println("用户名或密码错误!");
}
}
/**
* 登录方法
*/
public boolean login(String username, String password) {
if (username == null || password == null) {
return false;
}
//连接数据库判断是否登录成功
Connection conn = null;
Statement stmt = null;
ResultSet rs = null;
//1.获取连接
try {
conn = JdbcUtils.getConnection();
//2.定义sql
String sql = "select * from user where username = '" + username + "' and password = '" + password + "'";
//3.获取执行sql的对象
stmt = conn.createStatement();
//4.执行查询
rs = stmt.executeQuery(sql);
//5.判断
/*if (rs.next()){
return true;
}{
return false;
}*/
return rs.next();//如果有下一行,则返回true
} catch (SQLException throwables) {
throwables.printStackTrace();
} finally {
JdbcUtils.close(rs,stmt,conn);
}
return false;
}
}
JDBC控制事务:
1.事务:一个包含多个步骤的业务操作。如果这个业务操作被事务管理,则这多个步骤要么同时成功,要么同时失败
2.操作:
1.开启事务
2.提交事务
3.回滚事务
3.使用Connection对象来管理事务
* 开启事务:void setAutocommit(boolean autoCommit) :调用该方法设置参数为false,即开启事务
* 在执行sql之前开启事务
* 提交事务:commit
* 当所有sql都执行完提交事务
* 回滚事务:rollback()
* 在catch中回滚事务
4.代码实现:
package cn.itcast.jdbc;
import cn.itcast.util.JdbcUtils;
import java.sql.*;
public class JdbcDemo9 {
public static void main(String[] args) {
Connection conn = null;
PreparedStatement pstmt = null;
PreparedStatement pstmt1 = null;
try {
//1.获取连接
conn = JdbcUtils.getConnection();
//开启事务
conn.setAutoCommit(false);
//2.定义sql
//2.1张三 -500
String sql = "update acount set balance = balance - ? where name = ?";
//2.2李四 +500
String sql1 = "update acount set balance = balance + ? where name = ?";
//3.获取sql对象
pstmt = conn.prepareStatement(sql);
pstmt1 = conn.prepareStatement(sql1);
//4.设置参数
pstmt.setDouble(1,500);
pstmt.setString(2,"zhangsan");
pstmt1.setDouble(1,500);
pstmt1.setString(2,"lisi");
//5.执行sql,
pstmt.executeUpdate();
//手动制造异常
int i = 3/0;
pstmt1.executeUpdate();
//提交事务
conn.commit();
} catch (SQLException throwables) {
//事务回滚
try {
if (conn != null){
conn.commit();
}
} catch (SQLException e) {
e.printStackTrace();
}
throwables.printStackTrace();
}finally {
JdbcUtils.close(pstmt,conn);
JdbcUtils.close(pstmt1,conn);
}
}
}