Java连接数据库 #06# SQL与代码分离(精化版本)
索引
接Java连接数据库#05#,对代码进行改进。
DAO层依赖关系草图

应用示例(只需3步!)
1、首先定义接口类:
package org.sample.shop.common.dao; import org.sample.shop.common.entity.Cart;
import org.sample.shop.common.entity.Order; import java.util.List; public interface CartDAO { int addItem(Long uid, Long itemId); int removeItem(Long id); int removeAll(Long uid); // 清空购物车 List<Cart> listByUid(Long uid); Order getPreOrder(Long uid);
}
2、然后书写相应的SQL以及返回类型(id的默认格式是“文件名_方法名”):
<sql id="cart_addItem">
INSERT INTO cart(user_id, item_id)
VALUES (?, ?)
</sql>
<sql id="cart_removeAll">
DELETE FROM cart WHERE user_id=?
</sql>
<sql id="cart_removeItem">
DELETE FROM cart WHERE id=?
</sql>
<sql id="cart_getByUid" type="org.sample.shop.common.entity.Cart">
SELECT id, user_id AS userId, item_id AS itemId FROM cart WHERE user_id=?
</sql>
<sql id="cart_getPreOrder" type="org.sample.shop.common.entity.OrderDetail">
SELECT cart.id, item_id AS itemId, item.user_id AS userId, price
FROM cart
LEFT JOIN item ON cart.item_id = item.id
WHERE cart.user_id=?
</sql>
<sql id="cart_getSum" type="java.lang.Number">
SELECT SUM(price) AS sum
FROM cart
LEFT JOIN item ON cart.item_id = item.id
WHERE cart.user_id=?
</sql>
3、最后,通过QueryRunnerProxy执行SQL并拿到所需对象。
package org.sample.shop.common.dao.impl; import org.sample.shop.common.dao.CartDAO;
import org.sample.shop.common.db.QueryRunnerProxy;
import org.sample.shop.common.entity.Cart;
import org.sample.shop.common.entity.Order;
import org.sample.shop.common.entity.OrderDetail; import java.util.List;
import java.util.Map; public class CartDAOImpl implements CartDAO { @Override
public int addItem(Long uid, Long itemId) {
return QueryRunnerProxy.update("cart_addItem", uid, itemId);
} @Override
public int removeItem(Long id) {
return QueryRunnerProxy.update("cart_removeItem", id);
} @Override
public int removeAll(Long uid) {
return QueryRunnerProxy.update("cart_removeAll", uid);
} @Override
public List<Cart> listByUid(Long uid) {
return QueryRunnerProxy.query("cart_getByUid", uid);
} @Override
public Order getPreOrder(Long uid) {
Order order = new Order();
order.setUserId(uid); // 设置买家id
// 1. 查总价
List<Map> mapList = QueryRunnerProxy.query("cart_getSum", uid);
Double total = Double.parseDouble(mapList.get(0).get("sum").toString());
order.setTotal(total);
// 2. 查对应的物品清单
List<OrderDetail> details = QueryRunnerProxy.query("cart_getPreOrder", uid);
order.setDetails(details);
return order;
}
}
具体实现代码参考github:https://github.com/xkfx/simple-shop
不过还有一些线程安全方面的隐患待解决。。。。。。。。。。。。。
Java连接数据库 #06# SQL与代码分离(精化版本)的更多相关文章
- Java连接数据库 #05# SQL与代码分离
索引 读取html中的SQL语句 缺陷总结 在Java连接数据库 #04#里大概是这样放sql语句的: package org.sample.shop.db.queryrunner; import o ...
- 代码生成java连接数据库的所需代码(超详细)
开始学习: round 1:(一开始学习当然还是要一步一步学习的啦,哪有什么一步登天!!!) a.准备工作:1.eclipse,mysql(这两个软件肯定要的啦,不然学什么把它们连接起来) 2.加载驱 ...
- Java连接数据库 #04# Apache Commons DbUtils
索引 通过一个简单的调用看整体结构 Examples 修改JAVA连接数据库#03#中的代码 DbUtils并非是什么ORM框架,只是对原始的JDBC进行了一些封装,以便我们少写一些重复代码.就“用” ...
- JAVA连接数据库 #03# HikariCP
索引 为什么用数据库连接池? HikariCP快速入门 依赖 简单的草稿程序 设置连接池参数(只列举常用的) MySQL配置 修改Java连接数据库#02#中的代码 测试 为什么用数据库连接池? 为什 ...
- 转载-使用 Feed4JUnit 进行数据与代码分离的 Java 单元测试
JUnit 是被广泛应用的 Java 单元测试框架,但是它没有很好的提供参数化测试的支持,很多测试人员不得不把测试数据写在程序里或者通过其它方法实现数据与代码的分离,在后续的修改和维护上有诸多限制和不 ...
- C#和Java中执行SQL文件脚本的代码(非常有用)
原文:C#和Java中执行SQL文件脚本的代码(非常有用) 我们在做程序的时候有事后会涉及到利用sql文件 直接执行,可是在sql文件中有很多注释,我们要一句一句的执行首先必须的得把sql文件解析 去 ...
- java 连接mysql 和sql server2008代码
这两天用java分别连接mysql和sql server2008代码.刚開始都是有错.如今找到了在 自己机器上成功连接的代码: 1. mysql Class.forName("com.mys ...
- Java&Selenium自动化测试实现页面元素、页面对象及测试代码分离
一.摘要 本篇博文将介绍自动化测试实现页面元素.页面对象及测试代码分离在自动化框架中的实现 二.解析页面元素定位信息 首先,将页面元素与实际的代码分离,首先我们将页面元素定位信息和定位表达式保存在属性 ...
- Java连接数据库 #02# JDBC经典套路
内容索引 LocalConnectionFactory.java LocalConnectionProxy.java ProfileDAO.java-2.0 ProfileDAOImpl.java-2 ...
随机推荐
- Vivado Design Suite用户指南之约束的使用第二部分(约束方法论)
Constraints Methodology(约束方法论) 关于约束方法论 设计约束定义了编译流程必须满足的要求,以使设计在板上起作用. 并非所有步骤都使用所有约束在编译流程中. 例如,物理约束仅在 ...
- java面试复习题四
一.redis最大缓存和回收策略 二.常用的数据库Druid线程池的参数设置 三.Spring的几大特性和应用 参考 Spring的核心特性就是IOC和AOP,IOC(Inversion of Con ...
- git clean(转载)
git clean命令用来从你的工作目录中删除所有没有tracked过的文件. git clean经常和git reset --hard一起结合使用. 记住reset只影响被track过的文件, 所以 ...
- nginx_ssl安装
Nginx的安装依赖于以下三个包,意思就是在安装Nginx之前首先必须安装一下的三个包,安装顺序为我写的顺序: c.1 SSL功能需要openssl库,下载地址:http://www.openssl. ...
- dedecms (织梦)漏洞&exp整理
[通杀]dedecms plussearch.php 注入漏洞利用方式看结果如果提示Safe Alert: Request Error step 2 !那么直接用下面的exp查看源代码打印帮助1 /p ...
- export及export default的区别
在JavaScript ES6中,export与export default均可用于导出常量.函数.文件.模块等,你可以在其它文件或模块中通过import+(常量 | 函数 | 文件 | 模块)名的方 ...
- 学习完HTML后的5大测试题----9.18
考试题目 第一题: 布局出该效果 提示:使用DIV的border样式,调整边框粗细出现该效果,保留上边框,其它三个方向的边框需设置:border-left:100px solid transpar ...
- VS code -python 使用笔记本
1--使用虚拟环境 |----setting->search: python.venv->设置 venv path (你创建的虚拟环境文件夹所在路径,此处我的是 - 目录下) |---- ...
- redis分布式锁的具体应用
1.关于redis分布式锁,有个setIfAbsent: 即如果没有设置,会添加分布式锁,并返回true; 2.redis分布式锁有个轮询过程: / * @param key redis键 * @pa ...
- ADC裸机程序
硬件平台:JZ2440 实现功能:通过采集触摸屏ADC的电压值,推算触摸xy坐标 start.s init.c nand.c interrupt.c uart.c uart.h my_stdio.c ...