Java连接数据库 #05# SQL与代码分离

索引

    1. 读取html中的SQL语句
    2. 缺陷总结

Java连接数据库 #04#里是大概是这样放sql语句的:

package org.sample.shop.db.queryrunner;

import org.sample.shop.db.queryrunner.statementfactory.StatementFactory;

// TODO sql一长可读性变得非常非常差
public interface Statements {

    String ITEM_SAVE_ITEM = "INSERT INTO item(user_id, name, price, status, quantity) VALUES (?, ?, ?, ?, ?)";
    String ITEM_REMOVE_BY_ID = "DELETE FROM item WHERE id=?";
    String ITEM_UPDATE_BY_ID = "UPDATE item SET name=?, price=?, status=?, quantity=? WHERE id=?";
    String ITEM_GET_BY_ID = "SELECT id, user_id AS userId, name, price, status, quantity FROM item WHERE id=?";
    // order
    String ORDER_GET_BY_UID = "SELECT id, user_id AS userId, total FROM simple_order WHERE user_id=?";
    String ORDER_SAVE_ORDER = "INSERT INTO simple_order(user_id, total) VALUES(?, ?)";
    String ORDER_SAVE_ORDER_DETAIL = "INSERT INTO order_detail(order_id, item_id, user_id, quantity, price, status) VALUES(?, ?, ?, ?, ?, ?)";
    // order detail
    String ORDER_DETAIL_GET_BY_ORDER_ID = "SELECT id, order_id AS orderId, item_id AS itemId, user_id AS userId, quantity, price, status FROM order_detail WHERE order_id=?";
}

在简单的程序里这样写还是挺方便的,然而单条sql语句一旦变长可读性就会变得非常非常差。改起来也相当不方便。

我首先想到的解决办法是:像mybatis一样把sql放到单独一个XML文件里。于是,我简单写了个草稿程序添加DOM4J依赖开始尝试。结果当我把sql字符串放到xml标签里却被提示格式不对,解析起来也报错。。。。。。

然后仔细看看,mybatis能正常解析xml依靠的是这个↓

我只是想把sql单独放到文件里,并且我希望:

  • 方便阅读和修改sql语句
  • 方便Java解析文件并读取sql语句

为了节约学习成本,我脑洞一开。。。。就投机取巧地用html + jsoup做这件事了。

读取html中的SQL语句

sql.html:

<sql id="ITEM_LIST_BY_UID_AND_STATUS">
    SELECT *
    FROM (
    SELECT rownum AS r, id, user_id AS userId, name, price, status, quantity
    FROM item
    WHERE user_id=? AND status=?
    )temp
    WHERE r >= ? AND r < ?
</sql>
<sql id="ITEM_SAVE_ITEM">
    INSERT INTO item(user_id, name, price, status, quantity)
    VALUES (?, ?, ?, ?, ?)
</sql>
<sql id="ITEM_REMOVE_BY_ID">
    DELETE FROM item
    WHERE id=?
</sql>
<sql id="ITEM_UPDATE_BY_ID">
    UPDATE item
    SET name=?, price=?, status=?, quantity=?
    WHERE id=?
</sql>
<sql id="ITEM_GET_BY_ID">
    SELECT id, user_id AS userId, name, price, status, quantity
    FROM item
    WHERE id=?
</sql>

/

StatementFactory.java:

package org.sample.shop.db.queryrunner.statementfactory;

import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;
import org.jsoup.nodes.Element;

import java.io.File;
import java.io.IOException;

public class StatementFactory {
    private static final String PATHNAME = StatementFactory.class.getResource("/sql.html").getPath();
    private static final String CHAR_SET = "UTF-8";

    private static Document doc;

