一. 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!");
}