三、定义DAO实现模板类简化DAO实现类
3.1 定义和使用抽象化DAO类(模板模式)
使用继承模板DAO类来优化DAO实现类的编写:
优化查询操作,区分开变化和不变的部分:
sql和ResultSet的处理是变化部分,创建和释放资源部分是不变部分。
提取超类,将不变部分放入超类,变化部分留给子类实现。
超类的主要代码:
public Object find(String sql, Object[] args) {
…
rs = ps.executeQuery();
if (rs.next()) return rowMapper(rs);
…
}
protected abstract Object rowMapper(ResultSet rs);
package org.com.dao.refactor.template;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import org.com.dao.DAOException;
import org.com.lin.JdbcUtilsSing;
public abstract class AbstractDao{
public Object find(String sql, Object[] args) {
Connection conn = null;
PreparedStatement ps = null;
ResultSet rs = null;
try {
conn = JdbcUtilsSing.getInstance().getConnection();
ps = conn.prepareStatement(sql);
int len=0;
if(args!=null){
len=args.length;
}
for (int i = 0;i<len; i++){
ps.setObject(i + 1, args[i]);
}
rs = ps.executeQuery();
Object obj = null;
if (rs.next()) {
obj = rowMapper(rs);
}
return obj;
} catch (SQLException e) {
throw new DAOException(e.getMessage(), e);
} finally {
JdbcUtilsSing.getInstance().free(rs, ps, conn);
}
}
abstract protected Object rowMapper(ResultSet rs) throws SQLException;
public int update(String sql, Object[] args) {
Connection conn = null;
PreparedStatement ps = null;
try {
conn = JdbcUtilsSing.getInstance().getConnection();
ps = conn.prepareStatement(sql);
int len=0;
if(args!=null){
len=args.length;
}
for (int i = 0;i<len; i++){
ps.setObject(i + 1, args[i]);
}
return ps.executeUpdate();
} catch (SQLException e) {
throw new DAOException(e.getMessage(), e);
} finally {
JdbcUtilsSing.getInstance().free(null, ps, conn);
}
}
public ResultSet insertBackPrimaryKey(String sql, Object[] args) {
Connection conn = null;
PreparedStatement ps = null;
try {
conn = JdbcUtilsSing.getInstance().getConnection();
ps = conn.prepareStatement(sql);
int len=0;
if(args!=null){
len=args.length;
}
for (int i = 0;i<len; i++){
ps.setObject(i + 1, args[i]);
}
ps.executeUpdate();
return ps.getGeneratedKeys();
} catch (SQLException e) {
throw new DAOException(e.getMessage(), e);
} finally {
JdbcUtilsSing.getInstance().free(null, ps, conn);
}
}
}
package org.com.dao.refactor.template;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.List;
import org.com.dao.DAOException;
import org.com.domain.User;
public class UserDAOImpl extends AbstractDao{
public User getUser(int userId) {
String sql="select id,name,birthday,money from user where id=?";
Object[] args=new Object[]{userId};
return (User) super.find(sql, args);
}
@Override
protected Object rowMapper(ResultSet rs) throws SQLException {
User user = new User();
user.setId(rs.getInt("id"));
user.setName(rs.getString("name"));
user.setMoney(rs.getFloat("money"));
user.setBirthday(rs.getDate("birthday"));
return user;
}
//如下两个方法要么用原来的实现方法,要么在另一个AbstractDao子类中定义重新实现rowMapper方法
//所以,这样仍然不够通用与灵活
public List findByName(String name) {
return null;
}
public String getUserName(int userId) {
return null;
}
public int update(User user) {
String sql="update user set name=?,birthday=?,money=? where id=?";
Object[] args=new Object[]{user.getName(),user.getBirthday(),user.getMoney(),user.getId()};
return super.update(sql, args);
}
public int delete(User user) {
String sql="delete from user where id=?";
Object[] args=new Object[]{user.getId()};
return super.update(sql, args);
}
public int insert(User user){
String sql="insert into user (name,birthday,money) values(?,?,?)";
Object[] args=new Object[]{user.getName(),user.getBirthday(),user.getMoney()};
return super.update(sql, args);
}
public int insertBackPrimaryKey(User user){
String sql="insert into user (name,birthday,money) values(?,?,?)";
Object[] args=new Object[]{user.getName(),user.getBirthday(),user.getMoney()};
ResultSet rs=super.insertBackPrimaryKey(sql, args);
if(rs!=null){
try {
user.setId(rs.getInt(0));
} catch (SQLException e) {
throw new DAOException(e.getMessage(), e);
}
}
return user.getId();
}
}
3.2 定义和使用抽象化DAO类(策略模式)
使用组合DAO模板类来优化DAO实现类的编写:
优化查询操作,区分开变化和不变的部分:
sql和ResultSet的处理是变化部分,创建和释放资源部分是不变部分。
提取接口封装变化部分。
JDBC操作主要代码:
public Object find(String sql, Object[] args, RowMapper rowMapper) {
…
rs = ps.executeQuery();
if (rs.next())return rowMapper.mapRow(rs);
…
}
回调接口:
public interface RowMapper {
public Object mapRow(ResultSet rs) throws SQLException;
}
package org.com.dao.refactor.strategy;
import java.sql.ResultSet;
import java.sql.SQLException;
public interface RowMapper {
Object rowMapper(ResultSet rs) throws SQLException;
}
package org.com.dao.refactor.strategy;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import org.com.dao.DAOException;
import org.com.lin.JdbcUtilsSing;
public class MyDaoTemplate{
public Object find(String sql, Object[] args,RowMapper rowMapper) {
Connection conn = null;
PreparedStatement ps = null;
ResultSet rs = null;
try {
conn = JdbcUtilsSing.getInstance().getConnection();
ps = conn.prepareStatement(sql);
int len=0;
if(args!=null){
len=args.length;
}
for (int i = 0;i<len; i++){
ps.setObject(i + 1, args[i]);
}
rs = ps.executeQuery();
Object obj = null;
if (rs.next()) {
obj = rowMapper.rowMapper(rs);
}
return obj;
} catch (SQLException e) {
throw new DAOException(e.getMessage(), e);
} finally {
JdbcUtilsSing.getInstance().free(rs, ps, conn);
}
}
public int update(String sql, Object[] args) {
Connection conn = null;
PreparedStatement ps = null;
try {
conn = JdbcUtilsSing.getInstance().getConnection();
ps = conn.prepareStatement(sql);
int len=0;
if(args!=null){
len=args.length;
}
for (int i = 0;i<len; i++){
ps.setObject(i + 1, args[i]);
}
return ps.executeUpdate();
} catch (SQLException e) {
throw new DAOException(e.getMessage(), e);
} finally {
JdbcUtilsSing.getInstance().free(null, ps, conn);
}
}
public ResultSet insertBackPrimaryKey(String sql, Object[] args) {
Connection conn = null;
PreparedStatement ps = null;
try {
conn = JdbcUtilsSing.getInstance().getConnection();
ps = conn.prepareStatement(sql);
int len=0;
if(args!=null){
len=args.length;
}
for (int i = 0;i<len; i++){
ps.setObject(i + 1, args[i]);
}
ps.executeUpdate();
return ps.getGeneratedKeys();
} catch (SQLException e) {
throw new DAOException(e.getMessage(), e);
} finally {
JdbcUtilsSing.getInstance().free(null, ps, conn);
}
}
}
package org.com.dao.refactor.strategy;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;
import org.com.dao.DAOException;
import org.com.domain.User;
public class UserDAOImpl{
private MyDaoTemplate template;
public User getUser(int userId) {
String sql="select id,name,birthday,money from user where id=?";
Object[] args=new Object[]{userId};
User user=(User) this.template.find(sql, args,new RowMapper(){
public Object rowMapper(ResultSet rs) throws SQLException {
User user = new User();
user.setId(rs.getInt("id"));
user.setName(rs.getString("name"));
user.setMoney(rs.getFloat("money"));
user.setBirthday(rs.getDate("birthday"));
return user;
}
});
return user;
}
public List findByName(String name) {
String sql="select id,name,birthday,money from user where name=?";
Object[] args=new Object[]{name};
List all=(List) this.template.find(sql, args,new RowMapper(){
public Object rowMapper(ResultSet rs) throws SQLException {
List all=new ArrayList();
while(rs.next()){
User user = new User();
user.setId(rs.getInt("id"));
user.setName(rs.getString("name"));
user.setMoney(rs.getFloat("money"));
user.setBirthday(rs.getDate("birthday"));
all.add(user);
}
return all;
}
});
return all;
}
public String getUserName(int userId) {
String sql="select name from user where id=?";
Object[] args=new Object[]{userId};
String name=(String) this.template.find(sql, args,new RowMapper(){
public Object rowMapper(ResultSet rs) throws SQLException {
return rs.getObject("name");
}
});
return name;
}
public int update(User user) {
String sql="update user set name=?,birthday=?,money=? where id=?";
Object[] args=new Object[]{user.getName(),user.getBirthday(),user.getMoney(),user.getId()};
return this.template.update(sql, args);
}
public int delete(User user) {
String sql="delete from user where id=?";
Object[] args=new Object[]{user.getId()};
return this.template.update(sql, args);
}
public int insert(User user){
String sql="insert into user (name,birthday,money) values(?,?,?)";
Object[] args=new Object[]{user.getName(),user.getBirthday(),user.getMoney()};
return this.template.update(sql, args);
}
public int insertBackPrimaryKey(User user){
String sql="insert into user (name,birthday,money) values(?,?,?)";
Object[] args=new Object[]{user.getName(),user.getBirthday(),user.getMoney()};
ResultSet rs=this.template.insertBackPrimaryKey(sql, args);
if(rs!=null){
try {
user.setId(rs.getInt(0));
} catch (SQLException e) {
throw new DAOException(e.getMessage(), e);
}
}
return user.getId();
}
}
相关推荐
hpm6750evk2开发板(一)菜鸟入门
hpm6750与我们平时常用的stm单片机在开发环境和开发方法上有很大的区别,所以上手还是需要花一点时间的,拿到板子先不要急着上电调试,我们先找资料学习一下了,免得多走冤枉路,以下是我整理的一些学习资源,包括开发板使用手册、芯片SDK、开发工具、视频资料等,建议先把使用手册和学习视频先看了,再取搭建环境测试。最近刚入手一块hpm6750evk2开发板,花了几天时间学习,算是菜鸟入门了,今天分享一下学习过程。看完资料后,把开发工具安装上,下一篇文章我们分享一下调试工程的过程和遇到的问题。
JDBC操作
查找mysql进程号和端口号: [root@master ~]# ps -aux | grep mysql mysql 10641 0.2 11.4 1734020 213884 ? Sl 3月10 4:55 /usr/sbin/mysqld --daemonize --pid-file=/var/run/mysqld/mysqld.pid root 45256 0.0 0.0 112828 976 pts/0 S+ 19:24 0:00 gr...
在 Ansys CFX Pre 中配置 RGP 表的分步指南
掌握在 Ansys CFX Pre 中设置 RGP 表的技巧,以优化仿真精度和效率。
JDBC初步学习
根据慕课网的课程JDBC之 “ 对岸的女孩看过来”进行学习。MySQL相关的建表语句create database imooc;use imooc;create table imooc_goddess( id int primary key auto_increment, user_name varchar(30) not null, sex int, age int
手把手教你分析解决Innovus DRC Violation 和Antenna Effect Violation
数字IC后端设计培训教程之手把手教你分析解决Innovus DRC Violation 和Antenna Effect Violation
微信小程序后台定位与实时位置更新的实战指南
本文提供了微信小程序实现后台定位与实时位置更新的完整实战指南。针对小程序退到后台后位置更新中断的痛点,详细解析了基于`startLocationUpdateBackground`API的后台定位解决方案。内容涵盖从隐私协议配置、项目权限声明,到授权、启动、监听、停止的核心代码流程,并分享了真机调试、性能优化及权限引导等关键避坑经验,帮助开发者构建稳定可靠的后台位置服务。
Spring -JdbcTemplate 总结
Spring-JdbcTemplate 总结 1. 查询单个对象: a) 基本类型 ================================================ 下面两个方法主要适用于静态sql ◆ public Object queryForObject(String sql, RowMapper rowMapper) ◆ pub
开发具有情感分析能力的AI Agent
本文将深入探讨开发具有情感分析能力的AI Agent的各个方面。我们将首先介绍情感分析的基础知识,包括定义、背景和应用领域。接着,我们将详细讲解情感分析的核心概念、数据处理方法和算法原理。随后,文章将展示如何设计情感分析系统架构,并进行项目实战,包括环境安装、源代码实现和案例分析。最后,我们将总结最佳实践和注意事项,为读者提供进一步学习的资源。情感分析(Sentiment Analysis),也称为意见挖掘,是自然语言处理(NLP)的一个分支。
JDBC学习篇之使用ResultSet执行简单查询操作
一、前言 结果集(ResultSet)是数据中查询结果返回的一种对象,可以说结果集是一个存储查询结果的对象,但是结果集并不仅仅具有存储的功能,它同时还具有操纵数据的功能,可能完成对数据的更新等。 结果集读取数据的方法主要是getXXX(),它的参数可以是整型,表示第几列,下标从1开始;还可以是列名,指定根据别名返回某一列的值,返回的是对应的XXX类型的值。 如
Rancher入门到精通 - Nginx Ingress 配置指南
Rancher 是一个开源的容器管理平台,它提供了一套完整且易于使用的工具来部署、管理和扩展容器化应用。而 Nginx Ingress 则是一个常用的开源 Ingress 控制器,用于将外部请求流量导入到 Kubernetes 集群中的服务。在开始之前,请确保您已经正确安装了 Rancher 平台和 Nginx Ingress 控制器。
RT-Thread GD32F4xx HWTIMER驱动
GD32F4xx RT-Thread 硬件定时器驱动调试使用记录
Spring的JdbcTemplate、NamedParameterJdbcTemplate、SimpleJdbcTemplate
一、JdbcTemplate 查询带有参数,和行映射方法:public Object queryForObject(String sql, Object[] args, RowMapper rowMapper),使用自定义的UserRowMapper完成映射。 一个RowMapper的常用实现BeanPropertyRowMapper,该实现可将结果集转换成一个Java Bean(字段名与Java
Simulink开发项1000例实战专栏--实例161:基于Simulink实现电动汽车电机驱动系统的建模与仿真
通过上述步骤,我们成功实现了基于Simulink的电动汽车电机驱动系统的建模与仿真。该系统能够全面评估电机驱动系统的性能,验证控制策略的有效性,并通过优化设计提高车辆的动力性和效率。引入智能预测:结合人工智能技术,实现更智能的控制策略。扩展功能:增加对多种电机类型的支持,提升系统通用性。实验验证:将仿真模型应用于实际硬件,进行实验验证,评估其在实际工况下的表现。
JDBC总结——JDBC工具类
文章目录JDBC工具类一、JDBC工具类概述1、定义JDBC工具类的目的2、封装的操作二、JDBC工具类的封装1、dbcp.properties2、JdbcUtil3.java3、JdbcTemplate.java JDBC工具类 一、JDBC工具类概述 1、定义JDBC工具类的目的 每次使用JDBC的时候都要书写冗长的代码段,不符合复用的理念,于是要单独写一个类,将通用的JDBC操作写到一个类...
IDEA的使用指南
IDEA基于java的使用手册,可以最快速的上手,在使用中不断的丰富自己的使用技巧.
win10 跳过U8环境检测的IE WebControls.rar
win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。
JDBC相关工具类的封装
一、JDBC连接工具类(MySQL为例) 1、在项目根目录创建一个properties的配置文件db.properties,里面定义了四行数据,分别对应着JDBC连接所需要的几个参数(注:Properties底层为一个Hashtable,配置文件中“=”之前的代表Map中的键,之后的代表相应键所对应的值) driverClassName=com.mysql.jdbc.Driver url=jdbc...
SAP B1中文培訓教材_SDK
公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说
工具类:JDBC工具类
配置文件 jdbc.driver=com.mysql.jdbc.Driver jdbc.url=jdbc:mysql://127.0.0.1:3306/project jdbc.user=root jdbc.password=123456 jdbc.datasource.size=10 常量接口 package com.lirong.sparkproject.constant; pub...
计算机控制技术及应用
《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。
JDBC工具类详解
JDBCUtils工具类 在我们使用JDBC 的时候,我们多数的代码都是一样的,这个时候我们就像能不能把相同的代码包装成静态方法给我们使用,这就是我们所谓的JDBC工具类 在认识JDBC工具类之前,我们需要对Properties类有一个复习 方法名 说明 String getProperty(String key) 在此属性列表中搜索具有指定键的属性,并返回所对应的值。 void load(InputStream inStream) 从输入字节流中读取属性列表(键和元素对
Jdbc工具类例子
Jdbc工具类的简单例子 封装方法 创建连接,共用调用 静态代码块,只需调用一次,账号密码等配置文件获取,不需更改代码 关闭资源方法 配置文件: driver=com.mysql.cj.jdbc.Driver url = jdbc:mysql://localhost:3306/study?useSSL=false&serverTimezone=UTC&characterEncoding=utf-8 user=root password=password ...
JDBC工具类封装
JDBC工具类,简化JDBC编程 本篇供个人学习使用,有问题欢迎讨论 一、配置JDBC的代码驱动 首先,在编写JDBC工具类前,我们得先配置JDBC的代码驱动。 不会配置的可以看我的另一篇博客,IDEA的JDBC代码配置驱动 二、创建属性配置文件 其次,我们创建一个属性配置文件,里面存放着连接SqlServer的一系列命令。在编写程序时会用到资源绑定器来绑定属性配置文件,实现程序的低耦合度,后期只需修改属性配置文件中的命令即可。 注意:属性配置文件必须以properties结尾,且存储在src源目录下
JDBC工具类 以及使用JDBC工具类 一般开发不可能直接使用 JDBC 了解即可
文章目录JDBC工具类1 工具类的代码实现相关变量使用ResourceBundle 进行资源的绑定,主要是绑定到 jdbc.properties 文件,方便将这个配置文件里面的相关配置读取出来(1)(2)加载驱动关闭资源2 工具类代码实现所有代码package com.luobin.utils;3 调用工具类的代码实现创建进行数据库交互的相关变量调用静态方法进行连接的建立(3)建立sql 语句,将建立的sql 语句进行预编译,得到预编译环境(4)执行预编译得到处理结果(5)对处理结果进行处理(6)释放资源4
jdbc连接mysql工具类_jdbc之工具类DBUtil的使用
首先回顾一下jdbc的使用方法:1. 注册驱动2. 建立连接3. 建立statement4. 定义sql语句5. 执行sql语句,如果执行的是查询需遍历结果集6. 关闭连接其中建立连接和关闭连接都是可以封装成工具类的,因此给出DBUtil代码如下:package com.colin.util;import java.sql.*;public class DBUtil {private static...
JDBC工具类的抽取
1.1 JDBC的工具类的抽取 1.1.1 抽取一个JDBC的工具类 因为传统JDBC的开发,注册驱动,获得连接,释放资源这些代码都是重复编写的。所以可以将重复的代码提取到一个类中来完成。 package com.xdr630.jdbc.utils; import java.sql.Connection; import java.sql.DriverManager; import java.sql.ResultSet; import java.sql.SQLException; import java.
JDBC工具类的封装
JDBC工具类的封装,封装获取数据库连接方法,获取preparedStatement对象的方法,解析ResultSet集合,关闭资源等方法
3083



被折叠的 条评论
为什么被折叠?



