- 浏览: 281515 次
- 性别:
- 来自: 哈尔滨
文章分类
最新评论
-
netfengxia:
这个是Mybatis哦. 是一个ORM框架, 这里展示的是My ...
mybatis merge 语句使用 -
MILLETS:
好像没有效果
jsp页面打印、预览、设置实现方案 -
evic520:
mysql有merge into的用法?是不是标题错了 楼主? ...
mybatis merge 语句使用 -
winner_king:
解决问题
pager-taglib分页中文乱码问题 -
Renee涟漪:
...
SVN搭建
用hibernate用得多了,忽然怀念起自己直接写sql 的轻巧类库了。
开源的类库中,需要写sql常用的有spring jdbc ,apache的dbutil , MyBatis。看过MyBatis文档,写过demo, 相对于hibernate这个强大的ORM工具,MyBatis可控性更好,然而今天它不主角,今天的主角是spring jdbc.
spring jdbc 当我一接触到的时候,从此深深爱上了这个小巧的家伙:简单而优雅的API,配上spring本身的声名式事务!这就是一把小巧的神器!
然而随着我深入的了解,让我不爽的是SQL语句写在JAVA代码中,想要动态SQL自己拼字符串吧!
但是这又有什么的?我把SQL语句放在外部文件,然后把它读出来就行了。
有这想法第一步想到的是:
利用Spring注入功能,把SQL注入到bean中去,但是想想又不合适,不喜欢用xml方式配置spring bean ,如果每个 bean都注入几条SQL,不是所有要用SQL的bean都要写在xml文件吗?
这个办法不是一个优雅的解决办法,那创建一个类,利用spring注入功能,将相关的值注入到map属性中,尝试了一下,所有的sql都丢到一个文件多不优雅!还是自己动手来读吧,dom4j读xml很简单,上代码:
public class SQLBuilder { private static Logger logger = LoggerFactory.getLogger(SQLBuilder.class); private Map<String, String> sqlContainer = null; private String sqlFilePath = "systemSql.xml"; public SQLBuilder() { initSqlContainer(); } public SQLBuilder(String sqlFilePath) { this.sqlFilePath = sqlFilePath; initSqlContainer(); } public String getSql(String key) { String sql = sqlContainer.get(key); if (sql == null || "".equals(sql)) logger.warn("不存在该SQL语句"); if (logger.isDebugEnabled()) { logger.debug("SQL:" + sql); } return sql; } public String getDynamicalSql(String key, Map<String, ?> param) { String sql = sqlContainer.get(key); return VelocityUtils.render(sql, param); } @SuppressWarnings("unchecked") private void initSqlContainer() { sqlContainer = new ConcurrentHashMap<String, String>(); if (sqlFilePath == null || "".equals(sqlFilePath)) { throw new NullPointerException("sql语句文件不能为空!"); } String[] files = sqlFilePath.split(";"); for (String file : files) { readSQLFromFile(file); } } private void readSQLFromFile(String fileName) { InputStream ips = Thread.currentThread().getContextClassLoader() .getResourceAsStream(fileName); Document document = null; SAXReader saxReader = new SAXReader(); try { document = saxReader.read(ips); } catch (DocumentException e) { logger.error("读取系统中用到的SQL 语句XML出错"); throw new RuntimeException("读取sql语句XML文件出错:" + e.getMessage()); } Element root = document.getRootElement(); List<Element> sqlElements = root.selectNodes("//sqlElement"); String key; for (Element sql : sqlElements) { key=sql.attribute("key").getValue(); if(sqlContainer.containsKey(key)){ logger.warn("key值:"+key+"重复"); } sqlContainer.put(key, sql.getText()); } if (ips != null) { try { ips.close(); } catch (IOException e) { logger.error("关闭输入流出错:" + e.getMessage()); } } } public void setSqlFilePath(String sqlFilePath) { this.sqlFilePath = sqlFilePath; } @Override protected void finalize() throws Throwable { super.finalize(); if (sqlContainer != null) { sqlContainer.clear(); sqlContainer = null; } } }
模板技术用过freemarker ,velocity 我喜欢velocity多点,直接拿springside 里面工具类生成动态SQL
/** * 使用Velocity生成内容的工具类. * * @author calvin */ public class VelocityUtils { static { try { Velocity.init(); } catch (Exception e) { throw new RuntimeException("Exception occurs while initialize the velociy.", e); } } /** * 渲染内容. * * @param template 模板内容. * @param model 变量Map. */ public static String render(String template, Map<String, ?> model) { try { VelocityContext velocityContext = new VelocityContext(model); StringWriter result = new StringWriter(); Velocity.evaluate(velocityContext, result, "", template); return result.toString(); } catch (Exception e) { throw new RuntimeException("Parse template failed.", e); } } }
<?xml version="1.0" encoding="UTF-8"?> <sqls> <sqlElement key="queryUser"> <![CDATA[ select * from t_userInfo ]]> </sqlElement> <sqlElement key="insertUser"> <![CDATA[ insert into t_userInfo(sex,age,userName,address,contactNumber,mobilePhone) values(:sex,:age,:userName,:address,:contactNumber,:mobilePhone) ]]> </sqlElement> <sqlElement key="updateUser"> <![CDATA[ update t_userInfo set userName=:userName where userID=:userID ]]> </sqlElement> <sqlElement key="deleteUser"> <![CDATA[ delete from t_userInfo where userID=:userID ]]> </sqlElement> <sqlElement key="search"> <![CDATA[ select * from t_userinfo #if( $user.userName !="") where userName like :userName #end ]]> </sqlElement> </sqls>
调用:可以自己创建对象,或者将SQLBuilder 放到spring容器中,让spring 管理bean
SQLBuilder是线程安全的建议仅创建一个实例,减少读取SQL语句文件 的IO消耗!
public class JdbcTest { @Resource DataSource dataSource; @Resource SQLBuilder sqlBuilder; private NamedParameterJdbcOperations jdbcTemplate; public JdbcTest() { // jdbcTemplate = getJdbcTemplate(); } public NamedParameterJdbcOperations getJdbcTemplate() { return jdbcTemplate = new NamedParameterJdbcTemplate(dataSource); } @Transactional public void deleteUser(Map<String, Integer> param) { getJdbcTemplate().update(sqlBuilder.getSql("deleteUser"), param); } }
发表评论
-
struts2从2.2.3升级到2.3.15.1步骤
2014-05-19 10:41 10681. 删除以下jar包 asm-3.1.jar asm- ... -
mybatis merge 语句使用
2014-03-26 10:26 17733<update id="saveRechou ... -
多个SSH2 项目部署在Tomcat下,解决Tomcat启动失败问题
2013-04-24 09:30 2174我在tomcat下同时部署多个SSH2项目时,Tomcat启 ... -
WEB容器启动的时候,加载常用数据到内存
2012-04-26 09:00 1240项目中,有很多数据是基本上不变的,同时用到的频率还比较高,如果 ... -
struts2文件下载
2012-04-01 09:19 981public String download(){ ... -
spring JdbcTemplate文件写数据库,读取
2012-03-31 15:09 1708/** * 插入文件表数据 * @param tb ... -
用RowMapper封装查询结果自定义类(转)
2012-03-15 14:00 1581package object; import java. ... -
struts2标签详解与实例
2012-02-23 16:30 843见附件 -
java数据类型验证工具类
2012-02-23 16:29 4783package net.hlj.common.util; ... -
解决struts2get请求乱码问题
2012-02-13 11:02 10131、建立CharFilter.java package cn ... -
防跨域
2012-02-10 14:34 10071、建立CrossDomainFilter.java pac ... -
struts2中struts.xml非默认路径的配置
2012-01-31 14:33 10351) my-struts.xml置于WEB-INF/cla ... -
泛域名解析
2012-01-30 11:15 1173web.xml配置 <!-- webSite d ... -
(转)log4j详解与实战
2011-07-26 08:57 863log4j是一个非常强大的log记录软件,下面我们就来看看在项 ... -
模拟spring功能
2011-06-22 17:14 10101、建立User.java,内容如下: package ne ... -
struts2.1.1实例-helloworld
2011-06-15 17:15 1899Struts2 1.1 Struts ... -
spring配置文件获取方式
2010-12-24 11:33 11051、在src下(class): Applicatio ... -
配置Spring+hibernate使用ehcache作为second-level cache
2010-12-02 16:39 1010大量数据流动是web应用性能问题常见的原因,而缓存被广泛的 ...
相关推荐
day4-Spring JdbcTemplate & 声明式事务.md
spring-jdbcTemplate实例工程
strut2+spring+springjdbctemplate做的简易登录系统
NULL 博文链接:https://yunzhongxia.iteye.com/blog/611591
一个非常简单基于注解的Spring JdbcTemplate,供初学者参考用。
本篇文章主要介绍了Spring 中jdbcTemplate 实现执行多条sql语句示例,可以对多个表执行多个sql语句,有兴趣的可以了解一下。
Spring JDBCTemplate连接池jar包
使用Spring的JdbcTemplate实现分页功能
Spring-JdbcTemplate
Druid数据库连接池的SpringJDBCTemplate所需的jar包,Druid数据库连接池的SpringJDBCTemplate所需的jar包,Druid数据库连接池的SpringJDBCTemplate所需的jar包,Druid数据库连接池的SpringJDBCTemplate所需的jar包,...
Spring JdbcTemplate的操作,包括接口,BaseDao,log4J配置文件,主要为oracle数据库操作,很多特殊方法只对oracle有效
模仿spring jdbcTemplate的粗略实现,只有很小的参考价值,如果是java初学者可以使用这个封装好的工具进行数据库操作,只需要在db.properties里配置好driver,url等信息
Spring JdbcTemplate调用Oracle存储过程输出游标结果集实现增删改查
import org.springframework.jdbc.core.JdbcTemplate; import org.springframework.jdbc.support.rowset.ResultSetWrappingSqlRowSet; import org.springframework.jdbc.support.rowset.SqlRowSet; import org....
JdbcTemplate api 下载 Spring
SSH笔记-Spring JdbcTemplate,使用JdbcTemplate对数据库进行操作,使用具名参数和JDBC模板,简化操作
struts+spring +jdbctemplate demo http://knight-black-bob.iteye.com/blog/2262258
SpringJdbcTemplate封装工具包,包括规范model格式接口,封装SpringJdbcTemplate,实现分页,自适应多种数据库
1.Spring4前 spring-jdbc包是独立的,4以后spring-jdbc 就已经没有了
当hql等查询方式不能满足性能或灵活性的要求,必须使用SQL时,大家有三... JDBCTemplate的使用很简单,只要在ApplicationContext文件里定义一个jdbcTemplate节点,POJO获得注入后可以直接执行操作,不需要继承什么基类