需求: 创建一张员工表,包含id,name,age,address字段.定义添加员工,修改员工,删除员工方法操作数据库。
通过上面案例需求我们会发现每次去执行SQL语句都需要注册驱动,获取连接,得到Statement,以及释放资源。发现很多重复的劳动,我们可以将重复的代码定义到某个类的方法中。直接调用方法,可以简化代码。
那么我们接下来定义一个JDBCUtils
类。把注册驱动,获取连接,得到Statement,以及释放资源的代码放到这个类的方法中。以后直接调用方法即可。
编写JDBC工具类步骤
- 将固定字符串定义为常量
- 在静态代码块中注册驱动(只注册一次)
- 提供一个获取连接的方法
static Connection getConneciton();
- 定义关闭资源的方法
close(Connection conn, Statement stmt, ResultSet rs)
- 重载关闭方法
close(Connection conn, Statement stmt)
案例代码
工具类JDBCUtils.java
public class JDBCUtils {
// 1.将固定字符串定义为常量
private static final String DRIVER_CLASS = "com.mysql.jdbc.Driver";
private static final String URL = "jdbc:mysql:///day24";
private static final String USER = "root";
private static final String PASSWORD = "root";
// 2.在静态代码块中注册驱动(只注册一次)
// 当这个类加载到内存的时候就走这个静态代码块,再去触发Driver类中的静态代码块,主动注册
static {
try {
Class.forName(DRIVER_CLASS);
} catch (ClassNotFoundException e) {}
}
// 3.提供一个获取连接的方法static Connection getConneciton();
// 我们面向JDBC编程
public static Connection getConnection() throws SQLException {
InputStream is = JDBCUtils.class.getResourceAsStream("/jdbc.properties");
Properties pp = new Properties();
pp.load(is);
Connection conn = DriverManager.getConnection(URL, pp);
return conn;
}
// 5.重载关闭方法close(Connection conn, Statement stmt)
public static void close(Connection conn, Statement stmt) {
close(conn, stmt, null);
}
// 4.定义关闭资源的方法close(Connection conn, Statement stmt, ResultSet rs)
public static void close(Connection conn, Statement stmt, ResultSet rs) {
if (rs != null) {
try {
rs.close();
} catch (SQLException e) {}
}
if (stmt != null) {
try {
stmt.close();
} catch (SQLException e) {}
}
if (conn != null) {
try {
conn.close();
} catch (SQLException e) {}
}
}
}
调用工具类Demo06.java
public class Demo06 {
public static void main(String[] args) throws Exception {
createTable();
// addEmployee();
// updateEmployee();
// deleteEmployee();
}
// 删除员工
public static void deleteEmployee() throws Exception {
Connection conn = JDBCUtils.getConnection();
Statement stmt = conn.createStatement();
// 删除id为3的员工
String sql = "DELETE FROM employee WHERE id=3;";
int i = stmt.executeUpdate(sql);
System.out.println("影响的行数: " + i);
// stmt.close();
// conn.close();
// JDBCUtils.close(conn, stmt, null);
JDBCUtils.close(conn, stmt);
}
// 修改员工
public static void updateEmployee() throws Exception {
Connection conn = JDBCUtils.getConnection();
Statement stmt = conn.createStatement();
// 将id为3的员工姓名改成田七,地址改成天津
String sql = "UPDATE employee SET address='天津', name='田七' WHERE id=3;";
int i = stmt.executeUpdate(sql);
System.out.println("影响的行数: " + i);
// stmt.close();
// conn.close();
// JDBCUtils.close(conn, stmt, null);
JDBCUtils.close(conn, stmt);
}
// 定义添加员工
public static void addEmployee() throws Exception {
Connection conn = JDBCUtils.getConnection();
Statement stmt = conn.createStatement();
// 添加4个员工
String sql = "INSERT INTO employee VALUES (NULL, '张三4', 20, '北京'),"
+ " (NULL, '李四4', 21, '南京'),"
+ " (NULL, '王五4', 18, '东京'),"
+ " (NULL, '赵六4', 17, '西安');";
int i = stmt.executeUpdate(sql);
System.out.println("影响的行数: " + i);
// stmt.close();
// conn.close();
// JDBCUtils.close(conn, stmt, null);
JDBCUtils.close(conn, stmt);
}
// 创建表
public static void createTable() throws Exception {
Connection conn = JDBCUtils.getConnection();
Statement stmt = conn.createStatement();
String sql = "CREATE TABLE IF NOT EXISTS employee ("
+ " id INT PRIMARY KEY AUTO_INCREMENT,"
+ " name VARCHAR(20) UNIQUE NOT NULL,"
+ " age INT,"
+ " address VARCHAR(50)"
+ ");";
int i = stmt.executeUpdate(sql);
System.out.println("ok");
// stmt.close();
// conn.close();
// JDBCUtils.close(conn, stmt, null);
JDBCUtils.close(conn, stmt);
}
}
效果如下:
JDBC实现登录案例
目标
模拟用户输入账号和密码登录网站
- 输入正确的账号,密码,显示登录成功
- 输入错误的账号,密码,显示登录失败
案例分析
- 使用数据库保存用户的账号和密码
- 让用户输入账号和密码
- 使用SQL根据用户的账号和密码去数据库查询数据
- 如果查询到数据,说明登录成功
- 如果查询不到数据,说明登录失败
实现步骤
-
创建一个用户表保存用户的账号和密码,并添加一些数据,SQL语句如下:
CREATE TABLE USER ( id INT AUTO_INCREMENT PRIMARY KEY, NAME VARCHAR(50), PASSWORD VARCHAR(50) ); INSERT INTO USER (NAME, PASSWORD) VALUES('admin', '123'), ('test', '123'), ('gm', '123');
-
编写代码让用户输入账号和密码
public class Demo07 { public static void main(String[] args) { Scanner sc = new Scanner(System.in); System.out.println("请输入账号: "); String name = sc.nextLine(); System.out.println("请输入密码: "); String password = sc.nextLine(); }
-
使用SQL根据用户的账号和密码去数据库查询数据
public class Demo07 { public static void main(String[] args) throws Exception { // 让用户输入账号和密码 Scanner sc = new Scanner(System.in); System.out.println("请输入账号: "); String name = sc.nextLine(); System.out.println("请输入密码: "); String password = sc.nextLine(); // 使用SQL根据用户的账号和密码去数据库查询数据 Connection conn = JDBCUtils.getConnection(); Statement stmt = conn.createStatement(); String sql = "SELECT * FROM user WHERE name='" + name + "' AND password='" + password + "';"; } }
-
如果查询到数据,说明登录成功,如果查询不到数据,说明登录失败
public class Demo07 { public static void main(String[] args) throws Exception { // 让用户输入账号和密码 Scanner sc = new Scanner(System.in); System.out.println("请输入账号: "); String name = sc.nextLine(); System.out.println("请输入密码: "); String password = sc.nextLine(); // 使用SQL根据用户的账号和密码去数据库查询数据 Connection conn = JDBCUtils.getConnection(); Statement stmt = conn.createStatement(); String sql = "SELECT * FROM user WHERE name='" + name + "' AND password='" + password + "';"; // 如果查询到数据,说明登录成功,如果查询不到数据,说明登录失败 ResultSet rs = stmt.executeQuery(sql); if (rs.next()) { //能进来查询到了数据. String name2 = rs.getString("name"); System.out.println("欢迎您," + name2); } else { //查询不到数据,说明登录失败 System.out.println("账号或密码错误..."); } JDBCUtils.close(conn, stmt, rs); } }