`
jueyue
  • 浏览: 195535 次
社区版块
存档分类
最新评论

关于jdbc和代码分离自己的小方法

阅读更多
今天突然要写一个小的系统,因为什么都是新的,说要框架也要重新搭(bs下公司没有基础框架),ibatis自己没有怎么搭过,所以这次直接选择spring jdbc,但是要是喜欢ibatis的代码sql分离,所以自己百度了下发现spring 的jdbc代码分离有人写了,但是需要配置各个xml
,相信spring都是配置加自动的,所以自己,写了一部分,自动扫描map.xml然后加载,现在都是约定大于配置,这样我们约定放置sql的文件名和方式就可以了
下面是代码:
这个是主要的类,单例的
  1. package com.jueyue.util;
  2. import java.io.File;
  3. import java.io.FileInputStream;
  4. import java.io.FileNotFoundException;
  5. import java.io.IOException;
  6. import java.io.InputStream;
  7. import java.util.List;
  8. import java.util.Map;
  9. import java.util.concurrent.ConcurrentHashMap;
  10. import org.dom4j.Document;
  11. import org.dom4j.DocumentException;
  12. import org.dom4j.Element;
  13. import org.dom4j.io.SAXReader;
  14. import com.opensymphony.xwork2.util.logging.Logger;
  15. import com.opensymphony.xwork2.util.logging.LoggerFactory;
  16. /**
  17. * sql map的基础类
  18. * @author jueyue
  19. *
  20. */
  21. public class SQLMap {
  22.         
  23.         private static Logger logger = LoggerFactory.getLogger(SQLMap.class);
  24.         private Map<String, String> sqlContainer = null;
  25.         private String sqlFilePath = "/com/jueyue/service/impl";
  26.         
  27.         private static SQLMap instance;
  28.         
  29.         public static SQLMap getInstance(){
  30.                 if(instance == null){
  31.                         instance = new SQLMap();
  32.                 }
  33.                 return instance;
  34.         }
  35.         public SQLMap() {
  36.                 
  37.                 initSqlContainer();
  38.         }
  39.         public SQLMap(String sqlFilePath) {
  40.                 this.sqlFilePath = sqlFilePath;
  41.                 initSqlContainer();
  42.         }
  43.         public String getSql(String key) {
  44.                 String sql = sqlContainer.get(key);
  45.                 if (sql == null || "".equals(sql))
  46.                         logger.warn("不存在该SQL语句");
  47.                 if (logger.isDebugEnabled()) {
  48.                         logger.debug("SQL:" + sql);
  49.                 }
  50.                 return sql;
  51.         }
  52.         private void initSqlContainer() {
  53.                 sqlContainer = new ConcurrentHashMap<String, String>();
  54.                 if (sqlFilePath == null || "".equals(sqlFilePath)) {
  55.             throw new NullPointerException("sql语句文件不能为空!");
  56.                 }
  57.                 List<String> files = new ScanMapFile().getsqlMaps(sqlFilePath);
  58.                 for (String file : files) {
  59.                         readSQLFromFile(file);
  60.                 }
  61.         }
  62.         private void readSQLFromFile(String fileName) {
  63.                 InputStream ips = null;
  64.                 try {
  65.                         ips = new FileInputStream(new File(fileName));
  66.                 } catch (FileNotFoundException e) {
  67.                         e.printStackTrace();
  68.                 }
  69.                 Document document = null;
  70.                 SAXReader saxReader = new SAXReader();
  71.                 try {
  72.                         document = saxReader.read(ips);
  73.                 } catch (DocumentException e) {
  74.                         logger.error("读取系统中用到的SQL 语句XML出错");
  75.                         throw new RuntimeException("读取sql语句XML文件出错:" + e.getMessage());
  76.                 }
  77.                 Element root = document.getRootElement();
  78.                 @SuppressWarnings("unchecked")
  79.                 List<Element> sqlElements = (List<Element>)root.selectNodes("//sqlElement");
  80.                 String key;
  81.                 for (Element sql : sqlElements) {
  82.                         key=sql.attribute("key").getValue();
  83.                         if(sqlContainer.containsKey(key)){
  84.                                 logger.warn("key值:"+key+"重复");
  85.                         }
  86.                         sqlContainer.put(key, getSqlText(sql.getText()));
  87.                 }
  88.                 if (ips != null) {
  89.                         try {
  90.                                 ips.close();
  91.                         } catch (IOException e) {
  92.                                 logger.error("关闭输入流出错:" + e.getMessage());
  93.                         }
  94.                 }
  95.         }
  96.         /**
  97.          * 出去无效字段
  98.          */
  99.         private String getSqlText(String text) {
  100.                 return text.replaceAll("\\n", " ").replaceAll("\\t", " ");
  101.         }
  102.         public void setSqlFilePath(String sqlFilePath) {
  103.                 this.sqlFilePath = sqlFilePath;
  104.         }
  105.         @Override
  106.         protected void finalize() throws Throwable {
  107.                 super.finalize();
  108.                 if (sqlContainer != null) {
  109.                         sqlContainer.clear();
  110.                         sqlContainer = null;
  111.                 }
  112.         }
  113. }
复制代码
下面这个是扫描类
  1. package com.copote.util;
  2. import java.io.File;
  3. import java.util.ArrayList;
  4. import java.util.List;
  5. /**
  6. * 扫描service下面的所有map.xml
  7. * @author jueyue 2013年8月5日
  8. */
  9. public class ScanMapFile {
  10.         
  11.         private List<String> sqls;
  12.         
  13.         public ScanMapFile(){
  14.                 sqls =  new ArrayList<String>();
  15.         }
  16.         
  17.         public  List<String> getsqlMaps(String path){
  18.                 GetSql(ScanMapFile.class.getResource(path).getPath());
  19.                 return sqls;
  20.         }
  21.         /*
  22.          * 递归调用查找指定文件加下所有文件
  23.          */
  24.         private void GetSql(String path) {
  25.                 File rootDir = new File(path);
  26.                 if (!rootDir.isDirectory()) {
  27.                         if(rootDir.getName().equalsIgnoreCase("map.xml")){
  28.                                 sqls.add(rootDir.getAbsolutePath());
  29.                         }
  30.                 } else {
  31.                         String[] fileList = rootDir.list();
  32.                         for (int i = 0; i < fileList.length; i++) {
  33.                                 path = rootDir.getAbsolutePath() + "\\" + fileList[i];
  34.                                 GetSql(path);
  35.                         }
  36.                 }
  37.         }
  38. }
复制代码
我们扫描的是所有的map.xml这样就加载了所有的sql
  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <sqls>
  3.         <sqlElement key="account.login">
  4.                 <![CDATA[
  5.                         select *  from user
  6.         </sqlElement>
  7. </sqls>
复制代码
然后在我们的dao里面这样写
  1. @Override
  2.         public AccountEntity login(AccountEntity account) {
  3.                 String sql = SQLMap.getInstance().getSql("account.login");//加载sql
  4.                 List<AccountEntity> temp = jdbcTemplate.query(sql,
  5.                                 new Object[] { account.getVAcctCode(), account.getVAcctPwd(),
  6.                                 account.getCorgId() }, new AccountRowMapper());
  7.                 return temp.size() == 1?temp.get(0):null;
  8.         }
复制代码
这样我们就获取了对于的sql,就分离了,而且自动扫描
最后记得在web.xml添加启动监听,进行初始化


jeecg 首发
0
0
分享到:
评论
3 楼 freezingsky 2013-08-13  
jueyue 写道
freezingsky 写道
我的做法与此类似,不过,用的是spring3所支持util。

那个util?

<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:p="http://www.springframework.org/schema/p"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:mvc="http://www.springframework.org/schema/mvc"
xmlns:util="http://www.springframework.org/schema/util"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-3.0.xsd
       http://www.springframework.org/schema/util
        http://www.springframework.org/schema/util/spring-util-3.0.xsd

        http://www.springframework.org/schema/mvc
        http://www.springframework.org/schema/mvc/spring-mvc-3.0.xsd">
<!--将SQL的相关内容放到Map中,并关联到DAO中。方便修改SQL,而不用修改类文件 -->
<util:map 	id="userOps" map-class="java.util.HashMap"
	 			key-type="java.lang.String"	value-type="java.lang.String"	>
2 楼 jueyue 2013-08-13  
freezingsky 写道
我的做法与此类似,不过,用的是spring3所支持util。

那个util?
1 楼 freezingsky 2013-08-05  
我的做法与此类似,不过,用的是spring3所支持util。

相关推荐

    springboot整合sharding-jdbc完整代码

    这个完整的代码示例覆盖了Sharding-JDBC的主要技术点,使开发者可以快速理解和应用到实际项目中。 **一、Sharding-JDBC介绍** Sharding-JDBC是一款轻量级的Java框架,它以客户端直连数据库的方式,提供透明化的...

    sharding jdbc 基于java代码的配置.zip

    本压缩包“sharding jdbc 基于java代码的配置.zip”显然提供了使用Java代码配置Sharding-JDBC的方法,下面我们将详细探讨如何进行配置以及Sharding-JDBC的核心功能和工作原理。 首先,Sharding-JDBC的工作原理是...

    shardingJdbc功能代码

    ShardingJDBC可以在不改变业务代码的情况下,通过配置实现数据库的水平分片,从而提高系统的读写性能。下面我们将深入探讨ShardingJDBC的功能和实现原理。 **1. 数据库分片** ShardingJDBC的核心功能就是数据库分片...

    使用sharding-jdbc快速实现自动读写分离-demo源码

    通过这个demo,开发者可以快速了解和实践Sharding-JDBC的读写分离功能,为自己的项目带来更高的性能和扩展性。同时,这也是学习分布式数据库解决方案的一个良好起点,有助于提升对数据库管理和架构设计的理解。

    Sharding-JDBC实现读写分离demo

    3. **编写Java代码**:在Java代码中,你可以使用`ShardingDataSourceFactory.createDataSource()`方法创建ShardingDataSource对象,该对象是Spring JDBC的`DataSource`接口实现,可以直接注入到Spring Bean中。...

    JSP和JDBC分页代码

    **JDBC(Java Database Connectivity)**:是Java语言中用来规范客户端程序如何来访问数据库的应用程序接口,提供了诸如查询和更新数据库中数据的方法。 **分页**:是在大量数据展示时,将数据分成若干个页面进行...

    java封装jdbc的操作代码

    封装JDBC操作代码是为了提高代码的复用性,减少重复工作,并且能够更好地管理和控制数据库连接,避免资源泄露。下面我们将详细探讨这个主题。 1. **JDBC基础概念** JDBC是Java API的一部分,它提供了连接数据库、...

    jdbc 源代码 jsp+mysql

    MVC模式是一种软件设计模式,它将业务逻辑(Model)、用户界面(View)和控制流程(Controller)分离,使得代码结构清晰,易于维护和扩展。 在实际项目中,JDBC是Java语言访问数据库的标准API,它允许Java开发者...

    Sharding-JDBC教程:Spring Boot整合Sharding-JDBC实现读写分离.docx

    ### Sharding-JDBC 教程:Spring Boot 整合 Sharding-JDBC 实现读写分离 #### 一、Sharding-JDBC 和 Spring Boot 的简介 **Sharding-JDBC** 是阿里巴巴开源的一个轻量级 Java 框架,主要用于对数据库进行分片、...

    自己写个JDBC封装

    **标题:“自己写个JDBC封装”** 在Java开发中,JDBC(Java Database Connectivity)是连接Java应用程序和关系数据库的标准接口。然而,原始的JDBC API使用起来相对繁琐,需要编写大量的重复代码,例如建立数据库...

    Spring Data JDBC与JDBC的区别

    总结起来,Spring Data JDBC通过提供高级的抽象和自动化,降低了数据库操作的复杂性,提高了开发效率,而JDBC则是底层的数据库访问API,灵活性更高但需要更多的手动配置和代码编写。根据项目需求和团队技能,开发者...

    jdbc proxy 代理类

    拦截器在方法调用前后执行特定的逻辑,它可以在不修改原始JDBC代码的情况下,实现对数据库操作的增强。Java的动态代理机制允许我们动态地创建代理类,这使得代码更加灵活,易于扩展和维护。 总的来说,JDBC代理类...

    JDBC练习小项目用于java初学者

    **标题解析:** "JDBC练习小项目用于java初学者" 这个标题表明这是一个针对初学者设计的Java编程练习项目,重点在于JDBC(Java Database Connectivity)的应用。JDBC是Java语言中用来规范客户端程序如何连接和操作...

    webservice源代码Spring+JDBC

    1. **Spring MVC**:这是一个MVC设计模式的实现,允许开发者将业务逻辑、视图和控制逻辑分离,提高代码的可维护性和可测试性。在Web服务中,Spring MVC可以用于构建RESTful API,这些API可以被其他应用或服务消费。 ...

    Spring源代码解析(三):Spring_JDBC.doc

    总的来说,Spring JDBC的JdbcTemplate是Spring框架中用于数据库操作的关键组件,通过回调接口和模板方法设计,它极大地简化了数据库访问的代码,同时也提供了良好的异常处理和资源管理机制。理解和掌握JdbcTemplate...

    jdbc采用前后端分离的web项目

    在现代Web开发中,前后端分离是一种常见的架构模式,它将应用程序分为两个主要部分:前端(客户端)和后端(服务器端)。这种模式允许前端专注于用户体验和交互,而后端则负责业务逻辑和数据处理。本项目中,“jdbc...

    图书管理系统--JSP+JAVABEAN+JDBC源代码

    【图书管理系统】是一种用于管理图书馆资源的软件应用,它涵盖了图书的入库、...然而,随着技术的发展,现代的Web应用更倾向于使用MVC框架(如Spring MVC)或者前后端分离的开发模式,以提高开发效率和系统的可维护性。

    基于 SpringBoot + ShardingSphere(Sharding-JDBC) 的水平分表测试项目+源代码+文档说明

    一、Sharding-JDBC 与 JOOQ 的兼容性测试 - **测试项** - 不分片时,使用默认数据源的增、删、改、查 - 分片时,使用`ShardingDataSource`数据源的增、删、改、查 - 分片表与不分片表的连表查询...

    sharding-jdbc按月分表样例

    【标题】"sharding-jdbc按月分表样例"是一个关于使用Sharding-JDBC进行数据库分片的示例项目,旨在展示如何根据月份动态地将数据分散到不同的表中,以实现数据的水平扩展和负载均衡。Sharding-JDBC是阿里巴巴开源的...

    springboot2+两种方式:(读写分离、动态DataSource、事务懒处理)+sharding-jdbc.zip

    2、sharding-jdbc (1)、实现多种模式的读写分离 (2)、支持事务 (3)、配置中心化 (4)、存储过程不能正常解析 ———————————————— 版权声明:本文为CSDN博主「毛豆有毛没豆」的原创文章,...

Global site tag (gtag.js) - Google Analytics