当前位置: 首页 > news >正文

网站建设招标公告展厅装饰公司

网站建设招标公告,展厅装饰公司,seo信息网,网络营销环境分析主要包括在最近的一个工作中#xff0c;为了简单方便我就是用了Spring自带的JdbcTemplate来访问数据库#xff0c;我以为之前自己很熟练的掌握#xff0c;后来才发现我太天真了#xff0c;踩了很多坑。 基本方法 JdbcTemplate自带很多方法可以执行SQL语句,以下我主要列举#xf…在最近的一个工作中为了简单方便我就是用了Spring自带的JdbcTemplate来访问数据库我以为之前自己很熟练的掌握后来才发现我太天真了踩了很多坑。 基本方法 JdbcTemplate自带很多方法可以执行SQL语句,以下我主要列举比较常用的方法 //执行SQL返回一个对象 Override public T T queryForObject(String sql, RowMapperT rowMapper, Object... args)throws DataAccessException {ListT results query(sql, args, new RowMapperResultSetExtractorT(rowMapper, 1));return DataAccessUtils.requiredSingleResult(results); }//同上不过多要传入返回值的对象的Class Override public T T queryForObject(String sql, ClassT requiredType)throws DataAccessException {return queryForObject(sql, getSingleColumnRowMapper(requiredType)); }//执行SQL返回一个Map对象 Override public MapString, Object queryForMap(String sql, Object... args)throws DataAccessException {return queryForObject(sql, args, getColumnMapRowMapper()); }//执行SQL返回一个List对象 Override public T ListT query(String sql, Object[] args, RowMapperT rowMapper) throws DataAccessException {return query(sql, args, new RowMapperResultSetExtractorT(rowMapper)); }//执行SQL返回一个List对象 Override Override public T ListT queryForList(String sql, ClassT elementType, Object... args)throws DataAccessException {return query(sql, args, getSingleColumnRowMapper(elementType)); }//执行一条SQL主要用于更新、新增数据 Override public int update(String sql, Object... args) throws DataAccessException {return update(sql, newArgPreparedStatementSetter(args)); }//执行SQL返回一个List对象List里是Map对象 Override public ListMapString, Object queryForList(String sql, Object... args) throws DataAccessException {return query(sql, args, getColumnMapRowMapper()); }注意点 至少返回一个对象 Override public T T queryForObject(String sql, RowMapperT rowMapper, Object... args)throws DataAccessException {ListT results query(sql, args, new RowMapperResultSetExtractorT(rowMapper, 1));return DataAccessUtils.requiredSingleResult(results); }public RowMapperResultSetExtractor(RowMapperT rowMapper, int rowsExpected) {Assert.notNull(rowMapper, RowMapper is required);this.rowMapper rowMapper;this.rowsExpected rowsExpected; }以上代码就是可以知道必须返回一个对象不能返回null如果从数据库查找发现没有一条信息吻合就会报错报以下的错误 org.springframework.dao.IncorrectResultSizeDataAccessException: Incorrect result size: expected 1, actual 0所以如果不确定是否有信息就使用query、queryForList来避免错误。返回单对象一般会有这样的限制如果自己不确定可以使用该方法的时候看一下源码设置了1就代表必须要有一个值。 返回指定对象 JdbcTemplate里面这样的方法就是可以传入了一个对象的Class值就可以返回该对象的值但是需要注意它只支持基础类型 //例如它支持以下的写法 public Integer getCourseCount(String sql){return (Integer) jdbcTemplate.queryForObject(sql,java.lang.Integer.class); }通过源代码发现ClassT requiredType这个参数支持以下类型源代码就是从primitiveWrapperTypeMap查找是否是一下类型 primitiveWrapperTypeMap.put(Boolean.class, boolean.class); primitiveWrapperTypeMap.put(Byte.class, byte.class); primitiveWrapperTypeMap.put(Character.class, char.class); primitiveWrapperTypeMap.put(Double.class, double.class); primitiveWrapperTypeMap.put(Float.class, float.class); primitiveWrapperTypeMap.put(Integer.class, int.class); primitiveWrapperTypeMap.put(Long.class, long.class); primitiveWrapperTypeMap.put(Short.class, short.class);如果需要返回自定义对象就需要另外的方法: 如果返回ListT,就如以下的案例 public ListCourse getCourseList(String sql){return jdbcTemplate.query(sql,new RowMapperCourse(){Overridepublic Course mapRow(ResultSet rs, int rowNum) throws SQLException {Integer idrs.getInt(id);String coursenamers.getString(coursename);//把数据封装到对象里Course coursenew Course();course.setId(id);course.setCoursename(coursename.trim());return course;}}); }或者使用ListMapString,Object Override public ListMyScoreDto listMyScore(Integer studentId) {String sql select g.score,c.className from grade g left join teacher t on t.idg.teacherId left join student s on s.idg.studentId left join classname c on c.idt.classNameId where s.idstudentId;ListMapString,Object list jdbcTemplate.queryForList(sql);if(list!null list.size()0){ListMyScoreDto ls new ArrayListMyScoreDto();for(int i0;ilist.size();i){MyScoreDto c new MyScoreDto();try {BeanUtils.populate(c, list.get(i));} catch (IllegalAccessException | InvocationTargetException e) {e.printStackTrace();}ls.add(c);}return ls;}return null; }使用了org.apache.commons.beanutils.BeanUtils把Map对象转换为自定义对象。 后来为了方便起见我还自己写了一个RowMapper,来简化操作 import java.lang.reflect.Field; import java.lang.reflect.Method; import java.sql.ResultSet;import org.springframework.jdbc.core.RowMapper;import com.lsb.exam.utils.StringUtils;public class MyRowMapperT implements RowMapperT {ClassT cls;public MyRowMapper(ClassT cls) {this.cls cls;}Overridepublic T mapRow(ResultSet rs, int rowNum) {try {Field[] fields cls.getDeclaredFields();T obj cls.newInstance();// 获取所有的属性for (Field field : fields) {field.setAccessible(true);if (field.getGenericType().toString().equals(class java.lang.Integer)) {Method m obj.getClass().getDeclaredMethod(set StringUtils.firstChar2UpperCase(field.getName()), java.lang.Integer.class);m.invoke(obj, rs.getInt(field.getName()));}if (field.getGenericType().toString().equals(class java.lang.String)) {Method m obj.getClass().getDeclaredMethod(set StringUtils.firstChar2UpperCase(field.getName()), java.lang.String.class);m.invoke(obj, rs.getString(field.getName()));}if (field.getGenericType().toString().equals(class java.util.Date)) {Method m obj.getClass().getDeclaredMethod(set StringUtils.firstChar2UpperCase(field.getName()), java.util.Date.class);m.invoke(obj, rs.getDate(field.getName()));}}return obj;} catch (Exception e) {e.printStackTrace();return null;}} }上面有一个错误就是如果对象继承了父类就无法将值注入到父类的的属性中因为cls.getDeclaredFields()无法获取父类的属性所以我又改了一种方法 import java.lang.reflect.Field; import java.lang.reflect.Method; import java.sql.ResultSet; import java.util.ArrayList; import java.util.Arrays; import java.util.List;import org.springframework.jdbc.core.RowMapper;import com.lsb.exam.utils.StringUtils;public class MyRowMapperT implements RowMapperT {ClassT cls;public MyRowMapper(ClassT cls) {this.cls cls;}Overridepublic T mapRow(ResultSet rs, int rowNum) {try {T obj cls.newInstance();//这个只能获取当前类的共有私有字段//Field[] fields cls.getDeclaredFields();ListField list new ArrayList();Class? c cls;//循环获取while(c ! null){list.addAll(Arrays.asList(c.getDeclaredFields()));c c.getSuperclass();}// 获取所有的属性for (Field field : list) {field.setAccessible(true);if (field.getGenericType().toString().equals(class java.lang.Integer)) {Method m obj.getClass().getMethod(set StringUtils.firstChar2UpperCase(field.getName()), java.lang.Integer.class);m.invoke(obj, rs.getInt(field.getName()));}if (field.getGenericType().toString().equals(class java.lang.String)) {Method m obj.getClass().getMethod(set StringUtils.firstChar2UpperCase(field.getName()), java.lang.String.class);m.invoke(obj, rs.getString(field.getName()));}if (field.getGenericType().toString().equals(class java.util.Date)) {Method m obj.getClass().getMethod(set StringUtils.firstChar2UpperCase(field.getName()), java.util.Date.class);m.invoke(obj, rs.getDate(field.getName()));}}return obj;} catch (Exception e) {e.printStackTrace();return null;}} }其实过程中有一个反射的知识很重要关于方法的介绍: 1、获取class 方法描述object.getClass()获取这个实例所属的class对象T.class通过类型获取所属class对象Class.forName()通过类路径获取class对象Class.getSuperclass()获取父类的class对象Class.getClasses()获取类内所有的公开的类接口枚举成员以及它继承的成员特指类Class.getDeclaredClasses()通过类内显示声明的类接口Class.getEnclosingClass()获取闭包类 2、获取属性 方法描述getDeclaredField(String name)获取指定字段(公有私有)不包括父类字段getField(String name)获取指定字段公有包括父类字段getDelaredFields()获取所有类内显示声明的字段(公有私有)不包括父类字段getFields()获取所有字段公有包括父类字段 3、获取方法 方法描述getDeclaredMethod(String name, Class? … paramType)获取指定方法公有私有不包括父类方法getMethod(String name, Class? … paramType)获取指定方法公有包括父类方法getDeclaredMethods()获取所有声明方法公有私有不包括父类方法getMethods()获取所有方法公有包括父类方法 上面的信息可以访问Oracle网站的反射信息。
http://wiki.neutronadmin.com/news/273727/

