JDBC进化史(七)优化之:DML语句简化处理

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语句

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值