JDBC进阶使用(代码+注释)
- 前言
- 一、JDBC工具类
- 二、JDBC配置文件
- 三、使用JDBC工具类的实例
- 四、SQL语句采用字符串拼接的方式
- 五、PreparedStatement方式
- 六、JDBC的事务管理的实例
- 总结
前言
全是JDBC代码,包括了JDBC的所有用法。主要记录自己的jdbc的学习,并且在将来可以回顾。
一、JDBC工具类
java">import java.io.FileReader;
import java.io.IOException;
import java.net.URL;
import java.sql.*;
import java.util.Collection;
import java.util.Properties;
public class JdbcUtils {
private static String url;
private static String user;
private static String password;
private static String driver;
static {
//读取资源文件,获取值
//1、创建Propertiies集合类
Properties pro = new Properties();
//获取src路径下的文件方式-classLoder 类加载器
ClassLoader classLoader =JdbcUtils.class.getClassLoader();
URL res = classLoader.getResource("jdbc.properties");
String path = res.getPath();
//2.加载文件
try {
pro.load(new FileReader(path));
} catch (IOException e) {
e.printStackTrace();
}
//3.获取数据,数值
url = pro.getProperty("url");
user = pro.getProperty("user");
password = pro.getProperty("password");
driver = pro.getProperty("driver");
//注册驱动
try {
Class.forName(driver);
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
}
//获取连接
public static Connection getConnection() throws SQLException {
return DriverManager.getConnection(url,user,password);
}
//关闭所有打开的资源
public static void close(Statement stmt, Connection conn)
{
close(null,stmt,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();
} catch (SQLException throwables) {
throwables.printStackTrace();
}
}
if(conn != null){
try {
conn.close();
} catch (SQLException throwables) {
throwables.printStackTrace();
}
}
}
}
二、JDBC配置文件
jdbc.properties文件中
java">url=jdbc:mysql://localhost/test
user=li
password=123456
driver=com.mysql.jdbc.Driver
三、使用JDBC工具类的实例
java">import pojos.Emp;
import java.sql.*;
import java.util.ArrayList;
import java.util.List;
public class jdbcDemo5 {
static String url="jdbc:mysql://localhost/test";
static String user="li";
static String password="123456";
public static void main(String[] args){
//1.导入驱动jar包
//2.注册驱动
Connection conn = null;
Statement stmt = null;
ResultSet rs = null;
List<Emp> res = new ArrayList<Emp>();
try {
conn = JdbcUtils.getConnection();
//4.定义sql
String sql = "select * from emp";
//5.获取执行sql的对象Statement
stmt = conn.createStatement();
//6.执行sql
rs = stmt.executeQuery(sql);
while(rs.next())
{
Emp emp = new Emp();
int id = rs.getInt(1);
String name= rs.getString("ename");
int job_id = rs.getInt("job_id");
int mgr = rs.getInt("mgr");
Date joindate = rs.getDate("joindate");
double salary = rs.getDouble("salary");
double bonus = rs.getDouble("bonus");
int dept_id = rs.getInt("dept_id");
emp.setId(id);
emp.setEname(name);
emp.setJobId(job_id);
emp.setMgr(mgr);
emp.setJoindate(joindate);
emp.setSalary(salary);
emp.setBonus(bonus);
emp.setDeptId(dept_id);
res.add(emp);
}
for(Emp s : res)
{
System.out.println(s.toString());
}
} catch (SQLException throwables) {
throwables.printStackTrace();
}finally {
JdbcUtils.close(rs,stmt,conn);
}
}
}
四、SQL语句采用字符串拼接的方式
java">import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.Scanner;
public class jdbcDemo6 {
//登陆方法
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()) {//如果有下一行,则返回true
// return true;
// }
// else{
// return false;
// }
return rs.next();
} catch (SQLException throwables) {
throwables.printStackTrace();
}finally {
JdbcUtils.close(rs,stmt,conn);
}
return false;
}
//'a' or '1'='1'跳过登录
public static void main(String[] args) {
//1、键盘录入,接收用户名和密码
Scanner sc = new Scanner(System.in);
String username,password;
System.out.println("请输入用户名");
username = sc.nextLine();
System.out.println("请输入密码");
password = sc.nextLine();
//2、调用方法
boolean flag = new jdbcDemo6().login(username,password);
//3、判断结果,输出不同语句
if(flag){
//登陆成功
System.out.println("登录成功");
}
else{
//登陆失败
System.out.println("登陆失败");
}
}
}
五、PreparedStatement方式
SQL字符串拼接导致的跳过用户查询是极其不安全的方法,从而使用PreparedStatement方式去代替传统的Statement的方式。
java">import java.sql.*;
import java.util.Scanner;
public class jdbcDemo7 {
//登陆方法
public boolean login(String username,String password){
if(username == null || password == null) {
//没有输入账号或密码,返回不成功
return false;
}
Connection conn = null;
//Statement stmt = null;
PreparedStatement stmt =null;
ResultSet rs = null;
//连接数据库,判断是否登录成功
//1、获取连接
try {
conn = JdbcUtils.getConnection();
//2、定义SQL
String sql = "SELECT * FROM user WHERE username = ? AND password = ?";
//3、获取执行SQL的对象
stmt = conn.prepareStatement(sql);
//添加数据
stmt.setString(1,username);
stmt.setString(2,password);
//4、执行查询
rs = stmt.executeQuery();
return rs.next();
} catch (SQLException throwables) {
throwables.printStackTrace();
}finally {
JdbcUtils.close(rs,stmt,conn);
}
return false;
}
//'a' or '1'='1'跳过登录
public static void main(String[] args) {
//1、键盘录入,接收用户名和密码
Scanner sc = new Scanner(System.in);
String username,password;
System.out.println("请输入用户名");
username = sc.nextLine();
System.out.println("请输入密码");
password = sc.nextLine();
//2、调用方法
boolean flag = new jdbcDemo7().login(username,password);
//3、判断结果,输出不同语句
if(flag){
//登陆成功
System.out.println("登录成功");
}
else{
//登陆失败
System.out.println("登陆失败");
}
}
}
六、JDBC的事务管理的实例
java">import java.sql.*;
public class jdbcDemo8 {
public static void main(String[] args) {
Connection conn = null;
PreparedStatement stmt = null;
PreparedStatement stmt2 = null;
//1.获取连接
try {
conn = JdbcUtils.getConnection();
//开启事务
conn.setAutoCommit(false);
//2.定义sql
//2.1 张三-500
String sql = "update account set balance = balance - ? where id = ?";
//2.2 李四+500
String sql2 = "update account set balance = balance + ? where id = ?";
//3.获取执行sql对象
stmt = conn.prepareStatement(sql);
stmt = conn.prepareStatement(sql);
stmt2 = conn.prepareStatement(sql2);
//4.设置参数
stmt.setDouble(1,500);
stmt.setInt(2,1);
stmt2.setDouble(1,500);
stmt2.setInt(2,2);
//5.执行sql
stmt.executeUpdate();
//手动异常
int i = 3/0;
stmt2.executeUpdate();
//提交事务
conn.commit();
} catch (Exception e) {
//回滚事务
try {
if(conn != null){
conn.rollback();
}
} catch (SQLException e1) {
e1.printStackTrace();
}
e.printStackTrace();
}finally {
JdbcUtils.close(stmt,conn);
JdbcUtils.close(stmt2,null);
}
}
}
总结
里面包含了所有的JDBC的用法,给自己看,同时如果有喜欢的小伙伴可以评论讨论。