化简jdbc 编写

在不用Hibernate 域 IBATIS等框架写DAO一般都像如下:
public void save(Bean bean){
Connection con = null;
Statement stmt = null;

try{
//从连接工厂获取连接
con = ConnectionFactory.getConnection();
stmt = con.createStatement();
String sql = "insert ....";
stmt.execute(sql);
}catch(Exception e){

}finally{
//释放资源
try{
if(con != null)con.close();
if(stmt != null)stmt.close();
}catch(Exception e){

}
}
}
上面是一个保存的方法,其它的删除,查询和更新基本都差不多,不同的只有sql和执行的方法:execute域executeQuery,查询时会多了一个返回值
那么就是说在增删查改会有大量代码重复,所以我每次在不用框架下看写完的DAO都会比较不爽
昨天把那些重复的代码抽离出来,重复代码抽离后的DAO如下:
public class StudentDAO {
......
......
......
public void add(Statement stmt, Map map){
String sql = "insert into student(name, sex, age)"
+ " values('" + (String)map.get("name")
+ "', '" + (String)map.get("sex")
+ "', " + (String)map.get("age") + ")";
try{
stmt.execute(sql);
}catch(Exception e){
e.printStackTrace();
}
}
.......
.......
.......
}
只需要编写必要的代码,那些重复的代码都被我抽到别的类统一调用

下面是完整代码:

Student Bean
----------------------------------------------------------------------------------
public class Student {

private int id;

private String name;

private String sex;

private int age;

public int getAge() {
return age;
}

public void setAge(int age) {
this.age = age;
}

public int getId() {
return id;
}

public void setId(int id) {
this.id = id;
}

public String getName() {
return name;
}

public void setName(String name) {
this.name = name;
}

public String getSex() {
return sex;
}

public void setSex(String sex) {
this.sex = sex;
}

public Map toMap(){
Map map = new HashMap();
map.put("id", String.valueOf(id));
map.put("name", name);
map.put("sex", sex);
map.put("age", String.valueOf(age));

return map;
}

}

IBuilder 类建造器接口
---------------------------------------------------------------------------------
public interface IBuilder {

public void build(ResultSet rs) throws SQLException;

public Object getResult();

}

StudentBuilder 学生类的建造器
---------------------------------------------------------------------------------
public class StudentBuilder implements IBuilder{

private Student student = new Student();

public void build(ResultSet rs) throws SQLException{
// TODO Auto-generated method stub
student.setId(rs.getInt("id"));
student.setName(rs.getString("name"));
student.setSex(rs.getString("sex"));
student.setAge(rs.getInt("age"));
}

public Object getResult() {
// TODO Auto-generated method stub
return student;
}

}

StudentDAO student表的操作DAO
---------------------------------------------------------------------------------
public class StudentDAO {

private static StudentDAO instance = new StudentDAO();

private StudentDAO(){

}

public static StudentDAO getInstance(){
return instance;
}

public void add(Statement stmt, Map map){
String sql = "insert into student(name, sex, age)"
+ " values('" + (String)map.get("name")
+ "', '" + (String)map.get("sex")
+ "', " + (String)map.get("age") + ")";
try{
stmt.execute(sql);
}catch(Exception e){
e.printStackTrace();
}
}

public void delete(Statement stmt, Map map){
String sql = "delete from student"
+ " where id = " + (String)map.get("id");
try{
stmt.execute(sql);
}catch(Exception e){
e.printStackTrace();
}
}

public ResultSet query(Statement stmt, Map map){
ResultSet rs = null;
String sql = "select * from student"
+ " where name='" + (String)map.get("name") + "'";
try{
rs = stmt.executeQuery(sql);
}catch(Exception e){
e.printStackTrace();
}

return rs;
}

public ResultSet queryById(Statement stmt, Map map){
ResultSet rs = null;
String sql = "select * from student"
+ " where id=" + (String)map.get("id");
try{
rs = stmt.executeQuery(sql);
}catch(Exception e){
e.printStackTrace();
}

return rs;
}

public void update(Statement stmt, Map map){
String sql = "update student"
+ " set name = '" + (String)map.get("name")
+ "', sex = '" + (String)map.get("sex")
+ "', age = " + (String)map.get("age")
+ " where id = " + (String)map.get("id");
try{
stmt.execute(sql);
}catch(Exception e){
e.printStackTrace();
}
}

}

