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

 


 

 

一. JDBC动态查询

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

1.1代码

//动态查询

public List selectDeptByProperty(Departments

departments){

Connection conn =null;

PreparedStatement ps =null;

ResultSet rs = null;

List list = new ArrayList<>();

try{

conn =JdbcUtil.getConnection();

String sql = genSQL(departments);

System.out.println(sql);

ps = conn.prepareStatement(sql);

rs = ps.executeQuery();

while(rs.next()){

Departments dept = new Departments();

dept.setDepartmentId(rs.getInt("department_id"));

dept.setDepartmentName(rs.getString("department_name"));

dept.setLocationId(rs.getInt("location_id"));

list.add(dept);

}

}catch(Exception e){

e.printStackTrace();

}finally{

JdbcUtil.closeResource(ps, conn, rs);

}

return list;

}

//拼接需要执行的 sql 语句

private String genSQL(Departments dept){

StringBuffer sb = new StringBuffer("select * from departments where 1=1 ");

if(dept.getDepartmentId() > 0){

sb.append(" and department_id =

").append(dept.getDepartmentId());

}

if(dept.getDepartmentName() != null &&

dept.getDepartmentName().length() > 0){

sb.append(" and department_name =

'").append(dept.getDepartmentName()).append("'");

}if(dept.getLocationId() > 0){

sb.append(" and location_id =

").append(dept.getLocationId());

}

return sb.toString();

}

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 find(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 selectDeptByName(String

deptName);

public void insertDept(Departments dept);

public int updateDept(Departments dept);

public int deleteDeptById(int departmentId);

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 this.find(sql, param, Dept.class);

}

4. JDBC 驱动加载原理

4.1创建对象的方式

4.2创建对象时三个重要的步骤

•通过类加载器加载 class

•初始化所有静态部分

•为新生对象分配内存

4.3MySQL 驱动类的实例化过程

static {

try {

java.sql.DriverManager.registerDriver(new Driver());

} catch (SQLException E) {

throw new RuntimeException("Can't register driver!");

猜你喜欢

转载自www.cnblogs.com/EricShen/p/11573751.html