Spring JDBC的优雅设计 - 数据转换

本文分析了原生JDBC在处理数据转换时的不便,并展示了Spring JDBC如何通过BeanPropertyRowMapper简化这一过程。BeanPropertyRowMapper通过简单的列名与属性名映射和内置的类型转换,实现了从ResultSet到Java对象的自动化转换。同时,文中还讨论了自定义映射策略的可能性。
摘要由CSDN通过智能技术生成

原生JDBC之痛

在上一篇中分析了Java里的JDBC规范,规范里面的抽象设计的确实很优雅。但是规范这种东西嘛,比较形而上,实际在项目中使用起来,还是挺繁琐。
举个栗子
下面是使用JDBC查询课程表的代码:

    /**
	 * 查询课程
	 * course表 列{id, name, type, score, desc}
	 */
	public List<Course> findCourseList(){
   
		String sql = "select * from course order by course_id";
		Connection conn = null;
		PreparedStatement pstmt = null;
		ResultSet rs = null;
		//创建一个集合对象用来存放查询到的数据
		List<Course> courseList = new ArrayList<>();
		try {
   
			conn = DbUtil.getConnection();
			pstmt = (PreparedStatement) conn.prepareStatement(sql);
			rs = (ResultSet) pstmt.executeQuery();
			while (rs.next()){
   
				int courseId = rs.getInt("id");
				String courseName = rs.getString("name");
				//每个记录对应一个对象
				Course course = new Course();
				course.setId(courseId);
				course.setName(courseName);
				// 省略...
				//将对象放到集合中
				courseList.add(course);
			}
		} catch (SQLException e) {
   
			// TODO: handle exception
			e.printStackTrace();
		}finally{
   
			DbUtil.close(pstmt);
			DbUtil.close(conn);		//必须关闭
		}
		return courseList;
	}

从上面的代码,我们可以看出不方便的几处:

  1. 要自己处理结果集,将每行数据封装成实体对象Course
  2. 要自己处理各种异常。如果报错信息要精确,比如网络超时,查询条件有问题等等,还要自己处理
    SQLException,根据里面的状态码来获得更详细的报错信息
  3. 要自己管理数据库资源,比如连接,Statement。每次都能去获取一个连接,用完再手动关闭。

Spring框架对JDBC做了一层封装,提供了一套更加简洁优雅的调用方式,帮我们免去了上面那些繁琐的操作。在欣赏Spring JDBC之前呢,老规矩,先看看蘑菇君会怎么去解决这些问题(~ ̄▽ ̄)~ 。好,又到了见证翻车的时刻了~

这一篇先分析数据转化,也就是上面的第一点,如何优雅的处理结果集,将每行数据封装成实体对象。

蘑菇君翻车时刻

在上面的代码中,从ResultSet中读取出一行数据,我们是手动创建一个Course的实体对象,然后将行数据的每一列跟Course类中的属性映射起来。

细细品味这句话,将数据库每行的数据跟对象的属性映射起来。蘑菇君首先想到的是,这个行为不就可以抽象成一个接口么?具体怎么个映射法,那就是这个接口的实现类们该干的事儿。那这个接口的输入输出是啥呢

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值