IBuilderFactory 类建造器工厂接口
----------------------------------------------------------------------------------
public interface IBuilderFactory {

public IBuilder getBuilder(Class classType);

}

BuilderFactory 类建造器工厂实现类
----------------------------------------------------------------------------------
public class BuilderFactory implements IBuilderFactory {

public IBuilder getBuilder(Class classType) {
// TODO Auto-generated method stub
IBuilder builder = null;

try{
builder = (IBuilder)Class.forName(classType.getName()).newInstance();
}catch(Exception e){
e.printStackTrace();
}

return builder;
}

}

IConnectionFactory 连接工厂接口
---------------------------------------------------------------------------------
public interface IConnectionFactory {


public Connection getConnection() throws SQLException, ClassNotFoundException;

}

ConnectionFactory 连接工厂实现类
----------------------------------------------------------------------------------
public class ConnectionFactory implements IConnectionFactory {

private static ConnectionFactory instance = new ConnectionFactory();

private String driver = "com.mysql.jdbc.Driver";

private String username = "root";

private String password = "123456";

private String url = "jdbc:mysql://localhost:3306/xin";

private ConnectionFactory(){

}

public static ConnectionFactory getInstance(){
return instance;
}

public Connection getConnection() throws SQLException, ClassNotFoundException {
// TODO Auto-generated method stub
Class.forName(driver);

return DriverManager.getConnection(url, username, password);
}

}

StudentDAOService StudentDAO的外层服务
---------------------------------------------------------------------------------
public class StudentDAOService {

private IDAOFlayweight fw = DAOFlayweight.getInstance();

private StudentDAO dao = StudentDAO.getInstance();

public void add(Student student){
fw.request(dao, "add", student.toMap(), true, StudentBuilder.class);
}

public void delete(int id){
Map map = new HashMap();
map.put("id", String.valueOf(id));
fw.request(dao, "delete", map, true, StudentBuilder.class);
}

public List query(String name){
Map map = new HashMap();
map.put("name", name);
List list = fw.request(dao, "query", map, true, StudentBuilder.class);

return list;
}

public Student queryById(int id){
Map map = new HashMap();
map.put("id", String.valueOf(id));
List list = fw.request(dao, "queryById", map, true, StudentBuilder.class);
if(list != null && list.size() == 1)
return (Student)list.get(0);
else
return null;
}

public void update(Student student){
fw.request(dao, "update", student.toMap(), true, StudentBuilder.class);
}

}

BackInvoker 类方法回调
----------------------------------------------------------------------------------
public class BackInvoker {

private static BackInvoker instance = new BackInvoker();

private BackInvoker(){

}

public static BackInvoker getInstance(){
return instance;
}

public Object invokeMethod(Object invoke, String methodName, Class[] paramTypes, Object[] params){
Object result = null;

try{
Class invokeClass = invoke.getClass();
Method method = invokeClass.getMethod(methodName, paramTypes);
result = method.invoke(invoke, params);
}catch(Exception e){
e.printStackTrace();
}

return result;
}

}

IDAOFlayweight 真正调用DAO的类接口
---------------------------------------------------------------------------------
public interface IDAOFlayweight {

public List request(Object invoke, String methodName, Map map, boolean isAutoCommit, Class classType);

}

