Spring框架持久层连接不同类型数据库SQL查询底层实现原理详解

PreparedStatement statement =

connection.prepareStatement(sql)。

然后就是根据占位符而给对应内容赋值。

如:

statement.setString(1,“1”);

这就表示第一个占位符 ? 的值为 1。

当然,对应站位符可能还是int类型,这个时候就需要匹配对应int类型。

生成为完成的sql,即可根据sql查询了:

ResultSet result = statement.executeQuery();

result 即为这条sql查询出来的结果级。

如上面提到如果要将结果返回List<Map<String,Object>>的形式,

接下来就是自己手动结果进行改造处理封装到对应的容器载体中。

如需要List 类型结果集,同样进行对应处理。

这里常用的就是反射、泛型以及ResultSet相关API进行操作。

上面的JDBC相关内容比较基础,如果你了解了。

那么对于SpringJDBC常见的API内容,你一定会感觉豁然开朗。

相关的持久层API都是根据上述内容实现出来的。

例如:

DriverManagerDataSource dataSource = new DriverManagerDataSource();

dataSource.setDriverClassName(“com.mysql.jdbc.Driver”);

dataSource.setUrl(“jdbc:mysql://localhost:3306/blogsrc?useUnicode=true&characterEncoding=UTF-8”);

dataSource.setUsername(“root”);

dataSource.setPassword(“root”);

jdbcTemplate = new JdbcTemplate(dataSource);

String sql = “select * from user where id =?”;

List<Map<String, Object>> users = jdbcTemplate.queryForList(sql, 1L);

List<Map<String, Object>> users1 = jdbcTemplate.queryForList(sql, new Object[] {1L});

对应的API都是在基础的JDBC上封装了一层自己的实现,而最底层都是连接JDBC。

下面内容就是我自己写的实现逻辑,根据输入的驱动,连接,用户名,密码登录对应的数据库,然后查询SQL返回List<Map<String,Object>>的结果集。

public static List<Map<String, Object>> queryForListExample(String driver,String url,String user,String user){

Class.forName(driver);

Connection conn = DriverManager.getConnection(url, user, password);

DBParam dbParam2 = new DBParam();

dbParam2.addParam(“1”);

List<Map<String, Object>> listMap = queryLisMapBySQL(sqlContent, dbParam2,conn);

}

private List<Map<String, Object>> queryLisMapBySQL(String sql,DBParam param, Connection conn) throws Exception {

try{

return queryDataSuperDao(sql,param,conn,new AbsTscpResultHandler<List<Map<String,Object>>>() {

public List<Map<String,Object>> resultHandler(ResultSet result)throws TscpBaseException {

try {

List<Map<String,Object>> resultmap = new ArrayList<Map<String,Object>>();

while(result.next()){

Map<String,Object> map = new HashMap<String,Object>();

for(int i=0;i<result.getMetaData().getColumnCount();i++){

map.put(this.columnConvert(result.getMetaData().getColumnLabel(i+1)),dbDataTypeConvert(result.getObject(i+1)));

}

resultmap.add(map);

}

return resultmap;

} catch (SQLException e) {

throw new TscpBaseException(“TSCP-9086:Structure handler failure !”,e);

}

}

});

}catch(Throwable e){

throw new Exception(“TSCP-9086:Structure handler failure !”,e);

}

}

private T queryDataSuperDao(String sql,DBParam param, Connection conn,ITscpResultHandler handler) throws Throwable {

PreparedStatement statement = this.getPreparedStatement(sql,conn);

this.paramConvertStatement(statement, param);

ResultSet result = null;

try {

result = statement.executeQuery();

T map = handler.resultHandler(result);

return map;

} catch (Throwable ex) {

throw ex;

}finally{

conn.close();

conn = null;

}

}

private PreparedStatement getPreparedStatement(String sql, Connection connection) throws SQLException {

return connection.prepareStatement(sql);

}

private void paramConvertStatement(PreparedStatement statement,DBParam params) throws SQLException {

if (statement == null || params == null|| params.isEmpty())

return;

for (int i = 0; i < params.getParams().size(); i++) {

Object param = params.getParams().get(i);

if (param == null)

statement.setObject(i+1, null);

if (param instanceof Character)

statement.setString(i + 1, param.toString());

else if (param instanceof String)

statement.setString(i + 1, (String) param);

else if (param instanceof Integer)

statement.setInt(i + 1, (Integer) param);

else if (param instanceof Double)

statement.setDouble(i + 1, (Double) param);

else if (param instanceof Long)

statement.setLong(i + 1, (Long) param);

else if (param instanceof Timestamp)

statement.setTimestamp(i + 1, (Timestamp) param);

else if (param instanceof java.sql.Date)

statement.setDate(i + 1, (java.sql.Date) param);

else if (param instanceof java.util.Date)

statement.setTimestamp(i + 1, new Timestamp(((java.util.Date) param).getTime()));

else if (param instanceof BigDecimal)

statement.setBigDecimal(i + 1, (BigDecimal) param);

else if (param instanceof Byte)

statement.setByte(i + 1, (Byte) param);

else if (param instanceof Short)

statement.setShort(i + 1, (Short) param);

else if (param instanceof Float)

statement.setFloat(i + 1, (Float) param);

else if (param instanceof Boolean)

自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。

深知大多数Java工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则几千的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!

因此收集整理了一份《2024年Java开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Java开发知识点,真正体系化!

由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!

如果你觉得这些内容对你有帮助,可以扫码获取!!(备注Java获取)

img

最后

Java架构学习技术内容包含有:Spring,Dubbo,MyBatis, RPC, 源码分析,高并发、高性能、分布式,性能优化,微服务 高级架构开发等等。

还有Java核心知识点+全套架构师学习资料和视频+一线大厂面试宝典+面试简历模板可以领取+阿里美团网易腾讯小米爱奇艺快手哔哩哔哩面试题+Spring源码合集+Java架构实战电子书+2021年最新大厂面试题。
在这里插入图片描述

《互联网大厂面试真题解析、进阶开发核心学习笔记、全套讲解视频、实战项目源码讲义》点击传送门即可获取!
ommunity.csdnimg.cn/images/e5c14a7895254671a72faed303032d36.jpg" alt=“img” style=“zoom: 33%;” />

最后

Java架构学习技术内容包含有:Spring,Dubbo,MyBatis, RPC, 源码分析,高并发、高性能、分布式,性能优化,微服务 高级架构开发等等。

还有Java核心知识点+全套架构师学习资料和视频+一线大厂面试宝典+面试简历模板可以领取+阿里美团网易腾讯小米爱奇艺快手哔哩哔哩面试题+Spring源码合集+Java架构实战电子书+2021年最新大厂面试题。
[外链图片转存中…(img-jFEUkJoH-1713336733982)]

《互联网大厂面试真题解析、进阶开发核心学习笔记、全套讲解视频、实战项目源码讲义》点击传送门即可获取!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值