练习JDBC中的增、删、改、查的基本操作。
实现对连接、关闭资源的自定义封装。
练习commons-dbutils工具类中部分API
驱动
提取码:0o69
注:其他功能就不再演示,详情见下面源码,源码实现了简单的增、删、改、查。
自定义封装类
package com.xiaomingxingwu.JDBCUtils;
import com.alibaba.druid.pool.DruidDataSourceFactory;
import org.apache.commons.dbutils.DbUtils;
import javax.sql.DataSource;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.Properties;
/**
* 封装连接,关闭操作
* @author xiaomingxing
* @create 2019-10-06 22:37
*/
public class JDBCUtils {
// 创建数据库连接池
private static DataSource dataSource = null;
static {
Properties prop = new Properties();
try {
// 获取配置文件中的配置信息
prop.load(JDBCUtils.class.getClassLoader().getResourceAsStream("database.properties"));
dataSource = DruidDataSourceFactory.createDataSource(prop);
} catch (Exception e) {
e.printStackTrace();
}
}
// 连接
public static Connection getConnection(){
// 获取连接
Connection conn = null;
try {
conn = dataSource.getConnection();
} catch (SQLException e) {
e.printStackTrace();
}
if (conn != null)
System.out.println("连接成功!");
else
System.out.println("连接失败!");
return conn;
}
// 关闭资源
public static void closeResource(Connection conn, PreparedStatement ps, ResultSet rs){
DbUtils.closeQuietly(conn);
DbUtils.closeQuietly(ps);
DbUtils.closeQuietly(rs);
}
}
数据表对应的类
package com.xiaomingxingwu.DAO;
/**
* 根据DAO思想,一个数据表对应一个类
* @author xiaomingxing
* @create 2019-10-06 23:14
*/
public class Student {
private String name;
private int age;
private String sex;
public String getName() {
return name;
}
public int getAge() {
return age;
}
public String getSex() {
return sex;
}
public void setName(String name) {
this.name = name;
}
public void setAge(int age) {
this.age = age;
}
public void setSex(String sex) {
this.sex = sex;
}
public Student(String name, int age, String sex) {
this.name = name;
this.age = age;
this.sex = sex;
}
public Student() {
}
@Override
public String toString() {
return "Student{" +
"name='" + name + '\'' +
", age=" + age +
", sex='" + sex + '\'' +
'}';
}
}
实现增、删、改、查(主函数)
package com.xiaomingxingwu.CRUD;
import com.xiaomingxingwu.DAO.Student;
import com.xiaomingxingwu.JDBCUtils.JDBCUtils;
import org.apache.commons.dbutils.QueryRunner;
import org.apache.commons.dbutils.handlers.BeanListHandler;
import java.sql.Connection;
import java.sql.SQLException;
import java.util.List;
import java.util.Scanner;
/**
* 学生管理系统 version 1.0
* @author xiaomingxing
* @create 2019-10-07 8:50
*/
public class CRUD {
private static Scanner sc = new Scanner(System.in);
public static void main(String[] args) {
while (true){
Logo();
// 接收用户输入的选择
int num = sc.nextInt();
if(num == 5){
return ; // 退出
}
switch (num){
case 1:
update1(); // 添加
break;
case 2:
query(); // 查询
break;
case 3:
update2(); // 修改
break;
case 4:
update3(); // 删除
break;
default:
System.out.println("您的输入有误,请您重新输入!");
break;
}
}
}
// 显示logo
private static void Logo() {
System.out.println("#############################");
System.out.println("#\t\t学生管理系统\t\t#");
System.out.println("#\t\t 1.添加\t\t\t#");
System.out.println("#\t\t 2.查询\t\t\t#");
System.out.println("#\t\t 3.修改\t\t\t#");
System.out.println("#\t\t 4.删除\t\t\t#");
System.out.println("#\t\t 5.退出\t\t\t#");
System.out.println("#############################");
System.out.println("请输入你的选择:");
}
// 添加
private static void update1( ) {
// 建立连接
Connection conn = JDBCUtils.getConnection();
// 预编译sql语句
String sql = "insert into demo1 (name,age,sex) values (?,?,?);";
// 提示用户输入数据
System.out.println("姓名:");
String name = sc.next();
System.out.println("年龄:");
int age = sc.nextInt();
System.out.println("性别:");
String sex = sc.next();
// 调用update方法
QueryRunner queryRunner = new QueryRunner();
int res = 0;
try {
res = queryRunner.update(conn, sql, name, age, sex);
System.out.println("成功添加"+res+"数据!"+"\n");
} catch (SQLException e) {
e.printStackTrace();
}finally {
// 关闭资源
JDBCUtils.closeResource(conn,null,null);
}
}
// 修改
private static void update2( ) {
// 建立连接
Connection conn = JDBCUtils.getConnection();
// 预编译sql语句
String sql = "update demo1 set age = ?, sex = ? where `name` = ?;";
// 提示用户输入数据
System.out.println("请输入要修改的学生姓名:");
String name = sc.next();
System.out.println("新年龄:");
int age = sc.nextInt();
System.out.println("新性别:");
String sex = sc.next();
// 调用update方法
QueryRunner queryRunner = new QueryRunner();
int res = 0;
try {
res = queryRunner.update(conn, sql, age, sex, name);
System.out.println("成功修改"+res+"数据!"+"\n");
} catch (SQLException e) {
e.printStackTrace();
}finally {
// 关闭资源
JDBCUtils.closeResource(conn,null,null);
}
}
// 删除
private static void update3( ) {
// 建立连接
Connection conn = JDBCUtils.getConnection();
// 预编译sql语句
String sql = "delete from demo1 where `name` = ?;";
// 提示用户输入数据
System.out.println("请输入要删除的学生姓名:");
String name = sc.next();
// 调用update方法
QueryRunner queryRunner = new QueryRunner();
int res = 0;
try {
res = queryRunner.update(conn, sql, name);
System.out.println("成功删除"+res+"数据!"+"\n");
} catch (SQLException e) {
e.printStackTrace();
}finally {
// 关闭资源
JDBCUtils.closeResource(conn,null,null);
}
}
// 目前的函数功能只能查询一条学生的信息
private static void query( ) {
// 建立连接
Connection conn = JDBCUtils.getConnection();
// 预编译sql语句
String sql = "select `name`,age,sex from demo1 where `name` = ?;";
// 提示用户输入数据
System.out.println("请你输入要查询学生的姓名:");
String name = sc.next();
// 调用查询方法
QueryRunner queryRunner = new QueryRunner();
// 创建结果集的实例
BeanListHandler<Student> beanListHandler = new BeanListHandler<Student>(Student.class);
try {
List<Student> list = queryRunner.query(conn, sql, beanListHandler, name);
// 遍历结果集中的数据
list.forEach(System.out::println);
} catch (SQLException e) {
e.printStackTrace();
}finally {
// 关闭资源
JDBCUtils.closeResource(conn,null,null);
}
}
}
数据库配置文件
url=jdbc:mysql://localhost:3306/demo
driverClassName=com.mysql.jdbc.Driver
username=root
password=123456
注:上面源码中,并没有考虑到性能、美观等相关问题,还请各位大佬,不喜勿喷!