JdbcTemplate简介
Spring对数据库的操作在jdbc上面做了深层次的封装,使用spring的注入功能,可以把DataSource注册到JdbcTemplate之中。
JdbcTemplate位于spring-jdbc-4.3.0.RELASE.jar中。其全限定命名为org.springframework.jdbc.core.JdbcTemplate。
要使用JdbcTemlate还需一个spring-tx-4.3.0.RELASE.jar这个包包含了一下事务和异常控制
主要提供以下五类方法:
execute方法:可以用于执行任何SQL语句,一般用于执行DDL语句;
update方法及batchUpdate方法:update方法用于执行新增、修改、删除等语句;batchUpdate方法用于执行批处理相关语句;
query方法及queryForXXX方法:用于执行查询相关语句;
call方法:用于执行存储过程、函数相关语句。
JdbcTemplate简介
//取得jdbcTemplate对象
ApplicationContext ctx=new ClassPathXmlApplicationContext("applicationContext.xml");//启动IoC容器
JdbcTemplate jdbcTemplate=(JdbcTemplate) ctx.getBean("jdbcTemplate"); //获取IoC容器中JdbcTemplate实例
//或者注入
@Resource
JdbcTemplate jdbcTemplate;
//本地获取jdbcTemplate对象
//JdbcTemplate jdbcTemplate=(JdbcTemplate) AppUtil.getBean("jdbcTemplate")
初始化jdbcTemplate对象
//update插入一条数据
String sql="insert into user (name,deptid) values (?,?)";
int count= jdbcTemplate.update(sql, new Object[]{"caoyc",3});
//update修改一条数据
String sql="update user set name=?,deptid=? where id=?";
jdbcTemplate.update(sql,new Object[]{"zhh",5,51});
//update删除一条数据
String sql="delete from user where id=?";
jdbcTemplate.update(sql,51);
//queryForXXX 本质上和queryForObject()相同,返回都是单行单列一个数据
String userAccountSql="select account from scpn_user where user_id="+userAccountId;
String userAccount=(String)jdbcTemplate.queryForObject(userAccountSql, java.lang.String.class);
queryForXXX 返回单个值
//queryForObject 返回单个值
String sql="select count(*) from user";
int count= jdbcTemplate.queryForObject(sql, Integer.class);
queryForObject 返回单个值
//queryForObject 读取单个对象 并转换成实体类
String sql="select id,name,deptid from user where id=?";
RowMapper<User> rowMapper=new BeanPropertyRowMapper<User>(User.class);
User user= jdbcTemplate.queryForObject(sql, rowMapper,52);
//【注意】:1、使用BeanProperytRowMapper要求sql数据查询出来的列和实体属性需要一一对应。
//如果数据中列明和属性名不一致,在sql语句中需要用as重新取一个别名
queryForObject 读取单个对象 并转换成实体类
//query 读取多个对象并转换成list集合(不转参)
String sql="select id,name,deptid from user";
RowMapper<User> rowMapper=new BeanPropertyRowMapper<User>(User.class);
List<User> users= jdbcTemplate.query(sql, rowMapper);
//【注意】:1、使用BeanProperytRowMapper要求sql数据查询出来的列和实体属性需要一一对应。
//如果数据中列明和属性名不一致,在sql语句中需要用as重新取一个别名
query 读取多个对象并转换成list集合(不转参)
//queryForMap 返回map对象(查询一条记录)
//查询一行数据,即一条记录,一条记录包含多个字段, 使用返回的列做key。(属性作为key,值作为value)
String userAccountSql="select account,create_time from scpn_user where user_id="+userAccountId;
Map userAccountMap=(Map)jdbcTemplate.queryForMap(userAccountSql);
String userAccount= (String)userAccountMap.get("account"); //取出数据库中char类型的数据转换为String
String createTime= (String)userAccountMap.get("create_time").toString(); //取出数据库中datetime类型的数据转换为String
结果样例:
{ID=10000044860001, F_BH=M03030420160317017, F_DZDLX=电厂定值单}
queryForMap 返回map对象(查询一条记录)
//queryForList 返回Map的集合List
//返回Map的集合List(它包含多条记录,即queryForMap的集合,数组对象), 用列名做key, 每一个map代表一条数据库记录,
需要使用循环来输出每一条记录,如果想在结果集中加入一个字段,也可以采用如下的put方法。
String sql = "SELECT * FROM mcp_forum_post";
List scpnPostList = jdbcTemplate.queryForList(sql);
if (scpnPostList != null) {
for (int i = 0; i < scpnPostList.size(); i++) {
Long userAccountId = (Long)scpnPostList.get(i).get("user_id");
Long lastmodUser = (Long)scpnPostList.get(i).get("lastmod_user");
scpnPostList.get(i).put("lastmodUserAccount", "xxxx"); //可以在结果集中插入一个字段
}
}
queryForList 返回Map的集合List
String sql="insert into user (name,deptid) values (?,?)";
List<Object[]> batchArgs=new ArrayList<Object[]>();
batchArgs.add(new Object[]{"caoyc",6});
batchArgs.add(new Object[]{"zhh",8});
batchArgs.add(new Object[]{"cjx",8});
jdbcTemplate.batchUpdate(sql, batchArgs);
批量插入(batchUpdate简单版)
//批量插入
public void insertData(List<GzrepDwjzmx> list) {
String sql = "INSERT INTO W_DWJZMX (MY_ID_,XH,SDSD,SF,DQ,XQ,DW,DG,DGDW,DC,JZBH,RL,LX,DYDJ,CQDW,TCRQ,ZT,TYSJ,BZ,SWDJ,TLDJ,TXDJ,CCDJ,ZDJ,SBZT)" + " values (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?,?)";
List<Object[]> lists = new ArrayList<Object[]>();
for (GzrepDwjzmx gd : list) {
Object[] os = new Object[] { gd.getMyId(), gd.getXh(), gd.getSdsd(), gd.getSf(), gd.getDq(), gd.getXq(), gd.getDw(), gd.getDg(), gd.getDgdw(), gd.getDc(), gd.getJzbh(), gd.getRl(), gd.getLx(), gd.getDydj(), gd.getCqdw(), gd.getTcrq(), gd.getZt(), gd.getTysj(), gd.getBz(), gd.getSwdj(), gd.getTldj(), gd.getTxdj(), gd.getCcdj(), gd.getZdj() ,gd.getSbzt()};
lists.add(os);
}
jdbcTemplate.batchUpdate(sql, lists);
}
批量插入
// 批量删除
public void deleteBetchData(List<QwfgdlfxbAll> list) {
// String sql = "DELETE FROM W_QWFGDLFXBALL WHERE RQ=#{?,jdbcType=DATE}";
String sql = "DELETE FROM W_QWFGDLFXBALL WHERE RQ=?";
List<Object[]> lists = new ArrayList<Object[]>();
for (QwfgdlfxbAll e : list) {
Object[] os = new Object[]{e.getRq()};
lists.add(os);
}
// int[] batchUpdate = jdbcTemplate.batchUpdate(sql, lists);
// System.out.println("成功删除的条数==="+batchUpdate.length);
批量删除
//queryForList
String userId = curUser.getUserId();
String sqlRole =
"select name_ from ebos_org_group where group_id_ in"+
"("+
"select group_id_ from EBOS_ORG_USER_GROUP t where user_id_ ='"+userId+"'"+
")";
List<Map<String, Object>> queryForList = jdbcTemplate.queryForList(sqlRole);
boolean flag = false;
for(Map<String, Object> map : queryForList){
//System.out.println(map.get("name_"));
if("审批人".equals(map.get("name_"))){
flag = true;
}
}
queryForList
旧版jdbc即使用BatchPreparedStatementSetter对象操作
// 批量插入 旧版jdbc批量插入(使用BatchPreparedStatementSetter对象),这里似乎有个bug,插入的时间没有时分秒的,而且只能用setObject不然值为空的话就报错
public void insertData(List<YjDlfhBaseData> list) {
String sql = "INSERT INTO W_YJDLFHBASEDATA (ID,F_RQ,F_ZDM,F_DRZ,F_DYZ," + "F_DNZ,F_DRZD,F_DYZD,F_DNZD,F_DRZDSK," + "F_DYZDSK,F_DNZDSK,F_DRZX,F_DYZX,F_DNZX,"
+ "F_DRZXSK,F_DYZXSK,F_DNZXSK,F_QNJRZ,F_QNJYZ," + "F_QNJNZ,F_ZT,F_DRPJZ,F_DYPJZ,F_DNPJZ)" + " values (?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?)";
final List<YjDlfhBaseData> list2 = list;
jdbcTemplate.batchUpdate(sql, new BatchPreparedStatementSetter() {
public int getBatchSize() {
return list2.size();
}
public void setValues(PreparedStatement ps, int index) throws SQLException {
int j = 1;
YjDlfhBaseData e = list2.get(index);
ps.setObject(j++, e.getId());
ps.setObject(j++, new java.sql.Date(e.getRq().getTime()));
ps.setObject(j++, e.getZdm());
ps.setObject(j++, e.getDrz());
ps.setObject(j++, e.getDyz());
ps.setObject(j++, e.getDnz());
ps.setObject(j++, e.getDrzd());
ps.setObject(j++, e.getDyzd());
ps.setObject(j++, e.getDnzd());
ps.setObject(j++, e.getDrzdsk() == null ? null : new java.sql.Date(e.getDrzdsk().getTime()));
ps.setObject(j++, e.getDyzdsk() == null ? null : new java.sql.Date(e.getDyzdsk().getTime()));
ps.setObject(j++, e.getDnzdsk() == null ? null : new java.sql.Date(e.getDnzdsk().getTime()));
ps.setObject(j++, e.getDrzx());
ps.setObject(j++, e.getDyzx());
ps.setObject(j++, e.getDnzx());
ps.setObject(j++, e.getDrzxsk() == null ? null : new java.sql.Date(e.getDrzxsk().getTime()));
ps.setObject(j++, e.getDyzxsk() == null ? null : new java.sql.Date(e.getDyzxsk().getTime()));
ps.setObject(j++, e.getDnzxsk() == null ? null : new java.sql.Date(e.getDnzxsk().getTime()));
ps.setObject(j++, e.getQnjrz());
ps.setObject(j++, e.getQnjyz());
ps.setObject(j++, e.getQnjnz());
ps.setObject(j++, e.getZt());
ps.setObject(j++, e.getDrpjz());
ps.setObject(j++, e.getDypjz());
ps.setObject(j++, e.getDnpjz());
}
});
}
旧版jdbc批量插入
// 批量插入
public void insertData(List<YjDlfhBaseData> list) {
String sql = "INSERT INTO W_YJDLFHBASEDATA (ID,F_RQ,F_ZDM,F_DRZ,F_DYZ,F_DNZ,F_DRZD,F_DYZD,F_DNZD,F_DRZX,F_DYZX,F_DNZX,"
+ "F_QNJRZ,F_QNJYZ,F_QNJNZ,F_ZT,F_DRPJZ,F_DYPJZ,F_DNPJZ,F_DRZDSK,F_DYZDSK,F_DNZDSK,F_DRZXSK,F_DYZXSK,F_DNZXSK)"
+ " values (?,to_date(?,'yyyy-MM-dd'),?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,to_date(?,'yyyy-MM-dd HH24:mi:ss'),to_date(?,'yyyy-MM-dd HH24:mi:ss'),to_date(?,'yyyy-MM-dd HH24:mi:ss'),to_date(?,'yyyy-MM-dd HH24:mi:ss'),to_date(?,'yyyy-MM-dd HH24:mi:ss'),to_date(?,'yyyy-MM-dd HH24:mi:ss'))";
final List<YjDlfhBaseData> list2 = list;
jdbcTemplate.batchUpdate(sql, new BatchPreparedStatementSetter() {
public int getBatchSize() {
return list2.size();
}
public void setValues(PreparedStatement ps, int index) throws SQLException {
int j = 1;
YjDlfhBaseData e = list2.get(index);
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
SimpleDateFormat sdfTime = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
ps.setObject(j++, e.getId());
ps.setObject(j++, e.getRq()==null?null:sdf.format(e.getRq()));
ps.setObject(j++, e.getZdm());
ps.setObject(j++, e.getDrz());
ps.setObject(j++, e.getDyz());
ps.setObject(j++, e.getDnz());
ps.setObject(j++, e.getDrzd());
ps.setObject(j++, e.getDyzd());
ps.setObject(j++, e.getDnzd());
ps.setObject(j++, e.getDrzx());
ps.setObject(j++, e.getDyzx());
ps.setObject(j++, e.getDnzx());
ps.setObject(j++, e.getQnjrz());
ps.setObject(j++, e.getQnjyz());
ps.setObject(j++, e.getQnjnz());
ps.setObject(j++, e.getZt());
ps.setObject(j++, e.getDrpjz());
ps.setObject(j++, e.getDypjz());
ps.setObject(j++, e.getDnpjz());
ps.setObject(j++, e.getDrzdsk() == null ? null : sdfTime.format(e.getDrzdsk()));
ps.setObject(j++, e.getDyzdsk() == null ? null : sdfTime.format(e.getDyzdsk()));
ps.setObject(j++, e.getDnzdsk() == null ? null : sdfTime.format(e.getDnzdsk()));
ps.setObject(j++, e.getDrzxsk() == null ? null : sdfTime.format(e.getDrzxsk()));
ps.setObject(j++, e.getDyzxsk() == null ? null : sdfTime.format(e.getDyzxsk()));
ps.setObject(j++, e.getDnzxsk() == null ? null : sdfTime.format(e.getDnzxsk()));
}
});
}
旧版jdbc批量插入对日期的优化处理
// 批量删除
public void deleteData(List<YjDlfhBaseData> list) {
String sql = "delete from W_YJDLFHBASEDATA where F_RQ=to_date(?,'yyyy-MM-dd') and F_ZDM=?";
final List<YjDlfhBaseData> list2 = list;
jdbcTemplate.batchUpdate(sql, new BatchPreparedStatementSetter() {
public int getBatchSize() {
return list2.size();
}
public void setValues(PreparedStatement ps, int index) throws SQLException {
int j = 1;
YjDlfhBaseData e = list2.get(index);
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
ps.setObject(j++, e.getRq()==null?null:sdf.format(e.getRq()));
ps.setObject(j++, e.getZdm());
}
});
}
旧版jdbc批量删除