    static {
        File input = new File(PATHNAME);
        try {
            doc = Jsoup.parse(input, CHAR_SET, "");
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    public static String getStatement(String statementId) {
        Element sql = doc.select(statementId).first();
        return sql.text();
    }
}

/

Statements.java(原来的Sql.java):

package org.sample.shop.db.queryrunner;

import org.sample.shop.db.queryrunner.statementfactory.StatementFactory;

public interface Statements {
    // item
    String ITEM_LIST_BY_UID_AND_STATUS = StatementFactory.getStatement("#ITEM_LIST_BY_UID_AND_STATUS");
    String ITEM_SAVE_ITEM = StatementFactory.getStatement("#ITEM_SAVE_ITEM");
    String ITEM_REMOVE_BY_ID = StatementFactory.getStatement("#ITEM_REMOVE_BY_ID");
    String ITEM_UPDATE_BY_ID = StatementFactory.getStatement("#ITEM_UPDATE_BY_ID");
    String ITEM_GET_BY_ID = StatementFactory.getStatement("#ITEM_GET_BY_ID");;
}

PS. interface中常量和类中静态域性质是一样的!!

缺陷总结

这样做虽然解决了一些问题,但是改进空间还是相当大的。。。

例如说实际写的时候需要来回在4个文件跳转:

以及Statements.java和StatementFactory.java职能其实是重合的。。只是暂时没去把它们写到一起。

就。。有时间再搞吧。。。。。。。。。。。。。。。。

原文地址:https://www.cnblogs.com/xkxf/p/10198620.html

时间: 2024-11-06 20:53:43

Java连接数据库 #05# SQL与代码分离的相关文章

代码生成java连接数据库的所需代码(超详细)

开始学习: round 1:(一开始学习当然还是要一步一步学习的啦,哪有什么一步登天!!!) a.准备工作:1.eclipse,mysql(这两个软件肯定要的啦,不然学什么把它们连接起来) 2.加载驱动jar包:mysql-connector-java-5.1.40.jar(我用的是这个版本,你们随意!) b.创建工程,把jar包导进工程中的lib下面,然后右击build path把jar包添加进工程中 c.创建数据库books,添加相关字段 d.创建与数据库的连接及查看数据库信息 1 impo

JAVA连接数据库 #03# HikariCP

索引 为什么用数据库连接池? HikariCP快速入门 依赖 简单的草稿程序 设置连接池参数(只列举常用的) MySQL配置 修改Java连接数据库 #02#中的代码 测试 为什么用数据库连接池? 为什么要用数据库连接池? 如果我们分析一下典型的[连接数据库]所涉及的步骤,我们将理解为什么: 使用数据库驱动程序打开与数据库的连接 打开TCP套接字以读取/写入数据 通过套接字读取/写入数据 关闭连接 关闭套接字 很明显,[连接数据库]是相当昂贵的操作,因此,应该想办法尽可能地减少.避免这种操作.

转载-使用 Feed4JUnit 进行数据与代码分离的 Java 单元测试

JUnit 是被广泛应用的 Java 单元测试框架,但是它没有很好的提供参数化测试的支持,很多测试人员不得不把测试数据写在程序里或者通过其它方法实现数据与代码的分离,在后续的修改和维护上有诸多限制和不便.Feed4JUnit 是开源的基于 JUnit 的扩展,通过使用 Feed4JUnit 提供的注释,用户可以很方便的把测试数据存放在文件或其它数据源.本文通过介绍及简单示例,使读者了解并能够使用 Feed4JUnit, 方便的实现数据与代码分离的测试. Feed4JUnit 与 JUnit 经常

数据库SQL的基础知识及java连接数据库的基本操作过程

数据库SQL的基础知识 [补充数据库基本知识点] 数据库是按照一定的数据结构来组织.存储和管理数据的仓库 数据库管理系统是一种操纵和管理数据库的大型软件,用于建立.使用和维护数据库 1.数据库表的完整性约束:域约束(表中字段取值范围).主码约束(主键,唯一确定一条记录).外码约束(表中一个字段,确实另外一张表的主码) 用SQL语句生成外键: //为foods表的CategoryId字段生成外键fk_Foods_Category alter table foods add constraint f

采用jsp页面与java代码分离的方式写一个简单的二维表

前提:在我们做程序时追求的是高内聚,低耦合,但是如果我们把jsp页面的的代码和java的代码都放在了jsp的代码编写中,使java和jsp高耦合这样的话不仅使jsp代码页面显得很复杂,而且也特别让不利于以后的维护,所以我们有了一个不成文的规范就是分层架构,把javad代码与jsp的代码分离开来,使jsp代码页中更加干净整洁. 下面我将于用jsp和java代码分离的方法做出这样的一个二维表(做一个jsp页面动态显示信息表) 第一步:首先我们需要一个实体类用于存放一个人的一整条信息(根据表格信息有编

java 连接mysql 和sql server2008代码

这两天用java分别连接mysql和sql server2008代码.刚開始都是有错.如今找到了在 自己机器上成功连接的代码: 1. mysql Class.forName("com.mysql.jdbc.Driver").newInstance(); String url="jdbc:mysql://localhost:3306/website?characterEncoding=utf8";//website为数据库名.读取mysql中中文字符 String u

java连接数据库

在软件开发的过程中,和数据库打交道是必须的.java连接数据库比较简单,但是对于刚开始学习编程的人员来说,可能会有点不知从哪里入手,现在就为大家讲解一下java连接数据库的方法: 1.打开myeclipse,新建一个java工程: 在工程下面新建一个包: 2.新建一个java类,叫DBManger,并在此类中编写代码: 代码书写好之后,要加入数据库的驱动包: 右键点击项目----Build path----Configure Build Path---点击Libraries 点击 Add Ext

Java基础05 实施接口(转载)

经过封装,产品隐藏了内部细节,只提供给用户接口(interface). 接口是非常有用的概念,可以辅助我们的抽象思考.在现实生活中,当我们想起某个用具的时候,往往想到的是该用具的功能性接口.比如杯子,我们想到加水和喝水的可能性,高于想到杯子的材质和价格.也就是说,一定程度上,用具的接口等同于用具本身.内部细节则在思考过程中被摒弃. 在public和private的封装机制,我们实际上同时定义了类和接口,类和接口混合在一起.Java还提供了interface这一语法.这一语法将接口从类的具体定义中

Java连接数据库 #02# JDBC经典套路

内容索引 LocalConnectionFactory.java LocalConnectionProxy.java ProfileDAO.java-2.0 ProfileDAOImpl.java-2.0 DaoException.java DbUtil.java-2.0 ProfileDAOTest.java-2.0 DaoTest.java(并发测试) 接Java连接数据库 #01# JDBC单线程适用,主要是改为多线程适用,顺便对DAO层结构进行改良: connection由共享变量改为由