JDBC之执行SQL语句

引子—–作为一种不使用大型的JDBC框架的Hibernate或者MyBatis的操作数据库的方法,原始的使用JDBC来实现也是一种不错的方式。
(1)学习成本高,没掌握透它就像一个黑盒子,出问题很难处理;
(2)毕竟框架内容太多,比较笨重,很多时候我们也不需要这些流行包含的那么多的功能。
鉴于这两个方面,完全有必要自己实现一个类似于框架的结构。
只需要轻引用的结合DBUtils这个轻型的jdbc框架的部分功能就可以处理好,JDBC操作SQL语句的功能。我只是以作笔记的形式记录对项目中JDBC的实现解读。
首先、定义一个抽象类,实现一部分常用方法,这里为了把数据库连接弄得更加人性化的实现,这里只是构建一个抽象方法,只有方法的申明。这是为了应用程序中能够调用不同的数据库,就像应用中BaseDao实现这个抽象类为了是最初的核心业务数据,SysBaseDao实现保存着系统用户信息,这分布在不同的数据库,实现两个基础DAO,并实现具体的Connection。
这个实现的第一步要把基础的抽象类架构起来—AbstractDBUtilDao.java
在这里无非是把基础的查询,增加,修改,删除四种功能的实现封装起来供后面的Service调用。调用分为单表调用,多表调用,单表又分为两种情况,一是操作表的全部字段,二是操作表的部分字段。
第一步分析查询的实现方式,理解使用反射机制调用类,字段来操作数据库中表和字段。并接SQL语句最后调用DBUtils简化框架中query
语句:

这个只一个思路框架,具体的操作还得要看具体的要来实现,例如可以重载好几种具体的实现:上面的是一种可能,总结归纳一下有以下几种情况
(1)、根据一个Where查询条件就可以查询数据

public List<T> list(String where) {
if (!hasConnection()) {
return null;
}
try {
String sql = "select * from " + mainTable+" ";
if (ToolsUtil.aString(where))
sql += where;
myLog.debug("准备执行:"+sql);
List<T> result = (List<T>) queryRunner.query(connection, sql,
new BeanListHandler(mainClass));
myLog.debug("select成功");
return result;
} catch (SQLException e) {
myLog.error("查询TaskChange发生异常", e);
} finally {
DbUtils.closeQuietly(connection);
}
return null;
}

public Object executeQuery(Connection conn,boolean isCloseConn,String sql,ResultSetHandler resultHandler,Object[] params)
{
if (!hasConnection()) {
return null;
}
try
{
if(params!=null)
return queryRunner.query(connection,sql,resultHandler,params);
else
return queryRunner.query(connection,sql,resultHandler);
}catch(SQLException e)
{
myLog.error("执行sql发生异常:"+sql, e);
}finally
{
if(isCloseConn)
DbUtils.closeQuietly(conn);
}
return null;
}

(2)、根据Where查询条件和不定量的参数来查询{默认是数据库的连接Connection为null,数据库的是否关闭的boolean值为true}

public List<T> list(String where,Object...params) {
return list(null,true,where,params);
}

(3)、条件和(2)一致不过(2)中默认的值子这里可以自己设置

public List<T> list(Connection conn,boolean isClose,String where,Object...params) {
if(isValidConnection(conn))
{
connection = conn;
}else if(!hasConnection()) {
return null;
}
try {
String sql = "select * from " + mainTable+" ";
if (ToolsUtil.aString(where))
sql += where;
myLog.debug("准备执行:"+sql);
List<T> result = (List<T>) queryRunner.query(connection, sql,new BeanListHandler(mainClass),params);
myLog.debug("select成功");
return result;
} catch (SQLException e) {
myLog.error("查询TaskChange发生异常", e);
} finally {
if(isClose)
DbUtils.closeQuietly(connection);
}
return null;
}

(4)这种是带分页条件的查询

public List<Map> list(String where,Pager pager,Object...params){
if (!hasConnection()) {
return null;
}
try {
String sql = "select * from " + mainTable+" ";
if (ToolsUtil.aString(where))
sql += where;
myLog.debug("准备执行:"+sql);
myQueryRunner.setConnection(connection);
List<Map> result =myQueryRunner.getDatas(sql, pager, params);
myLog.debug("select成功");
return result;
} finally {
DbUtils.closeQuietly(connection);
}
}

或者

public List<Map> listSqlPage(String sql,Pager pager,Object...params){
if (!hasConnection()) {
return null;
}
try {
myLog.debug("准备执行:"+sql);
myQueryRunner.setConnection(connection);
List<Map> result =myQueryRunner.getDatas(sql, pager, params);
myLog.debug("select成功");
return result;
} finally {
DbUtils.closeQuietly(connection);
}
}

第二步增加数据,
(1)、根据一个对象的实体插入一条记录

public boolean insert(IBaseModel entity) {
if (!hasConnection()) {
return false;
}
try {
return insert(connection,true,entity);
} catch (SQLException e) {
return false;
}
}

关联

public boolean insert(Connection conn,boolean isCloseConn,IBaseModel entity) throws SQLException
{
if(!isValidConnection(conn))
return false;
try {
String sql = entity.toInsertSql();
myLog.info("准备执行:"+sql);
T result = queryRunner.insert(conn, sql, new BeanHandler<T>(mainClass));
return true;
} catch (SQLException e) {
myLog.error("创建TaskChange发生异常", e);
throw e;
} finally {
if(isCloseConn)
DbUtils.closeQuietly(conn);
}
}

第三步删除数据
(1)根据传入的条件来删除具体的数据{分为传入Where条件和传入Where条件和参数}

public boolean delete(String where)
{
return deleteHasRes(where)>-1;
}
public boolean delete(String where,String...params)
{
return deleteHasRes(where,params)>-1;
}
public int deleteHasRes(String where)
{
if (!hasConnection()) {
return -1;
}
try {
return deleteHasRes(connection,true,where);
} catch (SQLException e) {
return -1;
}
}
public int deleteHasRes(String where,Object...params)
{
if (!hasConnection()) {
return -1;
}
try {
return deleteHasRes(connection,true,where,params);
} catch (SQLException e) {
return -1;
}
}

第四步,修改–其实和查询的思路有些类似调用反射机制中的类的操作

public boolean update(Map<String, String> updKeyVal,String whereStr) {
if (!hasConnection()) {
return false;
}
try {
return update(connection, true,updKeyVal,whereStr);
} catch (Exception e) {
return false;
}
}

肯定离不开子类的DAO的调用使用案例如下

int a = executeUpdate(conn,false,sql,null);

最后就是Service调用相对应的DAO来操作数据库,抛出案例如下

boolean schedle = schedleDetailDao.insert(conn, false, schedule);

增删改查各种情况类似,一个思路。关于JDBC执行SQL语句就到这里。更加详细的请跟踪源码。
附加说明—写这个笔记是为了我自己巩固技术用的,个别方法源码不完整,把源码放到下边,有兴趣的朋友可以自行深入研究
链接:https://pan.baidu.com/s/1pKS6CBp 密码:phh7

当然了还有关于Apache的dbutils的源码自己下载了。每个版本都是差不多的,根据个人喜好了。

    原文作者:tbc123tbc
    原文地址: https://blog.csdn.net/tbc123tbc/article/details/78750723
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