ORM
从数据库查询到的结果集resultset在进行遍历时,逐行遍历,取出的都是零散的数据,
在实际应用开发过程中,我们需要将零散的数据进行封装整理
实体类(entity):零散数据的载体
entity 实体类
类名 = 表名; 属性名 = 列名
- 一行数据中,多个零散的数据进行整理
- 通过entity的规则对表中数据进行对象的封装
- 表名 = 类名 ; 列名 = 属性 ; 提供各属性的get,set方法
- 提供无参构造方法,(视情况添加有参构造)
DAO数据访问对象(DATA ACCESS OBJECT)
DAO实现了业务逻辑与数据库访问相分离
对同一张表的所有操作封装在xxxDaoimpl对象中
根据增删改查的不同功能实现具体的方法(INSERT ,UPDATE,DELETE,SELECT,SELECTALL)
Date工具类
- 现有的问题:数据库存储的数据类型为java.sql.Date,
而我们java应用层存储日期类型为java.util.Date,
当我们用java应用程序插入带有日期的数据到数据库中时,需要进行转换。
- 12.1 java.util.Date
java语言常规应用层面的日期类型,可以通过字符串创建对应的时间对象
无法直接通过JDBC插入到数据库
- 12.2 java.sql.Date
不可以通过字符串创建对应的时间对象,
只能通过毫秒值创建对象(1970年至今的毫秒值)
可以直接通过JDBC插入到数据库
- 12.3 SimpleDateFormat
格式化和解析日期的具体类,允许进行格式化(日期->文本),
解析(文本->日期)和规范化
业务
业务代表用户完成的一个业务功能,
可以由一个或多个DAO的调用组成,
(软件所提供的一个功能都叫业务)
使用事务控制转账程序
使用事务出现的问题:
得到的连接不同导致事务关闭的连接不只一个。
- 解决方案1:传递Connection
为了解决线程中connection对象不同步的问题,
可以将connection对象传递给每个DAO方法。
传递的问题
如果使用传递connection,容易造成接口污染(BadSmell),
定义接口是为了更容易更换实现,
而将connection定义在接口中,
会造成污染当前接口- 解决方案2:ThreadLocal
可以将整个线程(单线程)中,存储一个共享值。
线程拥有一个类似Map的属性,键值对结构<ThreadLocal对象,值>。
Service层实现业务控制
三层架构
三层架构
1.表示层
命名:xxxView
职责:收集用户的数据和需求 展示数据。
2.业务逻辑层:
命名:xxxServiceImpl
职责:数据加工处理,调用DAO完成业务实现,控制事务。
3.数据访问层
命名:xxxDaoImpl
职责:向业务层提供数据,将业务层加工后的数据同步到数据库。
三层架构项目搭建(按开发步骤)
- utils 存放工具类(DBUtils)
- entity 存放实体类(Person)
- dao 存放DAO接口(PersonDao)
impl 存放DAO接口实现类(PersonDaoImpl)- service 存放service接口(PersonService)
impl 存放service接口实现类(PersonServiceImpl)- view 存放程序启动项目(main)
程序设计时 考虑易修改,易扩展,为service层和DAO层设计接口,便于未来更换实现类
** DaoUtils**
在DAO层中,对数据库表的增删改查操作存在代码的冗余,
可以对其进行抽取封装DaoUtils工具类实现复用
Druid连接池
在程序初始化时,预先创建指定数量的数据库连接对象存储在池中。
当需要连接数据库时,从连接池中取出现有连接;
使用完毕后,也不会进行关闭,而是放回池中,实现复用,节约资源。
Druid连接池使用步骤
.创建database properties配置文件,
.引入Druid-1.1.5.jar文件
Apache的DBUtils使用
Commons DBUtils 是Apache组织提供的一个对JDBC进行简单封装的开源工具类库
使用它能够简化JDBC应用程序的开发!同时,不会影响程序的性能
DBUtils是java编程中数据库操作实用小工具,小巧,简单,实用
- 对于数据表的查询操作,可以把结果转换为list,array,set等集合,便于操作
- 对于数据表的DML操作,也变得很简单(只需要写SQL语句);
DBUtils主要包含
- ResultSetHandler接口:转换类型接口
-BeanHandler类:实现类,把一条记录转换成对象
-BeanListHandler类:实现类,把多条记录转换成List集合。
-ScalarHandler类:实现类,适合获取一行一列的数据。- QueryRunner:执行SQL语句的类
-增、删、改:update();
-查询:query();