【JDBC】操作数据库(CRUD)

List orderList = getForList(Order.class, sql1);

//foreach 遍历集合中的所有元素

for(Order order:orderList){

System.out.println(order);

}

String sql2 = “select id,name,birth,email from customers”;

List customerList = getForList(Customer.class, sql2);

//System.out.println(customerList);

//foreach 遍历集合中的所有元素

for (Customer customer : customerList) {

System.out.println(customer);

}

}

public List getForList(Class clazz, String sql, Object… args) {

Connection connection = null;

PreparedStatement preparedStatement = null;

ResultSet resultSet = null;

try {

connection = JDBCUtils.getConnection();

preparedStatement = connection.prepareStatement(sql);

//填充占位符

for (int i = 0; i < args.length; i++) {

preparedStatement.setObject(i + 1, args[i]);

}

//执行

resultSet = preparedStatement.executeQuery();

//获取结果集的元数据

ResultSetMetaData metaData = preparedStatement.getMetaData();

//根据元数据获取列的个数

int columnCount = metaData.getColumnCount();

List list = new LinkedList();

while (resultSet.next()) {

T t = clazz.newInstance();

for (int i = 0; i < columnCount; i++) {

//获取每列对应的字段值

Object columnValue = resultSet.getObject(i + 1);

/* //获取列的列名

String columnName = metaData.getColumnName(i + 1);*/

//获取列的别名

String columnLabel = metaData.getColumnLabel(i + 1);

Field field = clazz.getDeclaredField(columnLabel);

field.setAccessible(true);

field.set(t, columnValue);

}

list.add(t);

}

return list;

} catch (Exception e) {

e.printStackTrace();

} finally {

JDBCUtils.closeResource(connection, preparedStatement, resultSet);

}

return null;

}

//查询一条记录

@Test

public void testGetInstance() {

String sql1 = “select name,id,email from customers where id=?”;

int para1 = 7;

Customer customer = getInstance(Customer.class, sql1, para1);

System.out.println(customer);

String sql2 = “select order_id id,order_name name,order_date date from order where order_name=?”;

String para2 = “BB”;

Order order = getInstance(Order.class, sql2, para2);

System.out.println(order);

}

public T getInstance(Class clazz, String sql, Object… args) {

Connection connection = null;

PreparedStatement preparedStatement = null;

ResultSet resultSet = null;

try {

connection = JDBCUtils.getConnection();

preparedStatement = connection.prepareStatement(sql);

//填充占位符

for (int i = 0; i < args.length; i++) {

preparedStatement.setObject(i + 1, args[i]);

}

//执行

resultSet = preparedStatement.executeQuery();

//获取结果集的元数据

ResultSetMetaData metaData = preparedStatement.getMetaData();

//根据元数据获取列的个数

int columnCount = metaData.getColumnCount();

if (resultSet.next()) {

T t = clazz.newInstance();

for (int i = 0; i < columnCount; i++) {

//获取每列对应的字段值

Object columnValue = resultSet.getObject(i + 1);

/* //获取列的列名

String columnName = metaData.getColumnName(i + 1);*/

//获取列的别名

String columnLabel = metaData.getColumnLabel(i + 1);

Field field = clazz.getDeclaredField(columnLabel);

field.setAccessible(true);

field.set(t, columnValue);

}

return t;

}

} catch (Exception e) {

e.printStackTrace();

} finally {

JDBCUtils.closeResource(connection, preparedStatement, resultSet);

}

return null;

}

}

结果:

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

案例:四六级学生信息简单添加、查询、删除

1、sql语句创建表

CREATE TABLE examstudent(

flowID INT(10) PRIMARY KEY AUTO_INCREMENT,

type INT(5) NOT NULL,

idCard VARCHAR(18) UNIQUE NOT NULL,

examCard VARCHAR(15) UNIQUE NOT NULL,

studentName VARCHAR(20) NOT NULL,

location VARCHAR(20),

grade INT(10) NOT NULL

);

INSERT INTO examstudent(type,idCard,examCard,studentName,location,grade)

VALUES(4,412824195263214584,‘200523164754000’,‘张锋’,‘郑州’,85),

(4,222224195263214584,‘200523164754001’,‘孙朋’,‘大连’,56),

(6,342824195263214584,‘200523164754002’,‘刘明’,‘沈阳’,75),

(6,100824195263214584,‘200523164754003’,‘赵虎’,‘哈尔滨’,95),

