SQL语句中的DML语句(数据操作语言)包含INSERT/DELETE/UPDATE(增删改)三种操作。
思考:JDBC能简化成什么样?
在前文中,咱们在忽略技术实现的角度一起思考了JDBC的执行步骤,笔者觉得,真正方便操作的程序应该是这样的:
1.提供/定义SQL语句
2.执行SQL
在原始JDBC中,DML语句存在大量重复代码。为了完成简化处理,本篇将基于责任划分体系思想。并通过封装的方式,将代码初步简化。
基于责任划分体系,将DML操作划分为两个责任部分:
基于业务需要:完成SQL语句的设计
基于技术实现:完成SQL语句的执行
开始优化尝试
1.在进行优化之前,我们新建一个Java项目
本篇中仅进行初步简化处理,在后文中将逐步使用本篇中未使用的项目目录。
2.在src/com.services.init目录下新建StudentServicesInit类,在这个类中尝试封装如下:
StudentServicesInit.java
/*****************************************************************
* DML操作的简化处理
*****************************************************************/
//在此处完成JDBC的技术实现
public boolean executeUpdate(String sql,Object...args)throws Exception
{
//1.定义JDBC接口变量
Connection conn = null;
PreparedStatement pstm = null;
try
{
//2.创建连接
conn = DBUtils.getConnection();
//3.预编译sql(原步骤3定义SQL将通过参数传递得到)
pstm = conn.prepareStatement(sql);
//4.参数赋值
int index = 1;
for(Object param:args)
{
pstm.setObject(index++, param);
}
//5.执行SQL语句
return pstm.executeUpdate()>0;
}
finally
{
DBUtils.close(pstm);
DBUtils.close(conn);
}
}
3.书写添加学生方法,调用封装好的DML操作类
StudentServicesInit.java
//添加学生
public boolean addStudent(Object...val)throws Exception
{
//1.基于业务需要,设计SQL语句
StringBuilder sql = new StringBuilder()
.append("INSERT INTO STUDENT(STUID,SNAME,SDATE,SCORE,MEMO)")
.append(" VALUES(S_STU.NEXTVAL,?,TO_DATE(?,'YYYY-MM-DD'),?,?)");
//2.完成业务实现,执行SQL语句
return this.executeUpdate(sql.toString(), val);
}
4.在测试类中完成添加学生测试
StudentServicesInit.java
//添加学生
public static void addStudentTest() throws Exception
{
StudentServicesInit services = new StudentServicesInit();
//INSERT INTO STUDENT(STUID,SNAME,SDATE,SCORE,MEMO)
Object val[] = {"孙悟空","2000-1-1","95","优秀的00后"};
String msg = services.addStudent(val)?"添加成功!":"添加失败!";
System.out.println(msg);
}
结果通过,我们添加了新时代优秀的00后孙悟空同学!
补充:DML操作
通过调用封装好的DLM操作类,极大的削减了JDBC操作的代码量,这就是稳定性封装的魅力!
既然代码量小了,那么把其他的操作方式也补上吧!
添加学生
//添加学生
public boolean addStudent(Object...val)throws Exception
{
//1.基于业务需要,设计SQL语句
StringBuilder sql = new StringBuilder()
.append("INSERT INTO STUDENT(STUID,SNAME,SDATE,SCORE,MEMO)")
.append(" VALUES(S_STU.NEXTVAL,?,TO_DATE(?,'YYYY-MM-DD'),?,?)");
//2.完成业务实现,执行SQL语句
return this.executeUpdate(sql.toString(), val);
}
删除学生
//删除学生
public boolean delStudent(Object...val)throws Exception
{
//1.设计SQL语句
String sql = "DELETE FROM STUDENT WHERE STUID=?";
//2.执行SQL
return this.executeUpdate(sql, val);
}
修改学生
//修改学生
public boolean modifyStudent(Object...val)throws Exception
{
//1.设计SQL语句
StringBuilder sql = new StringBuilder()
.append("UPDATE STUDENT")
.append(" SET SCORE=?")
.append(" WHERE STUID=?");
//2.执行sql
return this.executeUpdate(sql.toString(), val);
}
看,我们已经完成了对DML操作的简化!
看到这里,可能有些人会觉得自己有些混乱的…那再画个图解释说明一下吧!
以添加操作为例:
测试方法addStudentInitTest():提供我们想要添加的数据
共有操作方法executeUpdate():封装DML操作中的公用步骤
操作方法addStudent():提供sql语句,从测试方法中得到数据。通过调用共有方法,执行sql语句