1、JDBC就是连接数据库的接口规范,具体实现有各个厂商实现,但是接口得遵循sun公司规范,达到统一管理的作用,所以导包时涉及到接口,必须导入sun公司的接口,已方便换数据库时接口不变,代码不用改动
2、JDBC执行增删改是一个方法,因为执行这些语句时只需要返回受影响行数,然后就是往数据库执行,有很大的共同点,所以3者合一,使用一个方法executeUpdate(string sql);而查询由于返回的是结果集,不同于增删改,所以单独使用一个方法,返回的是ResultSet一个结果集,方法是executeQuery(string sql);不过JDBC还提供了一个看似功能集合了executeQuery和executeUpdate的超级方法execute(),啥都可以执行,但是实际上却很鸡肋,因为execute()返回值为bool,所以根本没任何用处,不建议使用,当需要执行批量处理时,如批量新增,批量删除,这时还提供了一个executeBatch()的方法,批处理只适用于增删改操作。
mysql的批处理功能默认是关闭的,要想mysql支持批处理,需要开启批处理支持,简单的做法就是在连接字符串后加上
3、DAO层的时间都必须使用sql包下的时间,因为其直接对应数据库时间类型,但是其他层由于是Java使用,所以不能使用sql下的date,而必须使用util下的date,这样就需要这两者之间进行转换,而由于util.date是sql.date的父类,所以父类可以直接接收子类,这个可以直接转换,但是sql.date不能直接转为util.date,必须使用毫秒值这个中间变量才能实现转换,如下:
4、JDBC中事务:事务的开启和提交都是通过Connection对象完成
事务的一致性,是通过Connection完成的,所以如果在多个方法中执行了多条语句,那么必须保证调用的多个方法使用的Connection是同一个,但是Connection是DAO层的,而不应该出现在Service层传递到所有DAO调用的方法中,通过这种错误的方式来保证Connection是同一个对象,这时就得转换一下思路,DAO层的东西让他们自己去保证唯一性,而且还必须是线程的唯一性,不能和别的用户混在一起去了,这时就得用到ThreadLocal类,ThreadLocal类就相当于一个单独的容器,内部是一个Map<Thread, T>,键是当前线程名,也就对应只能存一个value,但是value可以再存Map,所以不存在空间不足问题,每个线程可以自己new一份,各个线程独立往里面存和取,这样线程间就不会干预,也就不存在线程并发问题。
与数据库直接相关的对象,要求由Dao层创建,Service只负责处理业务,但是Service可以调用Dao层的方法进行设置以方便dao层数据对象的创建。且借助ThreadLocal类保证线程中对象独立,以免并发访问时出错: