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开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。
既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Java开发知识点,真正体系化!
由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!
如果你觉得这些内容对你有帮助,可以扫码获取!!(备注Java获取)
最后
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)]
《互联网大厂面试真题解析、进阶开发核心学习笔记、全套讲解视频、实战项目源码讲义》点击传送门即可获取!