(4,454524195263214584,‘200523164754004’,‘杨丽’,‘北京’,64),

(4,854524195263214584,‘200523164754005’,‘王小红’,‘太原’,60);

2、将表封装为一个类

public class ExamStudent {

private int flowID; //流水号

private int type; //四六级类型

private String idCard; //身份证号

private String examCard; //学籍号

private String studentName; //学生姓名

private String location; //位置

private int grade; //成绩

public ExamStudent(int flowID, int type, String idCard, String examCard, String studentName, String location, int grade) {

this.flowID = flowID;

this.type = type;

this.idCard = idCard;

this.examCard = examCard;

this.studentName = studentName;

this.location = location;

this.grade = grade;

}

public ExamStudent() {

}

@Override

public String toString() {

return "流水号: " + flowID +

"\n四级/六级: " + type +

"\n身份证号: " + idCard +

"\n准考证号: " + examCard +

"\n学生姓名: " + studentName +

"\n区域: " + location +

"\n成绩: " + grade;

}

}

3、增删改操作:

public class ExamStudentCRUDTest {

@Test

public static void deleteUpdate() {

Scanner scanner = new Scanner(System.in);

System.out.println(“请输入您要删除的学生的考号:”);

String ope = scanner.next();

String sql = “delete from examstudent where examCard = ?”; //sql语句

int rowCount = update(sql, ope);

if (rowCount > 0) {

System.out.println(“删除成功!”);

} else {

System.out.println(“未找到此人!”);

}

}

public static void addUpdate(){

String sql=“insert into examstudent(type,idCard,examCard,studentName,location,grade) values(?,?,?,?,?,?)”;

Object []args = new Object[6];

Scanner scanner=new Scanner(System.in);

System.out.println(“请输入您要添加学生的四六级类型:”);

args[0]=scanner.next();

System.out.println(“请输入您要添加的学生的身份证号:”);

args[1] = scanner.next();

System.out.println(“请输入您要添加学生的学籍号:”);

args[2] =scanner.next();

System.out.println(“请输入您要添加学生的姓名”);

args[3]=scanner.next();

System.out.println(“请输入您要添加学生的位置:”);

args[4]=scanner.next();

System.out.println(“请输入您要添加学生的成绩:”);

args[5]=scanner.next();

int rowCount = update(sql, args);

System.out.println(rowCount>0?“添加成功!”:“添加失败!”);

}

/*通用的增删改操作

*返回为int 类型 用于判断是否增删改成功

*形参为一个可变参数

*/

public static int update(String sql, Object… args) {

Connection connection = null;

PreparedStatement preparedStatement = null;

try {

//1、获取连接

connection = JDBCUtils.getConnection();

//2、预编译sql语句

preparedStatement = connection.prepareStatement(sql);

//3、填充占位符

for (int i = 0; i < args.length; i++) {

preparedStatement.setObject(i + 1, args[i]);

}

//4、执行

/*

*preparedStatement.execute(); boolean

  • 如果执行的是查询操作,有返回结果,则此方法返回true;

  • 如果执行的是增删改操作,没有返回结果,则此方法返回false


  • preparedStatement.executeUpdate(); int

  • 返回操作影响的行数 影响行数为0即返回0

*/

return preparedStatement.executeUpdate();

} catch (Exception e) {

e.printStackTrace();

} finally {

//5、关闭资源

JDBCUtils.closeResource(connection, preparedStatement);

}

return 0;

}

}

4、查询操作:

public class ExamStudentQueryTest {

@Test

public static void testQuery() {

String sql1 = “select flowID ,type ,idCard ,examCard ,studentName ,location ,grade from examstudent where idCard=?”;

String sql2 = “select flowID ,type ,idCard ,examCard ,studentName ,location ,grade from examstudent where examCard=?”;

System.out.println(“请输入您要查询的类型:\na:身份证号\nb:准考证号\n”);

Scanner scanner = new Scanner(System.in);

String i = scanner.next();

switch (i) {

case “a”: {

System.out.println(“请输入身份证号:”);

String id = scanner.next();

ExamStudent student = query(ExamStudent.class, sql1, id);

if (student != null)

System.out.println(student);

else System.out.println(“未找到此人!”);

break;

}

case “b”: {

System.out.println(“请输入准考证号:”);

String card = scanner.next();

ExamStudent student = query(ExamStudent.class, sql2, card);

if (student != null)

System.out.println(student);

else System.out.println(“未找到此人!”);

break;

}

}

}

public static T query(Class clazz, String sql, Object… args) {

Connection connection = null;

PreparedStatement preparedStatement = null;

ResultSet resultSet = null;

try {

connection = JDBCUtils.getConnection();

preparedStatement = connection.prepareStatement(sql);

//填充占位符

for (int i = 0; i < args.length; i++) {

preparedStatement.setObject(i + 1, args[i]);

}

//执行

resultSet = preparedStatement.executeQuery();

//获取结果集的元数据

ResultSetMetaData metaData = preparedStatement.getMetaData();

//根据元数据获取列的个数

int columnCount = metaData.getColumnCount();

if (resultSet.next()) {

T t = clazz.newInstance();

for (int i = 0; i < columnCount; i++) {

//获取每列对应的字段值

Object columnValue = resultSet.getObject(i + 1);

/* //获取列的列名

String columnName = metaData.getColumnName(i + 1);*/

//获取列的别名

String columnLabel = metaData.getColumnLabel(i + 1);

Field field = clazz.getDeclaredField(columnLabel);

field.setAccessible(true);

field.set(t, columnValue);

}

return t;

}

} catch (Exception e) {

e.printStackTrace();

} finally {

JDBCUtils.closeResource(connection, preparedStatement, resultSet);

}

return null;

}

}

5、主方法测试:

public class ExamStudentOperation {

public static void main(String[] args) {

Scanner scanner = new Scanner(System.in);

System.out.println(“请输入您要进行的操作:\na:查询\nb:添加\nc:删除\n”);

String ope = scanner.next();

switch (ope) {

case “a”: {

ExamStudentQueryTest.testQuery();

言尽于此,完结

无论是一个初级的 coder,高级的程序员,还是顶级的系统架构师,应该都有深刻的领会到设计模式的重要性。

  • 第一,设计模式能让专业人之间交流方便,如下:

程序员A:这里我用了XXX设计模式

程序员B:那我大致了解你程序的设计思路了

  • 第二,易维护

项目经理:今天客户有这样一个需求…

程序员:明白了,这里我使用了XXX设计模式,所以改起来很快

  • 第三,设计模式是编程经验的总结

程序员A:B,你怎么想到要这样去构建你的代码

程序员B:在我学习了XXX设计模式之后,好像自然而然就感觉这样写能避免一些问题

  • 第四,学习设计模式并不是必须的

程序员A:B,你这段代码使用的是XXX设计模式对吗?

程序员B:不好意思,我没有学习过设计模式,但是我的经验告诉我是这样写的

image

从设计思想解读开源框架,一步一步到Spring、Spring5、SpringMVC、MyBatis等源码解读,我都已收集整理全套,篇幅有限,这块只是详细的解说了23种设计模式,整理的文件如下图一览无余!

image

搜集费时费力,能看到此处的都是真爱!
的操作:\na:查询\nb:添加\nc:删除\n");

String ope = scanner.next();

switch (ope) {

case “a”: {

ExamStudentQueryTest.testQuery();

言尽于此,完结

无论是一个初级的 coder,高级的程序员,还是顶级的系统架构师,应该都有深刻的领会到设计模式的重要性。

  • 第一,设计模式能让专业人之间交流方便,如下:

程序员A:这里我用了XXX设计模式

程序员B:那我大致了解你程序的设计思路了

  • 第二,易维护

项目经理:今天客户有这样一个需求…

程序员:明白了,这里我使用了XXX设计模式,所以改起来很快

  • 第三,设计模式是编程经验的总结

程序员A:B,你怎么想到要这样去构建你的代码

程序员B:在我学习了XXX设计模式之后,好像自然而然就感觉这样写能避免一些问题

  • 第四,学习设计模式并不是必须的

程序员A:B,你这段代码使用的是XXX设计模式对吗?

程序员B:不好意思,我没有学习过设计模式,但是我的经验告诉我是这样写的

[外链图片转存中…(img-Npup7XNe-1721161847884)]

从设计思想解读开源框架,一步一步到Spring、Spring5、SpringMVC、MyBatis等源码解读,我都已收集整理全套,篇幅有限,这块只是详细的解说了23种设计模式,整理的文件如下图一览无余!

[外链图片转存中…(img-mCcZDIVd-1721161847885)]

搜集费时费力,能看到此处的都是真爱!

  • 21
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值