dede实站仿制政府网站手游推广平台代理
第55次(JDBC)
学习主题:JDBC
学习目标:
1 掌握PreparedStatement的使用
2 掌握orm思想
3 掌握分层开发思想
4 掌握jdbc的crud
1. JDBC_PreparedStatement插入大量数据_批处理插入_效率比较
(1) jdbc新增大量数据时, 如何处理能提高效率?
利用PreparedStatement的addBatch和executeBatch方法对数据进行批处理。
(2) 什么是批处理? JDBC如何进行批处理?
在与数据库的一次连接中,批量的执行多条SQL语句。使用addBatch方法添加sql语句,executeBatch方法对数据进行批量操作。
2. JDBC_ORM_使用Map封装查询记录
(1) 什么是ORM?
对象关系映射(Object Relational Mapping),是一种程序技术,用于实现面向对象编程语言里不同类型系统的数据之间的转换。从效果上说,它其实是创建了一个可在编程语言里使用的--“虚拟对象数据库”。
(2) ORM解决的主要问题是什么?
ORM解决的主要问题是对象关系映射。域模型和关系。域模型和关系模型分别是建立在概念模型的基础上的。域模型是面向对象的,而关系模型是面向关系的。一般情况下,一个持久化类和一个表对应,类的每个实例对应表中的一条记录,类的每个属性对应表的每个字段。
3. JDBC_ORM_认识分层开发_包结构
(1) 什么是分层开发, 为什么要进行分层开发?
应用程序通过创建不同的包来实现项目的分层,将项目中的代码根据功能做具体划分,并存放在不同的包下。
1. 分层结构将应用系统划分为若干层,每一层只解决问题的一部分,通过各层的协作提供整体解决方案。大的问题被分解为一系列相对独立的子问题,局部化在每一层中,这样就有效的降低了单个问题的规模和复杂度,实现了复杂系统的第一步也是最为关键的一步分解。
2. 分层结构具有良好的可扩展性,为应用系统的演化增长提供了一个灵活的支持,具有良好的可扩展性。增加新的功能时,无须对现有的代码做修改,业务逻辑可以得到最大限度的重用。
3. 分层架构易于维护。在对系统进行分解后,不同的共功能将被封装在不同的层中,层与层之间的耦合显著降低。因此在修改某个层的代码时,只要不涉及层与层之间的接口,就不会对其他层造成严重影响。
(2) 代码的分层是通过包(package)来区分的, 列举各层常见的包名?
数据访问层:dao包、业务层:service包、模型层:pojo包、工具:commons
4. JDBC_分层开发_环境搭建
(1) 什么是POJO?
POJO(Plain Ordinary Java Object)简单的Java对象,实际就是普通JavaBeans,是为了避免和EJB混淆所创造的简称。
(2) 实体类有哪些特点?
1. 实体类的属性一般使用private修饰
2. 根据业务需要和封装性要求对实体类的属性提供get/set方法,负责属性的读取和赋值,一般用public修饰
3. 实体类提供无参构造方法,根据业务需要提供相应的有参构造方法
4. 实体类最好实现java.io.Serializable接口,支持序列化机制,可以将该对象转换成字节序列而保存在磁盘上或在网络上传输
5. 如果实体类实现了java.io.Serializable接口,就应该定义属性serialVersionUID,解决不同版本之间的序列化问题
5. 分层开发_抽取BaseDao_封装update方法
(1) 代码抽取有几种方式? 应该遵循什么原则?
抽取方法、抽取类。
1. DRY(Don’t repeat yourself)
不要重复自己。多次遇到同样的问题,就应该抽象出一个通用的解决方法,而不是重复同样的代码。
2. YAGNI(You aren’t gonna need it)
你不会需要它。除了最核心的功能,其他功能一概不要部署,尽可能快、尽可能简单地让软件运行起来。即不要为了抽象而抽象,不要让代码一开始就变成华而不实的空中楼阁。
3. Rule of Three
三次原则。第一次用到某个功能时,你写一个特定的解决方案;第二次又用到的时候,你拷贝上一次的代码;第三次出现的时候,你才着手“抽象化”,写出通用的解决方法。
理由:1、 省事。如果一种功能一到两个地方会用到,就不需要在“抽象化”上面耗费时间了。2、 容易发现模式。“抽象化”需要找到问题的模式,问题出现的场合越多,就越容易看出模式,从而可以更准确地“抽象化”。3、 防止过度冗余。如果一种功能同时有多个实现,管理起来非常麻烦,修改的时候需要修改多出。在实际工作中,重复实现最多可以容忍出现一次,再多就无法接受了。
6. 分层开发_完成增删改操作
(1) JDBC实现增删改操作时有哪些注意事项?
1. 插入大量数据时要使用批处理。
2. 进行事务管理,记得要提交事务commit,出异常时,要在catch语句中回滚rollback。
3. sql语句中的参数记得赋值。
4. 要关闭ResultSet、Statement、Connection资源。
(2) 简述JDBC中对事务的管理方式.
首先开启事务,然后执行DML操作,如果所有的DML操作都正确执行,则使用commit提交事务;如果有的DML操作不能正确执行,则捕获该异常,跳过commit提交事务语句,在catch语句块中使用rollback回滚事务。
7. 分层开发_查询_添加操作


