加载数据库数据到缓存 其实也就是将数据库表的查询结果封装到java的list<对象>这种形式 ;
JdbcTemplate 为spring 封装的jdbc
1、使用JdbcTemplate的execute()方法执行SQL语句
Java代码
- jdbcTemplate.execute("CREATE TABLE USER (user_id integer, name varchar(100))");
2、如果是UPDATE或INSERT,可以用update()方法。
Java代码
- jdbcTemplate.update("INSERT INTO USER VALUES('"
- + user.getId() + "', '"
- + user.getName() + "', '"
- + user.getSex() + "', '"
- + user.getAge() + "')");
3、带参数的更新
Java代码
- jdbcTemplate.update("UPDATE USER SET name = ? WHERE user_id = ?", new Object[] {name, id});
Java代码
- jdbcTemplate.update("INSERT INTO USER VALUES(?, ?, ?, ?)", new Object[] {user.getId(), user.getName(), user.getSex(), user.getAge()});
4、使用JdbcTemplate进行查询时,使用queryForXXX()等方法
Java代码
- int count = jdbcTemplate.queryForInt("SELECT COUNT(*) FROM USER");
Java代码
- String name = (String) jdbcTemplate.queryForObject("SELECT name FROM USER WHERE user_id = ?", new Object[] {id}, java.lang.String.class);
Java代码
- List rows = jdbcTemplate.queryForList("SELECT * FROM USER");
Java代码
- List rows = jdbcTemplate.queryForList("SELECT * FROM USER");
- Iterator it = rows.iterator();
- while(it.hasNext()) {
- Map userMap = (Map) it.next();
- System.out.print(userMap.get("user_id") + "\t");
- System.out.print(userMap.get("name") + "\t");
- System.out.print(userMap.get("sex") + "\t");
- System.out.println(userMap.get("age") + "\t");
- }
JdbcTemplate将我们使用的JDBC的流程封装起来,包括了异常的捕捉、SQL的执行、查询结果的转换等等。spring大量使用Template Method模式来封装固定流程的动作,XXXTemplate等类别都是基于这种方式的实现。
除了大量使用Template Method来封装一些底层的操作细节,spring也大量使用callback方式类回调相关类别的方法以提供JDBC相关类别的功能,使传统的JDBC的使用者也能清楚了解spring所提供的相关封装类别方法的使用。
JDBC的PreparedStatement
Java代码
- final String id = user.getId();
- final String name = user.getName();
- final String sex = user.getSex() + "";
- final int age = user.getAge();
- jdbcTemplate.update("INSERT INTO USER VALUES(?, ?, ?, ?)",
- new PreparedStatementSetter() {
- public void setValues(PreparedStatement ps) throws SQLException {
- ps.setString(1, id);
- ps.setString(2, name);
- ps.setString(3, sex);
- ps.setInt(4, age);
- }
- });
Java代码
- final User user = new User();
- jdbcTemplate.query("SELECT * FROM USER WHERE user_id = ?",
- new Object[] {id},
- new RowCallbackHandler() {
- public void processRow(ResultSet rs) throws SQLException {
- user.setId(rs.getString("user_id"));
- user.setName(rs.getString("name"));
- user.setSex(rs.getString("sex").charAt(0));
- user.setAge(rs.getInt("age"));
- }
- });
Java代码
- class UserRowMapper implements RowMapper {
- public Object mapRow(ResultSet rs, int index) throws SQLException {
- User user = new User();
- user.setId(rs.getString("user_id"));
- user.setName(rs.getString("name"));
- user.setSex(rs.getString("sex").charAt(0));
- user.setAge(rs.getInt("age"));
- return user;
- }
- }
- public List findAllByRowMapperResultReader() {
- String sql = "SELECT * FROM USER";
- return jdbcTemplate.query(sql, new RowMapperResultReader(new UserRowMapper()));
- }
在getUser(id)里面使用UserRowMapper
Java代码
- public User getUser(final String id) throws DataAccessException {
- String sql = "SELECT * FROM USER WHERE user_id=?";
- final Object[] params = new Object[] { id };
- List list = jdbcTemplate.query(sql, params, new RowMapperResultReader(new UserRowMapper()));
- return (User) list.get(0);
- }
网上收集
org.springframework.jdbc.core.PreparedStatementCreator 返回预编译SQL 不能于Object[]一起用
Java代码
- public PreparedStatement createPreparedStatement(Connection con) throws SQLException {
- return con.prepareStatement(sql);
- }
1.增删改
org.springframework.jdbc.core.JdbcTemplate 类(必须指定数据源dataSource)
Java代码
- template.update("insert into web_person values(?,?,?)",Object[]);
或
Java代码
- template.update("insert into web_person values(?,?,?)",new PreparedStatementSetter(){ 匿名内部类 只能访问外部最终局部变量
- public void setValues(PreparedStatement ps) throws SQLException {
- ps.setInt(index++,3);
- });
org.springframework.jdbc.core.PreparedStatementSetter 接口 处理预编译SQL
Java代码
- public void setValues(PreparedStatement ps) throws SQLException {
- ps.setInt(index++,3);
- }
2.查询JdbcTemplate.query(String,[Object[]/PreparedStatementSetter],RowMapper/RowCallbackHandler)
org.springframework.jdbc.core.RowMapper 记录映射接口 处理结果集
Java代码
- public Object mapRow(ResultSet rs, int arg1) throws SQLException { int表当前行数
- person.setId(rs.getInt("id"));
- }
- List template.query("select * from web_person where id=?",Object[],RowMapper);
org.springframework.jdbc.core.RowCallbackHandler 记录回调管理器接口 处理结果集
Java代码
- template.query("select * from web_person where id=?",Object[],new RowCallbackHandler(){
- public void processRow(ResultSet rs) throws SQLException {
- person.setId(rs.getInt("id"));
- });
以下为项目中遇到的实例应用;
/*
* @(#)ArteryBsaeDao.java 2018-3-2下午5:34:25 jcwzsjrh Copyright 2018 Thuisoft,
* Inc. All rights reserved. THUNISOFT PROPRIETARY/CONFIDENTIAL. Use is subject
* to license terms.
*/
package com.thunisoft.jcwzsjrh.dao;
import java.util.ArrayList;
import java.util.List;
import javax.annotation.Resource;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.jdbc.core.BeanPropertyRowMapper;
import org.springframework.stereotype.Repository;
import com.itextpdf.text.pdf.PdfStructTreeController.returnType;
import com.thunisoft.jcwzsjrh.entity.Rhbxx;
import com.thunisoft.jcwzsjrh.entity.ZT;
import com.thunisoft.jcwzsjrh.entity.Zdyxj;
import com.thunisoft.jcwzsjrh.entity.ZsjZdxx;
import com.thunisoft.jcwzsjrh.pojo.Yxjcbh;
import com.thunisoft.jcwzsjrh.pojo.Zdyxjs;
import com.thunisoft.jcwzsjrh.pojo.ZjZdYxj;
import com.thunisoft.jcwzsjrh.pub.ABJdbcTemplate;
import com.thunisoft.jcwzsjrh.pub.Constants;
/**
* ArteryBsaeDao
*
* @author zhangjianxin
* @version 1.0
*
*/
@Repository
public class ArteryBsaeDao {
@Autowired
private ABJdbcTemplate abaseconn;
/**
* 通过主体类型查询主体
*
* @param ztlx
* @return
*/
public ZT getZtByZtlx(Integer ztlx) {
StringBuilder sql = new StringBuilder();
sql.append("select c_bh,n_ztlx,c_zsjbmc,c_zsj_rhjgbmc");
sql.append(" from ").append(Constants.ZSJ_SCHEMA).append(".t_zt");
sql.append(" where n_ztlx = ?");
return abaseconn.queryForObject(sql.toString(), new Object[] { ztlx }, new BeanPropertyRowMapper<ZT>(ZT.class));
}
/**
* 通过主体编号查询融合表信息
*
* @param ztbh
* @return
*/
public List<Rhbxx> queryRhbxx(String ztbh) {
StringBuilder sql = new StringBuilder();
sql.append("select rhb.c_bh as rhbbh,rhb.c_bh_zt as ztbh,rhb.c_bh_ysjb as bbh,bjg.c_name as bmc,");
sql.append("bjg.c_db_name as dbname, rhb.c_ysj_zjzdmc as zjzdmc, rhb.c_ysj_wybs AS wybs, rhb.c_ysj_pxzd AS pxzd");
sql.append(" from ").append(Constants.ZSJ_SCHEMA).append(".t_ztrhb rhb");
sql.append(" inner join ").append(Constants.YSJ_SCHEMA).append(".t_sjkbjgxxb bjg");
sql.append(" on bjg.c_bh = rhb.c_bh_ysjb");
sql.append(" where rhb.c_bh_zt = ?");
return abaseconn.query(sql.toString(), new Object[] { ztbh }, new BeanPropertyRowMapper<Rhbxx>(Rhbxx.class));
}
/**
* 查询字段优先级
*
* @param ztbh
* @return
*/
public List<Zdyxj> queryZdyxj(String ztbh) {
StringBuilder sql = new StringBuilder();
sql.append("select yxj.c_bh_zt as ztbh,yxj.c_bh_ztrhb rhbbh,yxj.c_bh_ysjb as bbh,bjg.c_name as bmc,");
sql.append("yxj.c_bh_ysjbzd as zdbh,yxj.c_zsj_bzdmc as zsjbzdmc,yxj.n_yxj as yxj,yxj.n_zxd as zxd,");
sql.append("zdxx.c_zdmc as ysjzdmc,yxj.c_mrz as mrz");
sql.append(" from ").append(Constants.ZSJ_SCHEMA).append(".t_zdyxj yxj");
sql.append(" inner join ").append(Constants.YSJ_SCHEMA).append(".t_sjkbjgxxb bjg");
sql.append(" on bjg.c_bh = yxj.c_bh_ysjb");
sql.append(" left join ").append(Constants.YSJ_SCHEMA).append(".t_sjkzdxxb zdxx");
sql.append(" on zdxx.c_sjkjgxxb_id = yxj.c_bh_ysjb and zdxx.c_bh = yxj.c_bh_ysjbzd");
sql.append(" where c_bh_zt = ? ");
return abaseconn.query(sql.toString(), new Object[] { ztbh }, new BeanPropertyRowMapper<Zdyxj>(Zdyxj.class));
}
/**
* 查询主数据字段信息
*
* @param zsjbmc
* @return
*/
public List<ZsjZdxx> queryZsjZdxx(String zsjbmc) {
StringBuilder sql = new StringBuilder();
sql.append("select c_bmc, c_zdmc, c_zdbm, n_zdfl ");
sql.append(" from ").append(Constants.ZSJ_SCHEMA).append(".t_zsjbxx ");
sql.append(" where c_bmc = ?");
sql.append(" order by n_order");
return abaseconn.query(sql.toString(), new Object[] { zsjbmc }, new BeanPropertyRowMapper<ZsjZdxx>(ZsjZdxx.class));
}
/**
* 查询主数据参与融合字段信息
*
* @param zsjbmc
* @return
*/
public List<ZsjZdxx> queryZsjRhZdxx(String zsjbmc) {
StringBuilder sql = new StringBuilder();
sql.append("select c_bmc, c_zdmc, c_zdbm, n_zdfl ");
sql.append(" from ").append(Constants.ZSJ_SCHEMA).append(".t_zsjbxx ");
sql.append(" where c_bmc = ? and n_zdfl > 1");
sql.append(" order by n_order");
return abaseconn.query(sql.toString(), new Object[] { zsjbmc }, new BeanPropertyRowMapper<ZsjZdxx>(ZsjZdxx.class));
}
/**
* 质检接口返回的实体 插入原数据质检字段优先级表
* @param c_zdmc
* @param c_zdly_bm
* @param c_zdly_wbj
* @param c_zdly_bbh
* @param n_yxj
* @param n_zxd
* @param n_order
*/
public void insertZjzdyxj(String c_bh,String c_zdmc,String c_zdly_bm,String c_zdly_wbj,String c_zdly_bbh,String c_zdly_zdbh,int n_yxj,double n_zxd){
StringBuilder sql = new StringBuilder();
sql.append("INSERT INTO db_jcwzsj.t_zjzdyxj VALUES(?,?,?,?,?,?,?,?)");
abaseconn.update(sql.toString(), new Object[] {c_bh,c_zdmc,c_zdly_bm,c_zdly_wbj, c_zdly_bbh,c_zdly_zdbh,n_yxj,n_zxd});
}
/**
* 重新将对象修改后的字段优先级以及置信度插回zdyxj表
* @param yxjzxd
*/
public void insertzdyxj(Zdyxjs yxjzxd){
StringBuilder sql = new StringBuilder();
sql.append("INSERT INTO db_jcwzsj.t_zdyxj VALUES(?,?,?,?,?,?,?,?,?,?,?)");
abaseconn.update(sql.toString(), new Object[] {yxjzxd.getCbh(),yxjzxd.getCbhzt(),yxjzxd.getCbhysjb(),yxjzxd.getCbhysjbzd(), yxjzxd.getCzsjbzdmc(),yxjzxd.getNyxj(),yxjzxd.getNzxd(),yxjzxd.getCkxly(),yxjzxd.getNorder(),yxjzxd.getCbhztrhb(),yxjzxd.getCmrz()});
}
/**
* 查询主数据别名对应的字段名称
*
* @param c_zdbm
* @return
*/
public ZsjZdxx queryZdmc(String c_zdbm) {
StringBuilder sql = new StringBuilder();
sql.append("select c_bmc as CBmc, c_zdmc as CZdmc, c_zdbm as CZdbm, n_zdfl as NZdfl ");
sql.append(" from ").append(Constants.ZSJ_SCHEMA).append(".t_zsjbxx ");
sql.append(" where c_zdbm = ?");
System.out.println(abaseconn);
return abaseconn.queryForObject(sql.toString(), new Object[] { c_zdbm }, new BeanPropertyRowMapper<ZsjZdxx>(ZsjZdxx.class));
}
/**
* 查询字段优先级表编号
*
* @param ztbh
* @return
*/
public Yxjcbh queryZdyxjbh(String c_bh_ysjb,String c_bh_ysjbzd) {
StringBuilder sql = new StringBuilder();
sql.append("select c_bh as Cbh");
sql.append(" from ").append(Constants.ZSJ_SCHEMA).append(".t_zdyxj ");
sql.append(" where c_bh_ysjb = ? and c_bh_ysjbzd = ? ");
return abaseconn.queryForObject(sql.toString(), new Object[] { c_bh_ysjb,c_bh_ysjbzd }, new BeanPropertyRowMapper<Yxjcbh>(Yxjcbh.class));
}
/**
* 加载字段优先级表到缓存
*
* @param ztbh
* @return
*/
public List<Zdyxjs> loadCacheZdyxj() {
StringBuilder sql = new StringBuilder();
sql.append("select c_bh as cbh,c_bh_zt as cbhzt,c_bh_ysjb as cbhysjb,c_bh_ysjbzd as cbhysjbzd,c_zsj_bzdmc as czsjbzdmc,COALESCE(n_yxj, 0) as nyxj,COALESCE(n_zxd, 0.0) as nzxd,c_kxly as ckxly,n_order as norder,c_bh_ztrhb as cbhztrhb,c_mrz as cmrz");
sql.append(" from ").append(Constants.ZSJ_SCHEMA).append(".t_zdyxj ");
return abaseconn.query(sql.toString(),new BeanPropertyRowMapper<Zdyxjs>(Zdyxjs.class));
}
/**
* 加载质检字段优先级表到内存
*/
public List<ZjZdYxj> loadCacheZjZdyxj() {
StringBuilder sql = new StringBuilder();
sql.append("select c_bh as cbh,c_zdmc as czdmc,c_zdly_bm as czdlybm,c_zdly_wbj as czdlywbj,c_zdly_bbh as czdlybbh,c_zdly_zdbh as czdlyzdbh,COALESCE(n_yxj, 0) as nyxj,COALESCE(n_zxd, 0.0) as nzxd");
sql.append(" from ").append(Constants.ZSJ_SCHEMA).append(".t_zjzdyxj ");
return abaseconn.query(sql.toString(),new BeanPropertyRowMapper<ZjZdYxj>(ZjZdYxj.class));
}
/**
* 加载zsjbxx表到内存
*/
public List<ZsjZdxx> loadCacheZsjbxx() {
StringBuilder sql = new StringBuilder();
sql.append("select c_bmc as CBmc, c_zdmc as CZdmc, c_zdbm as CZdbm, n_zdfl as NZdfl ");
sql.append(" from ").append(Constants.ZSJ_SCHEMA).append(".t_zsjbxx ");
return abaseconn.query(sql.toString(),new BeanPropertyRowMapper<ZsjZdxx>(ZsjZdxx.class));
}
/**
* 清空字段优先级表
*/
public void clearZdyxj() {
List<String> tables = new ArrayList<String>();
tables.add(".t_zdyxj");
String[] sqls = new String[tables.size()];
for (int i = 0; i < tables.size(); i++) {
sqls[i] = "truncate table " + Constants.ZSJ_SCHEMA + tables.get(i);
}
abaseconn.batchUpdate(sqls);
}
/**
* 批量更新zjzdyxj表yxj字段
*/
public int updateZdyxj() {
StringBuilder sql = new StringBuilder();
sql.append("UPDATE db_jcwzsj.t_zjzdyxj AS P SET n_yxj = A .yxj2 FROM(SELECT c_bh,c_zdmc,ROW_NUMBER () OVER (PARTITION BY c_zdmc ORDER BY n_zxd DESC) AS yxj2 FROM db_jcwzsj.t_zjzdyxj) AS A WHERE P .c_bh = A .c_bh;");
return abaseconn.update(sql.toString());
}
}
更新置信度,这个 任务 首先将另一个接口返回的json数据转换成对象 然后落库 然后用到了批量更新 落库后的yxj字段,然后将更新后的表加载到内存封装成list 然后把另一个表数据加载到内存封装成list 然后清空该表 然后在根据三个表的关联关系 将对象某个属性值进行修改 然后将该对象重新插会该表;这些就实现了根据另一个表来批量更新这个表;
**
* ZxdcqService
*
* @author liubo
* @version 1.0
*
*/
@Service
public class ZxdcqService {
private static Logger logger = LoggerFactory.getLogger(ZxdcqService.class);
@Autowired
private ArteryBsaeDao abasedao;
public List<Object> setZxdData() {
String uri = ArteryConfigUtil.getProperty("zxd.url");
String action = "/api/service/zsjzb";
String result = HttpClientUtil.getResult(uri, action);
//获取实体对象
ZxdPojo pojo = JSON.parseObject(result, ZxdPojo.class);
List<XxxPojo> list = pojo.getZsjzb();
List<Double> bjls = new ArrayList<>();
List<Integer> bjls1 = new ArrayList<>();
List<Double> zxds = new ArrayList<>();
List<String> sjlyzdlys = new ArrayList<>();
List<String> zsjZdxxs = new ArrayList<>();
// 加载字段优先级表到内存
List<Zdyxjs> zdyxjs = abasedao.loadCacheZdyxj();
for (Zdyxjs zdyxjs2 : zdyxjs) {
String sjlyzdly = zdyxjs2.getCbhysjb() + zdyxjs2.getCbhysjbzd();
sjlyzdlys.add(sjlyzdly);
}
// 转成map形式
HashMap<String, Zdyxjs> zdyxjMap = new HashMap<>();
// 加载zsjbxx表到内存
List<ZsjZdxx> zsjbxxs = abasedao.loadCacheZsjbxx();
for (ZsjZdxx zsjZdxx : zsjbxxs) {
String zdbm = zsjZdxx.getCZdbm();
zsjZdxxs.add(zdbm);
}
System.out.println(list.size()+"+++++++++++++++++++++++++++++++++++++++");
//循环对象获取对应的实体
for (int i = 0; i < list.size(); i++) {
XxxPojo xxxPojo = list.get(i);
// 获取对象的字段别名
String zdbm = xxxPojo.getXxx();
System.out.println(zdbm+"-----------------");
if (zsjZdxxs.contains(zdbm)) {
// 获取当前对象的字段名
String zdmc = abasedao.queryZdmc(xxxPojo.getXxx()).getCZdmc();
System.out.println(zdmc + "zdmc++++++++++++++++++++++++");
List<ZdzbjgPojo> zdzbjgPojos = xxxPojo.getZdzbjg();
// 获取一个字段指标结果下的所有表记录数
for (ZdzbjgPojo zdzbjgPojo : zdzbjgPojos) {
bjls1.add(Integer.parseInt(zdzbjgPojo.getBjls()));
}
// 将所有的表记录数升序
Collections.sort(bjls);
// 反转 则转成降序
Collections.reverse(bjls);
for (ZdzbjgPojo zdzbjgPojo : zdzbjgPojos) {
// 得到委办局
String wbj = zdzbjgPojo.getWbjdw();
// 得到表来源编号
String bbh = zdzbjgPojo.getBbs();
// 得到字段来源编号
String zdbh = zdzbjgPojo.getZdbs();
System.out.println(bbh+"-----"+zdbh);
// 当前质检字段优先级编号
if (sjlyzdlys.contains(bbh + zdbh)) {
Yxjcbh yxjbh = abasedao.queryZdyxjbh(bbh, zdbh);
System.out.println(yxjbh.getCbh()+"-------------");
// 获得当前字段的表记录数
int dqsjly = Integer.parseInt(zdzbjgPojo.getBjls());
// 得到当前字段置信度
int bjlsmax = (int) Collections.max(bjls1);
double zxd = ((double)dqsjly/ (double)bjlsmax) * 100;
// 因为分子相同 分母越大的值越大 yxj为索引+1
bjls.add(zxd);
// 得到当前字段优先级
int yxj = bjls.indexOf(zxd) + 1;
System.out.println(yxj+"----------------"+zxd);
abasedao.insertZjzdyxj(yxjbh.getCbh(), zdmc, zdbm, wbj,
bbh,zdbh, yxj, zxd);
} else {
continue;
}
}
}else {
continue;
}
}
// 清空字段优先级表
abasedao.clearZdyxj();
// 转成map形式
for (Zdyxjs zdy : zdyxjs) {
zdyxjMap.put(zdy.getCbh(), zdy);
}
// 加载质检字段优先级表到内存
List<ZjZdYxj> zjZdYxjs = abasedao.loadCacheZjZdyxj();
for (ZjZdYxj zjYxj : zjZdYxjs) {
int count = 0;
if (zdyxjMap.containsKey(zjYxj.getCbh())) {
double newzxd = zjYxj.getNzxd();
int newyxj = zjYxj.getYxj();
Zdyxjs yxjzxd = zdyxjMap.get(zjYxj.getCbh());
// 修改该对象的置信度,优先级字段
yxjzxd.setNzxd(newzxd);
yxjzxd.setNyxj(newyxj);
// 重新将数据插入数据到zdyxj表中
abasedao.insertzdyxj(yxjzxd);
count++;
}
// 如果关联插入异常则将原来的数据插会zdyxj表中
if (count == 0) {
for (int i = 0; i < zdyxjs.size(); i++) {
abasedao.insertzdyxj(zdyxjs.get(i));
}
}
}
return null;
}
}