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:不好意思,我没有学习过设计模式,但是我的经验告诉我是这样写的
从设计思想解读开源框架,一步一步到Spring、Spring5、SpringMVC、MyBatis等源码解读,我都已收集整理全套,篇幅有限,这块只是详细的解说了23种设计模式,整理的文件如下图一览无余!
搜集费时费力,能看到此处的都是真爱!
的操作:\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)]
搜集费时费力,能看到此处的都是真爱!