文档章节

轻量级java web实践-8(框架源码-6)

游客
 游客
发布于 2014/03/29 13:09
字数 582
阅读 126
收藏 3

持久化,数据库操作部分,借鉴osc部分代码,使用dbutils组件

public abstract class DataAccess
{
    private static final Logger log = LoggerFactory.getLogger(DataAccess.class);
    private Connection conn;

    /**
     * @param conn 数据库连接
     */
    protected DataAccess(Connection conn)
    {
        this.conn = conn;
    }

    /**
     * 插入数据
     * 
     * @param sql
     * @param generatedKeysConverter 主键映射
     * @param params
     * @return 主键
     * @throws DataAccessException
     */
    protected <T> T insert(String sql, ResultConverter<T> generatedKeysConverter, Object... params) throws DataAccessException
    {
        try
        {
            PreparedStatement pstmt = conn.prepareStatement(sql, Statement.RETURN_GENERATED_KEYS);
            setParameters(pstmt, params);
            executeUpdate(pstmt);
            ResultSet rs = pstmt.getGeneratedKeys();
            nextResult(rs);
            return convertResult(rs, generatedKeysConverter);
        }
        catch (SQLException e)
        {
            e.printStackTrace();
            log.error(e.getMessage(), e);
            throw new DataAccessException(e);
        }
    }

    /**
     * 更新数据
     * 
     * @param sql
     * @param params
     * @return 影响行数
     * @throws DataAccessException
     */
    protected int update(String sql, Object... params) throws DataAccessException
    {
        return executeUpdate(getPreparedStatement(sql, params));
    }

    /**
     * 查询单个结果
     * 
     * @param <T>
     * @param sql
     * @param converter
     * @param params
     * @return
     */
    protected <T> T queryForObject(String sql, ResultConverter<T> converter, Object... params)
    {
        ResultSet rs = executeQuery(sql, params);
        if (nextResult(rs))
        {
            return convertResult(rs, converter);
        }
        else
        {
            return null;
        }
    }

    /**
     * 查询结果列表
     * 
     * @param <T>
     * @param sql
     * @param converter
     * @param params
     * @return
     */
    protected <T> List<T> queryForList(String sql, ResultConverter<T> converter, Object... params)
    {
        ResultSet rs = executeQuery(sql, params);
        List<T> list = new ArrayList<T>();
        while (nextResult(rs))
        {
            list.add(convertResult(rs, converter));
        }
        return list;
    }

    /**
     * @param sql SQL语句
     * @return 预编译声明
     */
    private PreparedStatement getPreparedStatement(String sql, Object... params) throws DataAccessException
    {
        PreparedStatement pstmt = getPreparedStatement(sql);
        setParameters(pstmt, params);
        return pstmt;
    }

    /**
     * @param sql SQL语句
     * @return 预编译声明
     */
    private PreparedStatement getPreparedStatement(String sql) throws DataAccessException
    {
        try
        {
            return conn.prepareStatement(sql);
        }
        catch (SQLException e)
        {
            e.printStackTrace();
            log.error(e.getMessage(), e);
            throw new DataAccessException(e);
        }
    }

    /**
     * 为预编译声明传入参数
     * 
     * @param pstmt 预编译声明
     * @param params 参数
     * @throws DataAccessException
     */
    private void setParameters(PreparedStatement pstmt, Object... params) throws DataAccessException
    {
        try
        {
            for (int i = 0; i < params.length; i++)
            {
                pstmt.setObject(i + 1, params[i]);
            }
        }
        catch (SQLException e)
        {
            e.printStackTrace();
            log.error(e.getMessage(), e);
            throw new DataAccessException(e);
        }
    }

    /**
     * 执行更新操作
     * 
     * @param pstmt
     * @return 影响行数
     * @throws DataAccessException
     */
    private int executeUpdate(PreparedStatement pstmt) throws DataAccessException
    {
        try
        {
            return pstmt.executeUpdate();
        }
        catch (SQLException e)
        {
            e.printStackTrace();
            log.error(e.getMessage(), e);
            throw new DataAccessException(e);
        }
    }

    /**
     * 执行查询操作
     * 
     * @param pstmt 预编译声明
     * @return 结果集
     * @throws DataAccessException
     */
    private ResultSet executeQuery(PreparedStatement pstmt) throws DataAccessException
    {
        try
        {
            return pstmt.executeQuery();
        }
        catch (SQLException e)
        {
            e.printStackTrace();
            log.error(e.getMessage(), e);
            throw new DataAccessException(e);
        }
    }

    /**
     * 执行查询操作
     * 
     * @param sql SQL语句
     * @param params 参数
     * @return 结果集
     * @throws DataAccessException
     */
    private ResultSet executeQuery(String sql, Object... params) throws DataAccessException
    {
        return executeQuery(getPreparedStatement(sql, params));
    }

