JDBC—04—JDBC动态查询;应用程序分层;封装通用的BaseDao;JDBC驱动加载原理;

 


 

一. JDBC动态查询

动态查询:根据用户给定的条件来决定执行什么样的查询。

 

 

2. 应用程序分层

2.1什么是应用程序分层

应用程序通过创建不同的 包 来实现项目的分层,将项目中的代码根据功能做具体划分,并存放在不同的包下。

2.2分层优点

  1、分层结构将应用系统划分为若干层,每一层只解决问题的一部分,通过各层的协作

  提供整体解决方案。大的问题被分解为一系列相对独立的子问题,局部化在每一层中,这样

  就有效的降低了单个问题的规模和复杂度,实现了复杂系统的第一步也是最为关键的一步分

  解。

  2、分层结构具有良好的可扩展性,为应用系统的演化增长提供了一个灵活的支持,具

  有良好的可扩展性。增加新的功能时,无须对现有的代码做修改,业务逻辑可以得到最大限

  度的重用。

  3、分层架构易于维护。在对系统进行分解后,不同的功能被封装在不同的层中,层与

  层之间的耦合显著降低。因此在修改某个层的代码时,只要不涉及层与层之间的接口,就不

  会对其他层造成严重影响。

2.3三层结构

三层结构就是将整个业务应用划分为:

  • 界面层(User Interface layer)
  • 业务逻辑层service层(Business Logic Layer)
  • 数据访问层Dao层(Data access layer)

区分层次的目的即为了“高内聚低耦合”的思想。在软件体系架构设计中,分层式结构是最常见,也是最重要的一种结构。

 

 

3. 封装通用的 BaseDao

3.1封装更新操作

不同的表, 要有不同的dao层接口;
然后dao层接口,还要有一个共有的basedao接口 (由此可以看出, basedao接口更加抽象!)

basedao接口的实现类:

 

 

TablenameDao接口的实现类:

TablenameDaoImpl类, 对表的 增删改 这三种操作, 都可以只调用BaseDaoImpl类的update方法就可以完成!

 TablenameService接口的实现类:

 

 

3.2封装查询操作

3.2.1代码BaseDao 接口

public interface BaseDao {

public int executeUpdate(String sql,Object[] param);

public List find(String sql,Object[] param,Class

clazz);

}



BaseDaoImpl 接口实现类

@Override

public List select(String sql, Object[] param, Class clazz) 
{ Connection conn
=null; PreparedStatement ps =null; ResultSet rs = null; List list = new ArrayList<>(); try{
  conn = JdbcUtil.getConnection();   ps = conn.prepareStatement(sql);   //得到参数的个数   ParameterMetaData pmd = ps.getParameterMetaData();   //绑定参数   for(int i=0;i<pmd.getParameterCount();i++){   ps.setObject(i+1, param[i]); } //处理结果集 rs = ps.executeQuery(); //获取结果集的信息 ResultSetMetaData rsmd = rs.getMetaData(); while(rs.next()){   //完成 ORM 处理:通过 jdk 的反射   T bean =clazz.newInstance();//Departmens d = new Department();   for(int i=0;i<rsmd.getColumnCount();i++){   //得到列名   String columnName = rsmd.getColumnName(i+1);   //获取列的值   Object value = rs.getObject(columnName);   //通过 BeanUtil 工具类将值当如到对象中   BeanUtils.setProperty(bean, columnName, value); } list.add(bean); } }catch(Exception e){ e.printStackTrace(); }finally{ JdbcUtil.closeResource(ps, conn, rs); } return list; } DepartmentDao 接口 public interface DepartmentsDao extends BaseDao
{
  public List selectDeptByLikeName(String deptName); }

DepartmentDaoImpl 接口实现类 @Override
public List selectDeptByLikeName(String deptName){ String sql ="select * from departments where department_name like ?"; Object[] param = new Object[]{"%"+deptName+"%"}; return super.select(sql, param, Dept.class); }

 

 

4. JDBC 驱动加载原理

4.1创建对象的方式

4.2创建对象时,JVM要进行的三个重要的步骤

  • 通过类加载器加载 class, 即把在磁盘中的类加载到内存中;
  • 初始化所有静态部分
  • 为新生对象分配内存

4.3MySQL 驱动类的实例化过程

 

  •  当我们注册驱动,即加载这段代码---class.forname(com.mysql.cj.jdbc.Driver)时,  我们使用jdk的反射机制成功的加载了实现的java.sql.Driver接口的(mysql自己实现的)Driver实现类; 然后Driver类的static代码块被执行, 然后new了一个Driver对象给了Driver Manager;

  •  一般情况下,在应用程序中进数据库连接,调用JDBC接口,首先要将具体哪一个数据库厂商的JDBC驱动实现加载到系统内存中,然后供系统使用。
  • 驱动加载入内存的过程:   驱动,其实就是实现了 java.sql.Driver接口的类。本质上还是一个class,将驱动加载到内存和加载普通的class原理是一样的:使用Class.forName("包名+类名");
  • 加装mysql驱动:  一般我们操作Driver,获取Connection对象都是交给统一管理的。DriverManger可以注册和删除加载的驱动程序,可以根据给定的协议,获取符合协议的驱动Driver或者是建立Conenction连接,进行数据库交互。

 

 

 

posted @ 2019-09-29 20:08  Eric-Shen  阅读(361)  评论(0编辑  收藏  举报