相关文章:

  • 做外卖有哪些网站推广型网站制作哪家好
  • 网站名称与域名办公室装修设计效果
  • 公司网站设计规范网页设计入门与应用电子书pdf百度网盘
  • 建设银行网站 查余额图派科技做网站怎么样
  • 网站建设进什么科目福州市建设局职改办门户网站
  • 建一个网站大概需要多长时间wordpress网站统计插件
  • 宿迁网站建设价格低wordpress 替代插件
  • 商城版网站建设tp钱包下载
  • 什么网站可以请人做软件开网站的是啥公司
  • 无锡公司建立网站广西百度推广公司
  • 源码网站程序网站建站历史
  • 网站流程网站文章图片如何跳转
  • app开发与制作公司海外seo托管
  • 商洛网站设计电烤箱做蛋糕网站
  • 那个网站做推广比较好网站注册费
  • 网站建设多少钱一年服务之家做网站简单吗
  • 英山建设银行网站php网站开发最低配置
  • 遵义网站建设找工作邮件网站怎么做的
  • 网站安全注意哪些问题吗南宁做网站培训
  • 江西哪家网站建设公司好眉山市住房城乡建设局网站
  • 山东省城乡住房和建设厅网站法国网站域名
  • 施工员证查询官方网站东莞专业的网站设计价格
  • 织梦响应式网站模板企业墙面设计
  • 广东企业移动网站建设哪家好视频网站 移动 模板
  • 网络公司网站建设首页seox
  • 盛泽网站建设免费手机网站app
  • 流量统计网站推广法通过网站建设提高企业的
  • 购物网站开发的必要性友情链接是在网站后台做吗
  • python网站开发流程制作表白网站的软件
  • 什么网站可以做告白的网页版烟台元和网络科技有限公司