#配置文件
driver = com.mysql.jdbc.Driver
url = jdbc:mysql://localhost:3306/test1?useUnicode=true&characterEncoding=utf-8
user = root
pwd =123
package com.abc.pojo;
/*** 数据模型* 用来存放数据库中Departments表中的数据* @author Administrator**/
public class Departments {private int department_id;private String department_name;private int location_id;public int getDepartment_id() {return department_id;}public void setDepartment_id(int department_id) {this.department_id = department_id;}public String getDepartment_name() {return department_name;}public void setDepartment_name(String department_name) {this.department_name = department_name;}public int getLocation_id() {return location_id;}public void setLocation_id(int location_id) {this.location_id = location_id;}public Departments(String department_name, int location_id) {super();this.department_name = department_name;this.location_id = location_id;}public Departments() {super();}@Overridepublic String toString() {return "Departments [department_id=" + department_id+ ", department_name=" + department_name + ", location_id="+ location_id + "]";}
}
JdbcUtil
package com.abc.commons;import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.util.ResourceBundle;import com.mysql.jdbc.Driver;public class JdbcUtil {private static String driver;private static String url;private static String user;private static String pwd;static{//加载配置文件ResourceBundle rb = ResourceBundle.getBundle("jdbc");//参数初始化driver = rb.getString("driver");url = rb.getString("url");user = rb.getString("user");pwd = rb.getString("pwd");try {//加载驱动类Class.forName(driver);} catch (ClassNotFoundException e) {e.printStackTrace();}}public static Connection getConnection(){Connection conn = null;try {//创建数据库连接conn = DriverManager.getConnection(url,user,pwd);} catch (SQLException e) {e.printStackTrace();}return conn;}//关闭资源public static void closeResource(AutoCloseable...autoCloseables){for(AutoCloseable ac:autoCloseables){if(ac!=null){try {ac.close();} catch (Exception e) {e.printStackTrace();}}}}public static void rollback(Connection conn){if(conn!=null){try {conn.rollback();} catch (SQLException e) {e.printStackTrace();}}}}
DepartmentDap接口
package com.abc.dao;import java.util.List;import com.abc.pojo.Departments;public interface DepartmentDao {/*** 添加一个部门* @param dept* @return*/public int insertDept(Departments dept);public int deleteByDeptId(int dept_id);public int updateByDeptId(int dept_id,String dept_name,int loc_id);/*** 根据名字查找部门* @param dept_name* @return*/public List<Departments> selectByDeptLikeName(String dept_name);}
DepartmentDao接口的实现类
package com.abc.dao.impl;import java.util.List;import com.abc.dao.DepartmentDao;
import com.abc.pojo.Departments;public class DepartmentDaoImpl extends BaseDaoImpl implements DepartmentDao {@Overridepublic int insertDept(Departments dept) {String sql = "insert into departments values(default,?,?)";Object[] obj = new Object[]{dept.getDepartment_name(),dept.getLocation_id()};return this.update(sql, obj);}@Overridepublic int deleteByDeptId(int dept_id) {return 0;}@Overridepublic int updateByDeptId(int dept_id, String dept_name, int loc_id) {return 0;}@Overridepublic List<Departments> selectByDeptLikeName(String dept_name) {String sql = "select * from departments where department_name like ?";Object[] obj = new Object[]{"%"+dept_name+"%"};return this.select(sql, obj, Departments.class);}}
BaseDao接口(实现通用的DML方法)
package com.abc.dao;import java.util.List;public interface BaseDao {public int update(String sql,Object[] param);public <T> List<T> select(String sql,Object[] param,Class<T> clazz);}
BaseDao的实现类
package com.abc.dao.impl;import java.lang.reflect.InvocationTargetException;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.ResultSetMetaData;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;import org.apache.commons.beanutils.BeanUtils;import com.abc.commons.JdbcUtil;
import com.abc.dao.BaseDao;public class BaseDaoImpl implements BaseDao {@Overridepublic int update(String sql,Object[] param) {Connection conn = null;PreparedStatement ps = null;int flag = -1;try {conn = JdbcUtil.getConnection();conn.setAutoCommit(false);ps = conn.prepareStatement(sql);for(int i=0;i<param.length;i++){ps.setObject(i+1, param[i]);}flag=ps.executeUpdate();conn.commit();} catch (SQLException e) {JdbcUtil.rollback(conn);e.printStackTrace();}finally{JdbcUtil.closeResource(ps,conn);}return flag;}@Overridepublic <T> List<T> select(String sql, Object[] param, Class<T> clazz) {Connection conn = null;PreparedStatement ps = null;ResultSet rs = null;List<T> list = new ArrayList<T>();try {conn = JdbcUtil.getConnection();ps = conn.prepareStatement(sql);for(int i=0;i<param.length;i++){ps.setObject(i+1, param[i]);}//处理结果集rs = ps.executeQuery();while(rs.next()){//完成ORM处理,通过jdk反射T bean = clazz.newInstance();//获取结果集的信息ResultSetMetaData rsmd = rs.getMetaData();for(int i=0;i<rsmd.getColumnCount();i++){//得到列名String colName = rsmd.getColumnName(i+1);BeanUtils.setProperty(bean, colName, rs.getObject(colName));}list.add(bean);}} catch (Exception e) {e.printStackTrace();} finally{JdbcUtil.closeResource(ps,conn,rs);}return list;}
}
DepartmentService接口
package com.abc.service;import java.util.List;import com.abc.pojo.Departments;public interface DepartmentService {//增public int addDept(Departments dept);//删public int removeDeptById(int dept_id);//改public int modifyDeptById(int dept_id,String dept_name,int loc_id);//查public List<Departments> findByLikeName(String like_name);
}
DepartmentService的实现类
package com.abc.service.impl;import java.util.List;import com.abc.dao.DepartmentDao;
import com.abc.dao.impl.DepartmentDaoImpl;
import com.abc.pojo.Departments;
import com.abc.service.DepartmentService;public class DepartmentServiceImpl implements DepartmentService {@Overridepublic int addDept(Departments dept) {DepartmentDao departmentDao = new DepartmentDaoImpl();return departmentDao.insertDept(dept);}@Overridepublic int removeDeptById(int dept_id) {return 0;}@Overridepublic int modifyDeptById(int dept_id, String dept_name, int loc_id) {return 0;}@Overridepublic List<Departments> findByLikeName(String like_name) {DepartmentDao departmentDao = new DepartmentDaoImpl();return departmentDao.selectByDeptLikeName(like_name);}
}
Test
package com.abc.test;import java.util.List;import com.abc.pojo.Departments;
import com.abc.service.DepartmentService;
import com.abc.service.impl.DepartmentServiceImpl;public class Test {public static void main(String[] args) {DepartmentService departmentService = new DepartmentServiceImpl();int flag=departmentService.addDept(new Departments("教务部",80));System.out.println(flag);/*查找数据*//*List<Departments> list = departmentService.findByLikeName("财务");for(Departments d:list){System.out.println(d);}*/}
}
8. 分层开发_使用BeanUtils封装查询方法
(1) 如何理解java的反射机制?
JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意方法和属性;这种动态获取信息以及动态调用对象方法的功能称为java语言的反射机制。
(2) ResultSetMetaData有什么功能?
getColumnCount(); 返回 ResultSet 中的列数。
getColumnName(int); 返回列序号为 int 的列名。
getColumnLabel(int); 返回此列暗含的标签。
isCurrency(int); 如果此列包含带有货币单位的一个数字,则返回 true。
isReadOnly(int); 如果此列为只读,则返回 true。
isAutoIncrement(int); 如果此列自动递增,则返回 true。这类列通常为键,而且始终是只读的。
getColumnType(int); 返回此列的 SQL 数据类型。