- 浏览: 39537 次
- 性别:
- 来自: 西安
最新评论
-
ybjz:
OnlineUserService 这个service 是做 ...
Spring Security统计在线用户 -
sslining:
你好,我想请问一下,基于spring security 3.1 ...
Spring Security统计在线用户 -
ZMC330:
...
Struts2注解Action方法安全 -
newzhq:
放大法放大放大
关于Ajax的重复提交 -
newzhq:
发放大发达
关于Ajax的重复提交
应用场景如下,一个实体,需要对应N个表,这N个表的结构一致,但是后缀不同。用户登录后,取得用户的组,组名即为那张表的后缀。Hibernate做这个不容易,所以考虑采用JDBC来完成。
自己胡乱写了一个增强的JdbcDaoTemplate类,可以实现一些简单的查询,不必写sql语句。
也是靠我自己的想法来写的,有什么不妥之处,欢迎拍砖。
/** * 提供一些简单的方法供子类使用 * 其中RowMapper接口有3个现成的实现类,分别是: * 1、BeanPropertyRowMapper,提供将查询结果转换为对象,数据库列名应带下划线命名,会自动转换为骆驼命名规则的字段名 * 2、ColumnMapRowMapper,返回一个List对象,对象中的每一个元素都是一个Map对象,Map实际上是org.apache.commons.collections.map.ListOrderedMap * 3、SingleColumnRowMapper,返回一个List对象,对象中的每个元素是数据库中的某列的值,SingleColumnRowMapper的构造方法可以传入需要的数据类型 * 上述3个实现不能满足要求时,可自行实现RowMapper接口 * @author Sunshine * */ @SuppressWarnings("unchecked") public class BasicJdbcDaoSupport<T, PK extends Serializable> extends JdbcDaoSupport { protected Class<T> entityClass; public BasicJdbcDaoSupport() { this.entityClass = ReflectionUtils.getSuperClassGenricType(getClass()); } @Resource(name = "secondaryDataSource") public void setSuperDataSource(DataSource dataSource) { super.setDataSource(dataSource); } public <X> X get(final PK id, final RowMapper rowMapper) { String sql = "select * from " + getTableName(entityClass) + " where id = ?"; List results = getJdbcTemplate().query(sql, new Object[] { id }, rowMapper); return (X) DataAccessUtils.singleResult(results); } public <X> List<X> getAll(final RowMapper rowMapper) { String sql = "select * from " + getTableName(entityClass); return getJdbcTemplate().query(sql, rowMapper); } public <X> List<X> getAll(final String orderBy, final boolean isAsc, final RowMapper rowMapper) { String direction = (isAsc == true) ? "asc" : "desc"; String sql = "select * from " + getTableName(entityClass) + " order by " + orderBy + " " + direction; return getJdbcTemplate().query(sql, rowMapper); } public <X> List<X> find(final String[] properties, final Object[] values, final RowMapper rowMapper) { Assert.notNull(properties, "properties cannot be null"); Assert.notNull(values, "values cannot be null"); if (properties.length == 0 || values.length == 0 || properties.length != values.length) { throw new IllegalArgumentException("invalid properties or values"); } String sql = "select * from " + getTableName(entityClass) + " where "; String[] columns = new String[properties.length]; for (int i = 0; i < properties.length; i++) { columns[i] = underscoreName(properties[i]) + " = ?"; // 将属性转换为数据库对应列名 } sql += StringUtils.join(columns, " and "); return getJdbcTemplate().query(sql, values, rowMapper); } public <X> List<X> find(final String property, final Object value, final RowMapper rowMapper) { return find(new String[] { property }, new Object[] { value }, rowMapper); } public <X> List<X> find(final Map<String, Object> map, final RowMapper rowMapper) { List<String> properties = new ArrayList<String>(); List<Object> values = new ArrayList<Object>(); for (Map.Entry<String, Object> entry : map.entrySet()) { properties.add(entry.getKey()); values.add(entry.getValue()); } return find(properties.toArray(new String[properties.size()]), values.toArray(new Object[values.size()]), rowMapper); } public <X> List<X> find(final String sql, final RowMapper rowMapper) { return getJdbcTemplate().query(sql, rowMapper); } public <X> List<X> find(final String sql, final Object[] values, final RowMapper rowMapper) { return getJdbcTemplate().query(sql, values, rowMapper); } public <X> List<X> find(final String property, final List<?> list, final RowMapper rowMapper) { if (list.size() > 0) { List<String> placeholders = new ArrayList<String>(); for (int i = 0; i < list.size(); i++) { placeholders.add("?"); } String sql = "select * from " + getTableName(entityClass) + " where " + underscoreName(property) + " in "; sql += "(" + placeholders.toArray(new String[placeholders.size()]) + ")"; return getJdbcTemplate().query(sql, list.toArray(new Object[list.size()]), rowMapper); } else { return null; } } public <X> X findUnique(final String[] properties, final Object[] values, final RowMapper rowMapper) { return (X) DataAccessUtils.uniqueResult(find(properties, values, rowMapper)); } public <X> X findUnique(final String property, final Object value, final RowMapper rowMapper) { return (X) DataAccessUtils.uniqueResult(find(property, value, rowMapper)); } public <X> X findUnique(final Map<String, Object> map, final RowMapper rowMapper) { return (X) DataAccessUtils.uniqueResult(find(map, rowMapper)); } public <X> X findUnique(final String sql, final RowMapper rowMapper) { return (X) DataAccessUtils.uniqueResult(find(sql, rowMapper)); } public <X> X findUnique(final String sql, final Object[] values, final RowMapper rowMapper) { return (X) DataAccessUtils.uniqueResult(find(sql, values, rowMapper)); } public T get(final PK id) { return get(id, new BeanPropertyRowMapper(entityClass)); } public List<T> getAll() { return getAll(new BeanPropertyRowMapper(entityClass)); } public List<T> getAll(final String orderBy, final boolean isAsc) { return getAll(orderBy, isAsc, new BeanPropertyRowMapper(entityClass)); } public List<T> find(final String[] properties, final Object[] values) { return find(properties, values, new BeanPropertyRowMapper(entityClass)); } public List<T> find(final String property, final Object value) { return find(property, value, new BeanPropertyRowMapper(entityClass)); } public List<T> find(final Map<String, Object> map) { return find(map, new BeanPropertyRowMapper(entityClass)); } public List<T> find(final String sql) { return find(sql, new BeanPropertyRowMapper(entityClass)); } public List<T> find(final String sql, final Object[] values) { return find(sql, values, new BeanPropertyRowMapper(entityClass)); } public List<T> find(final String sql, final List<?> list) { return find(sql, list, new BeanPropertyRowMapper(entityClass)); } public T findUnique(final String[] properties, final Object[] values) { return findUnique(properties, values, new BeanPropertyRowMapper(entityClass)); } public T findUnique(final String property, final Object value) { return findUnique(property, value, new BeanPropertyRowMapper(entityClass)); } public T findUnique(final Map<String, Object> map) { return findUnique(map, new BeanPropertyRowMapper(entityClass)); } public T findUnique(final String sql) { return findUnique(sql, new BeanPropertyRowMapper(entityClass)); } public T findUnique(final String sql, final Object[] values) { return findUnique(sql, values, new BeanPropertyRowMapper(entityClass)); } public int count() { String sql = "select count(*) from " + getTableName(entityClass); return (Integer) DataAccessUtils.uniqueResult(getJdbcTemplate().query(sql, new SingleColumnRowMapper(Integer.class))); } public int count(final String[] properties, final Object[] values) { Assert.notNull(properties, "properties cannot be null"); Assert.notNull(values, "values cannot be null"); if (properties.length == 0 || values.length == 0 || properties.length != values.length) { throw new IllegalArgumentException("invalid properties or values"); } String sql = "select count(*) from " + getTableName(entityClass) + " where "; String[] columns = new String[properties.length]; for (int i = 0; i < properties.length; i++) { columns[i] = underscoreName(properties[i]) + " = ?"; // 将属性转换为数据库对应列名 } sql += StringUtils.join(columns, " and "); return (Integer) DataAccessUtils.uniqueResult(getJdbcTemplate().query(sql, values, new SingleColumnRowMapper(Integer.class))); } public int count(final String property, final Object value) { return count(new String[] { property }, new Object[] { value }); } public int count(final Map<String, Object> map) { List<String> properties = new ArrayList<String>(); List<Object> values = new ArrayList<Object>(); for (Map.Entry<String, Object> entry : map.entrySet()) { properties.add(entry.getKey()); values.add(entry.getValue()); } return count(properties.toArray(new String[properties.size()]), values.toArray(new Object[values.size()])); } public int count(final String sql, final Object[] values) { return findUnique(sql, values, new SingleColumnRowMapper(Integer.class)); } public int deleteBy(final String[] properties, final Object[] values) { Assert.notNull(properties, "properties cannot be null"); Assert.notNull(values, "values cannot be null"); if (properties.length == 0 || values.length == 0 || properties.length != values.length) { throw new IllegalArgumentException("invalid properties or values"); } String sql = "delete from " + getTableName(entityClass) + " where "; String[] columns = new String[properties.length]; for (int i = 0; i < properties.length; i++) { columns[i] = underscoreName(properties[i]) + " = ?"; // 将属性转换为数据库对应列名 } sql += StringUtils.join(columns, " and "); return getJdbcTemplate().update(sql, values); } public int deleteBy(final String property, final Object value) { return deleteBy(new String[] { property }, new Object[] { value }); } public int deleteBy(Map<String, Object> map) { List<String> properties = new ArrayList<String>(); List<Object> values = new ArrayList<Object>(); for (Map.Entry<String, Object> entry : map.entrySet()) { properties.add(entry.getKey()); values.add(entry.getValue()); } return deleteBy(properties.toArray(new String[properties.size()]), values.toArray(new Object[values.size()])); } /** * 按照ID删除对象 */ public int deleteBy(final PK id) { String sql = "delete from " + getTableName(entityClass) + " where id = ?"; return getJdbcTemplate().update(sql, new Object[] { id }); } /** * 保存对象 */ public int save(final T entity) { try { BeanInfo beanInfo = Introspector.getBeanInfo(entityClass, Object.class); PropertyDescriptor[] descriptors = beanInfo.getPropertyDescriptors(); List<String> columns = new ArrayList<String>(); List<Object> values = new ArrayList<Object>(); List<String> placeholders = new ArrayList<String>(); for (PropertyDescriptor descriptor : descriptors) { Object value = descriptor.getReadMethod().invoke(entity); if (value != null) { columns.add(underscoreName(descriptor.getName())); values.add(value); placeholders.add("?"); } } StringBuilder builder = new StringBuilder(); builder.append("insert into ").append(getTableName(entityClass)); builder.append(" (").append(StringUtils.join(columns, ",")).append(") "); builder.append(" values (").append(StringUtils.join(placeholders, ",")).append(")"); return getJdbcTemplate().update(builder.toString(), values.toArray(new Object[values.size()])); } catch (Exception e) { throw new RuntimeException(e.getMessage(), e); } } /** * 更新对象 * 对象必须有且只有一个主键。在更新之前,必须先将对象查询出来 */ public int update(final T entity) { try { String idName = getIdName(entityClass); Assert.notNull(idName); BeanInfo beanInfo = Introspector.getBeanInfo(entityClass, Object.class); PropertyDescriptor[] descriptors = beanInfo.getPropertyDescriptors(); List<String> columns = new ArrayList<String>(); List<Object> values = new ArrayList<Object>(); Object idValue = null; for (PropertyDescriptor descriptor : descriptors) { String columnName = underscoreName(descriptor.getName()); if (idName.equals(columnName)) { idValue = descriptor.getReadMethod().invoke(entity); if (idValue == null) { throw new IllegalArgumentException("no primary key is set"); } } else { columns.add(columnName + " = ?"); values.add(descriptor.getReadMethod().invoke(entity)); } } values.add(idValue); StringBuilder builder = new StringBuilder(); builder.append("update ").append(getTableName(entityClass)); builder.append(" set "); builder.append(StringUtils.join(columns, ",")); builder.append(" where ").append(idName).append(" = ?"); return getJdbcTemplate().update(builder.toString(), values.toArray(new Object[values.size()])); } catch (Exception e) { throw new RuntimeException(e.getMessage(), e); } } /** * 取得实体对应的表名 * 对于有特殊需求者,可在子类中覆盖此方法 */ protected String getTableName(Class<?> entityClass) { Table table = entityClass.getAnnotation(Table.class); return StringUtils.isNotBlank(table.catalog()) ? table.catalog() + "." + table.name() : table.name(); } /** * 取得实体对应表的主键名 */ protected String getIdName(Class<?> entityClass) { String idName = null; Field[] fields = entityClass.getDeclaredFields(); for (Field field : fields) { Id id = field.getAnnotation(Id.class); if (id != null) { idName = id.name(); break; } } return idName; } /** * 将属性名转换为数据库的列名 * 其中,将大写字母转换为下划线加大写字母 * @param name * @return */ private String underscoreName(String name) { StringBuilder result = new StringBuilder(); if (name != null && name.length() > 0) { result.append(name.substring(0, 1).toLowerCase()); for (int i = 1; i < name.length(); i++) { String s = name.substring(i, i + 1); if (s.equals(s.toUpperCase())) { result.append("_"); result.append(s.toLowerCase()); } else { result.append(s); } } } return result.toString(); } }
另附两个注解类:
@Target(FIELD) @Retention(RUNTIME) public @interface Id { String name(); } @Target(TYPE) @Retention(RUNTIME) public @interface Table { String name(); String catalog() default ""; }
发表评论
-
使用Hibernate、Spring和MySQL时,谨慎选择MySQL的表类型
2010-06-20 21:55 1265Hibernate采用的是write-behind的策略。My ... -
关于Ajax的重复提交
2010-06-20 16:20 4814在页面的POST提交请求时 ... -
万恶的sync-binlog=1
2010-06-05 09:53 2989查看MySQL手册,说将sync-binlog设置为1,可以提 ... -
Struts2注解Action方法安全
2010-05-17 03:19 3273用过Spring Security的朋友一定不会陌生,有个@S ... -
Spring Security统计在线用户
2010-03-09 14:46 6543在web.xml中将原先的那个监听器替换为自己写的这个就可以了 ... -
发一个Hibernate工具类
2010-03-01 19:10 2533为了简化分页查询的条件参数,写了一个工具类。 前提是,页面的 ... -
Apache2.2.11+Tomcat6.0.20集群配置
2009-07-26 21:42 4236这几天一直在看Apache和Tomcat的集群配置。配置了很久 ...
相关推荐
标题中的“新手学j2me,大牛来看看写得如何,欢迎拍砖啊”表明了这是一个关于学习Java ME(J2ME)技术的讨论,作者可能是初学者,希望得到资深开发者的意见和反馈。J2ME是Java的一个版本,主要用于开发移动设备、...
在"优雅的工作方式(一)——欢迎拍砖"这篇博文中,作者可能分享了自己在实际工作中如何运用源码理解和工具提升效率的心得体会,可能包括一些实战案例和经验分享。遗憾的是,由于没有具体的博客内容,无法提供更详细...
5. **自定义配置**:一个好的插件应该提供丰富的配置选项,允许开发者根据需要调整滚动速度、延迟时间、加载方式等。 遗憾的是,没有直接提供源码,我们无法直接分析其具体实现。但可以尝试访问提供的博文链接...
而"工具"标签则提示我们,这是一个易于使用的应用程序,无需深入理解数据库备份的底层机制,用户只需配置好参数即可使用。 至于压缩包中的“MySQL_backup”,这很可能是备份工具的主程序或者配置文件。在使用前,...
标题中的“JMail 示例(无附件发送) 欢迎大家拍砖”表明这是一个关于使用JMail库在Java中发送邮件的示例代码,没有涉及附件功能。博主可能分享了一个简单的程序,期望社区成员提供反馈和改进意见。 JMail是一个...
New Document body{font:12px Arial;} a:link,a:visited,a:active{color:#000;text-decoration:none;... 一个通用的日历程序,IE6、Mozilal系列测试通过.欢迎使用 [Ctrl+A 全选 注:如需引入外部Js需刷新才能执行]
在这个案例中,“Fate 风铃留言本”是一个简单的ASP应用程序,用于收集用户的反馈信息。 【留言本功能】 一个基本的留言本系统通常包括以下组件: 1. **用户界面**:用户通过浏览器看到的页面,用于输入留言和查看...
”按钮,如果一切正常,那么可以看到游戏效果--经典的拍砖游戏!所有代码注释非常详细,一行注释一行代码,是学习Windows编程的启步示例。 阅读对象:希望进行Windows游戏开发的人员,具备Java游戏开发基础和经验;...
同时,对于已经有一定经验的开发者,这个项目提供了一个检验和提升自己技能的机会,特别是在整合多种框架以构建复杂应用方面。 希望这个CRM系统能为用户提供高效、易用的客户管理功能,如客户信息管理、销售机会...
- 在一个1公里长的电缆上建立一个1Gbps速率的CSMA/CD网络,信号在电缆中的传播速度为200000km/s,计算得到最短帧长度为2560b/s。 - 对于从源主机向目的主机发送一个30Mbits的MP3文件的问题: - 如果源主机和目的...
我自己写的code create 不知道好不好啊, 放到这里只是做一个参考啊, 大家不要拍砖
标题中的“自己写的‘连接google在线翻译的小工具’”指的是一个使用C#编程语言开发的应用程序,该程序设计用于与Google在线翻译服务进行交互。这个小工具允许用户方便地利用Google翻译API进行文本的翻译工作,可能...
修复之前的一个isReg()的错误,之前的博客就写过一篇文章《写了一个Follow5 API的PHP类》说自己已经写了一个Follow5的PHP类,今天我主要是要发布我写的这个Follow5 的API PHP类,高手拍砖,基本的功能跟代码说明在...
NULL 博文链接:https://jayyh.iteye.com/blog/703930
C#编写的计算器(高手拍砖)C#编写的计算器(高手拍砖)C#编写的计算器(高手拍砖)C#编写的计算器(高手拍砖)
本笔记将探讨如何利用Java来管理网络接口,并提供一个基础的了解,以帮助开发者构建相关工具或应用程序。首先,我们需要理解Linux系统中网络接口的基本概念,包括ifconfig、iwconfig以及网络接口配置文件等内容。 ...
总的来说,处理bug是一个系统的工程,需要耐心、细心和专业的技能。开发者应当以解决问题的态度去面对bug,而不是抱怨或焦虑,正如"解决bug不要拍砖啊"所提倡的那样,保持冷静,用技术和智慧去战胜困难。
不想看文章得可以直接去Github,欢迎拍砖 大致结构如下: testyaml管理用例,实现数据与代码分离,一个模块一个文件夹 public 存放公共文件,如读取配置文件、启动appium服务、读取Yaml文件、定义日志格式等 page ...
PDF分割合并工具(用过最好的PDF分割器,不好用拍砖!)PDF分割合并工具(用过最好的PDF分割器,不好用拍砖!)PDF分割合并工具(用过最好的PDF分割器,不好用拍砖!) 郑重声明:此软件不能合并PDF,合并工具请下载...
作者本人闲来无事,正好朋友需要做抽奖转盘特效,因缘际会之下,打算自己动手写一个插件玩玩,素材都是用的网络上面的,看见相同的图片大家别介意。 该插件支持自定义九宫格转盘的高宽奖品数量,Demo里面自带三个...