本文主要内容是开发过程中用到的关于JDBCTemplate一些代码实例,自己做个记录也可以帮助初入门的朋友可以快速上手,有问题可以下方留言
一、基本用法
public List<OrderList> queryOrderInfoById(int orderId){ String sql = "SELECT * FROM order WHERE oid = ?"; List<OrderList> result = jdbcTemplate.query(sql, new Object[] { orderId }, new RowMapper<OrderList>(){ @Override public OrderList mapRow(ResultSet rs, int value) throws SQLException { DateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); OrderList orderinfo = new OrderList(); orderinfo.setOrderId(rs.getInt("id")); orderinfo.setOrderTime(sdf.format(rs.getTimestamp("order_time"))); orderinfo.setState(rs.getInt("state")); orderinfo.setTotalPrice(rs.getDouble("total_price")); orderinfo.setMailPrice(rs.getDouble("mail_price")); return orderinfo; } }); return result; }
注:JDBCTemplate 中的sql使用“?”作为占位符,query中用new Object[] { orderId }
输入值
二、常用方法
-
依赖注入
@Resource(name = "jdbcTemplate") private JdbcTemplate jdbcTemplate;
-
query
//返回一个List public List<Order> getOrderByUser(Integer userId) { String sql = "SELECT * FROM order_list WHERE user_id=?"; return jdbcTemplate.query(sql, new OrderRowMapper(), new Object[]{userId}); } //返回实体 public Order getById(Integer id) { String sql = "SELECT * FROM order_list WHERE id=?"; return jdbcTemplate.query(sql, new OrderRowMapper(), new Object[]{id}).get(0); }
解析:OrderRowMapper()是数据库表字段对应实体,new Object[]{id}是对应sql语句中的占位符,顺序是对应的。
-
update
//更新 public void updateById(Order order) { String sql = "UPDATE order_list SET address_id=?,state=? WHERE id=?"; jdbcTemplate.update(sql, new Object[]{order.getAddressId(), order.getState(), order.getId()}); } //删除 public void removeByOid(Integer oid) { String sql = "DELETE FROM order_list WHERE id = ?"; jdbcTemplate.update(sql, new Object[]{oid}); }
-
queryForObject
//返回值为int public int getCountByAddressId(int addressId){ String sql = "SELECT count(*) FROM address WHERE id = ?"; return jdbcTemplate.queryForObject(sql, Integer.class, new Object[]{ addressId }); } //只查询数据中的一个字段 public String getToken(Integer type){ String sql = "SELECT token FROM puc_token WHERE type = ? limit 1"; return jdbcTemplate.queryForObject(sql, String.class, new Object[]{ type }); }
-
RowMapper定义
class OrderRowMapper implements RowMapper<Order> { @Override public Order mapRow(ResultSet rs, int value) throws SQLException { Order pr = new Order(); pr.setId(rs.getInt("id")); pr.setOrderTime(rs.getTimestamp("order_time")); pr.setUserId(rs.getInt("user_id")); pr.setAddressId(rs.getInt("address_id")); pr.setState(rs.getInt("state")); pr.setTotalPrice(rs.getDouble("total_price")); pr.setMailPrice(rs.getDouble("mail_price")); pr.setProductsPrice(rs.getDouble("products_price")); pr.setOrderTimeString(pr.getOrderTime().toString()); pr.setMessage(rs.getString("message")); return pr; } }
-
批量插入
public void saveSearchWeixinData(String sqlName, final List<KeywordWeixinBean> kw, final String keyid) { String sql = "INSERT INTO " + sqlName + " (msgid,title,digest,text,cdate,url,ori_url,keyword,idate," + "flash,acount,biz,screen_name,account,description,verified," + "source_url,source_name,keyid,is_complete) VALUES (?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?)"; jdbcTemplate.batchUpdate(sql, new BatchPreparedStatementSetter() { public int getBatchSize() { return kw.size(); } public void setValues(PreparedStatement ps, int i)throws SQLException { KeywordWeixinBean list = kw.get(i); ps.setString(1, list.getMsgId()); ps.setString(2, list.getTitle()); ps.setString(3, list.getDigest()); ps.setString(4, list.getText()); ps.setString(5, list.getCdate()); ps.setString(6, list.getUrl()); ps.setString(7, list.getOri_url()); ps.setString(8, list.getKeyword()); ps.setString(9, list.getIdate()); ps.setString(10, list.getFlash()); ps.setString(11, list.getAcount()); ps.setString(12, list.getBiz()); ps.setString(13, list.getScreen_name()); ps.setString(14, list.getAccount()); ps.setString(15, list.getDescription()); ps.setBoolean(16, list.getVerified()); ps.setString(17, list.getSourceUrl()); ps.setString(18, list.getSourceName()); ps.setString(19, keyid); ps.setInt(20, 0); } }); }
三、常见问题
-
数据插入或修改不成功
问题描述:sql操作完全正确,项目运行没有报错,但是数据插入操作数据库中没有数据,如果表中有自增id的话查看id会发现id已经增长了。
相关知识:Spring声明式事务相关的知识。配置文件如下<!-- 配置事务传播特性 --> <tx:advice id="txAdvice" transaction-manager="transactionManager"> <tx:attributes> <tx:method name="update*" propagation="REQUIRED" read-only="false" rollback-for="Exception" /> <tx:method name="add*" propagation="REQUIRED" read-only="false" rollback-for="Exception" /> <tx:method name="save*" propagation="REQUIRED" read-only="false" rollback-for="Exception" /> <tx:method name="del*" propagation="REQUIRED" read-only="false" rollback-for="Exception" /> <tx:method name="remove*" propagation="REQUIRED" read-only="false" rollback-for="Exception" /> <tx:method name="put*" propagation="REQUIRED" read-only="false" rollback-for="Exception" /> <tx:method name="*" propagation="SUPPORTS" read-only="true" /> </tx:attributes> </tx:advice> <!-- 配置参与事务的类 --> <aop:config> <aop:advisor advice-ref="txAdvice" pointcut="execution(* com.test.es..service..*.*Service*.*(..))" /> </aop:config>
原因分析:Spring框架中对于数据库操作相关的方法需要在配置文件中体现出来,方法名的命名需要以配置文件中限定的方式,否则默认为“只读”,对数据库的插入操作就会失败。同时,数据库操作的java文件需要在配置文件中的
配置参与事务的类
中,否则也会操作失败。
解决方法:方法名改为配置文件中限定的形式或者在数据库操作的相关方法上加上@Transactional(readOnly = true)
注解 -
@Autowired 错误导致数据库插入失败
@Autowired TestDao testDao;
TestDao 是写好的数据库操作层,testDao是一个除了首字母小写其他都需要跟其一样的单词,否则插入操作也会失败