DAOFlayweight 真正调用DAO的类实现类
---------------------------------------------------------------------------------
public class DAOFlayweight implements IDAOFlayweight{

private static DAOFlayweight instance;

private static String key = "key";

private DAOFlayweight(){

}

public static DAOFlayweight getInstance(){
if(instance == null){
synchronized(key){
if(instance == null){
instance = new DAOFlayweight();
}
}
}

return instance;
}



public List put(Object result, ResultSet rs, Class classType) throws SQLException{
List list = null;

//对结果进行处理
if(result != null){
//对查询结果进行封装
if(result instanceof ResultSet){
list = new ArrayList();
rs = (ResultSet)result;
IBuilderFactory factory = new BuilderFactory();
while(rs.next()){
IBuilder builder = factory.getBuilder(classType);
builder.build(rs);
list.add(builder.getResult());
}
}
}

return list;
}


public List request(Object invoke, String methodName, Map map, boolean isAutoCommit, Class classType){
List list = null;

Connection con = null;
Statement stmt = null;
ResultSet rs = null;

try{
//创建所需的操作数据库对象
con = ConnectionFactory.getInstance().getConnection();
con.setAutoCommit(isAutoCommit);
stmt = con.createStatement();

//调用DAO的方法
Object result = BackInvoker.getInstance().invokeMethod(invoke, methodName, new Class[]{Statement.class, Map.class}, new Object[]{stmt, map});

list = put(result, rs, classType);

if(isAutoCommit == false)con.commit();
}catch(Exception e){
if(isAutoCommit == false)
try {
con.rollback();
} catch (SQLException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}
e.printStackTrace();
}finally{
try{
if(rs != null)
rs.close();
if(stmt != null)
stmt.close();
if(con != null)
con.close();
}catch(Exception e){}
}

return list;
}

}

Main
---------------------------------------------------------------------------------
public class Main {

public static void main(String[] args) {
// TODO Auto-generated method stub
StudentDAOService service = new StudentDAOService();

Student student = new Student();
student.setName("XiaoLi");
student.setSex("male");
student.setAge(22);

System.out.println("----------- 添加记录 ----------");
service.add(student);

System.out.println("----------- 查询1 ----------");
Student stu = service.queryById(1);
System.out.println("id = " + stu.getId()
+ ", name = " + stu.getName()
+ ", sex = " + stu.getSex()
+ ", age = " + stu.getAge());

System.out.println("----------- 查询2 ----------");
List list = service.query("XiaoLi");
for(int i = 0; i < list.size(); i++){
stu = (Student)list.get(i);

System.out.println("id = " + stu.getId()
+ ", name = " + stu.getName()
+ ", sex = " + stu.getSex()
+ ", age = " + stu.getAge());
}

System.out.println("----------- 信息更新 ----------");
stu.setAge(27);
service.update(stu);

// System.out.println("----------- 删除记录 ----------");
// service.delete(2);
}

}

源码:
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 内容概要 《计算机试卷1》是一份综合性的计算机基础和应用测试卷,涵盖了计算机硬件、软件、操作系统、网络、多媒体技术等多个领域的知识点。试卷包括单选题和操作应用两大类,单选题部分测试学生对计算机基础知识的掌握,操作应用部分则评估学生对计算机应用软件的实际操作能力。 ### 适用人群 本试卷适用于: - 计算机专业或信息技术相关专业的学生,用于课程学习或考试复习。 - 准备计算机等级考试或职业资格认证的人士,作为实战演练材料。 - 对计算机操作有兴趣的自学者,用于提升个人计算机应用技能。 - 计算机基础教育工作者,作为教学资源或出题参考。 ### 使用场景及目标 1. **学习评估**:作为学校或教育机构对学生计算机基础知识和应用技能的评估工具。 2. **自学测试**:供个人自学者检验自己对计算机知识的掌握程度和操作熟练度。 3. **职业发展**:帮助职场人士通过实际操作练习,提升计算机应用能力,增强工作竞争力。 4. **教学资源**:教师可以用于课堂教学,作为教学内容的补充或学生的课后练习。 5. **竞赛准备**:适合准备计算机相关竞赛的学生,作为强化训练和技能检测的材料。 试卷的目标是通过系统性的题目设计,帮助学生全面复习和巩固计算机基础知识,同时通过实际操作题目,提高学生解决实际问题的能力。通过本试卷的学习与练习,学生将能够更加深入地理解计算机的工作原理,掌握常用软件的使用方法,为未来的学术或职业生涯打下坚实的基础。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值