    /**
     * 移动到下一行记录
     * 
     * @param rs 结果集
     * @return 是否有下一行记录
     * @throws DataAccessException
     */
    private boolean nextResult(ResultSet rs) throws DataAccessException
    {
        try
        {
            return rs.next();
        }
        catch (SQLException e)
        {
            e.printStackTrace();
            log.error(e.getMessage(), e);
            throw new DataAccessException(e);
        }
    }

    /**
     * 映射
     * 
     * @param rs 结果集
     * @return 映射结果
     * @throws DataAccessException
     */
    private <T> T convertResult(ResultSet rs, ResultConverter<T> converter) throws DataAccessException
    {
        try
        {
            return converter.convert(rs);
        }
        catch (SQLException e)
        {
            e.printStackTrace();
            log.error(e.getMessage(), e);
            throw new DataAccessException(e);
        }
    }
}

其余DBManager,DBUtils,参考请OSC源码

© 著作权归作者所有

共有 人打赏支持
游客
粉丝 138
博文 28
码字总数 10307
作品 0
深圳
CTO(技术副总裁)
私信 提问
一份关于 Java、Kotlin 与 Android 的学习笔记

JavaKotlinAndroidLearn 这是一份关于 Java 、Kotlin 、Android 的学习笔记,既包含对基础知识点的介绍,也包含对一些重要知识点的源码解析,笔记的大纲如下所示: Java 重拾Java(0)-基础知...

叶应是叶
2018/08/08
0
0
Minidao_1.6.1版本发布,超轻量Java持久化框架

Minidao_1.6.1版本发布了,超轻量Java持久化框架 升级日志 1,修复minidao参数不支持下划线问题 2,修复minidao接口定义返回类型为基本数据类型,无法传参数问题 3,拓展灵活性,通过sql判断...

Jeecg
2016/09/12
1K
5
Java网络编程框架

自从JDK1.4中有了NIO以后,这个方面越来越活跃,也为java赢得更多开发者的支持。做java网络编程需要掌握一些基本的知识和技能: 套接字编程、阻塞/非阻塞通信、创建HTTP服务器与客户程序、数...

长平狐
2012/08/29
2.3K
0
10年工作整理材料分享(JavaEE,linux),结交朋友,共同学习进步

本人从事互联网开发由10年多的时间了,先后经历过各大一线的IT互联网公司,伴随着年纪的增加,自己也在总结这么多年的实际的开发经验,我目前整理出了基于J2EE,J2SE,PHP,Linux,数据库的web...

yar_fengling
2015/03/31
159
0
SSM三大框架整合(Spring+SpringMVC+MyBatis)

1、基本概念 1.1、Spring Spring 是一个开源框架, Spring 是于 2003 年兴起的一个轻量级的 Java 开发框架,由 Rod Johnson 在其著作 Expert One-On-One J2EE Development and Design 中阐述...

qq592fbb5b34ad7
2018/07/02
0
0

没有更多内容

加载失败,请刷新页面

加载更多

Httpd 整合 Tomcat 步骤

环境:Tomcat8 + Httpd2.4 工作原理:借助于Tomcat的AJP连接器实现Apache与Tomcat的通信 配置步骤: 1. 配置httpd.conf 新增: Include conf/extra/mod_jk.conf 修改:添加 index.jsp <IfM...

ZeroneLove
昨天
1
0
Docker笔记3——容器命令(未写完,明天整理接着写)

未写完,明天整理接着写 新建并启动容器 docker run docker run [OPTIONS] IMAGE [COMMEND] [ARG...] OPTIONS: --name=[容器新名字] :为容器指定一个名称 -d:后台运行容器,并返回容器ID,...

HappyBKs
昨天
1
0
2018个人年终总结

感谢领导的信任和指导,新的一年获得了很多成长和提高,改掉了很多不好的习惯。 在这一年里,我在领导的帮助下,主要完成了以下功能: 1、完成上海银行版本投资营销相关功能的开发。 2、完成车...

万山红遍
昨天
10
0
保密工作与linux系统的发展

保密工作从性质上可以分成商业方面的保密和国家安全方面的保密。由于自己从事的是IT方面的工作,工作中必然会接触涉及到计算机信息方面的相关文件。加上单位已近通过武器装备科研生产单位二级...

linux-tao
昨天
3
0
Spark共享变量

概述 Spark程序的大部分操作都是RDD操作,通过传入函数给RDD操作函数来计算。这些函数在不同的节点上并发执行,但每个内部的变量有不同的作用域,不能相互访问,所以有时会不太方便,Spark提...

仟昭
昨天
2
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部