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 ...
随机推荐
- iOS - User Agent 的应用和设置
UA在项目中的应用 给项目的webview或项目中的接口请求加一个区分,用来区别是iOS端访问.android访问还是在浏览器访问的,这时需要添加User Agent (http请求 header中的 ...
- JS 浅谈函数柯里化,不明觉厉
在计算机科学中,柯里化(Currying)是把接受多个参数的函数变换成接受一个单一参数(最初函数的第一个参数)的函数,并且返回接受余下的参数且返回结果的新函数的技术.这个技术由 Christopher ...
- 排序算法--插入排序(Insertion Sort)_C#程序实现
排序算法--插入排序(Insertion Sort)_C#程序实现 排序(Sort)是计算机程序设计中的一种重要操作,也是日常生活中经常遇到的问题.例如,字典中的单词是以字母的顺序排列,否则,使用起来 ...
- jquery的设计亮点
jquery的亮点我目前学习到一下几点: 1.封装库利用window的挂载实现闭包. 库一定要封装来防止变量污染全局,方式要么对象,要么立即执行函数.jquery用了立即执行函数.因为立即执行函数里的 ...
- STL算法总览(部分)
下图将所有的STL算法(以及一些非标准的SGI STL算法)的名称.用途.文件分布等等,依算法名称的字母顺序列表.表格中凡是不在STL标准规格之内的SGI专属算法,都以 * 加以表示. 注:以下“质变 ...
- MVC的HTTP请求处理过程(IIS应用程序池、CLR线程池)
主要内容 本文讲解的是:服务器接受Http Request请求之后,是如何进入.Net CLR,从而进一步操作的. 我们大家都知道,IIS必须先接受请求,然后才能有机会进入CLR,但对请求(reque ...
- Finalize方法的生成
Finalize在c#编程语言中需要特殊语法,因此,c#要求在类名前加~符号来定义Finalize方法:例如 internal class FinalizeDemo { ~FinalizeDemo() ...
- (三)juc高级特性——虚假唤醒 / Condition / 按序交替 / ReadWriteLock / 线程八锁
8. 生产者消费者案例-虚假唤醒 参考下面生产者消费者案例: /* * 生产者和消费者案例 */ public class TestProductorAndConsumer { public stat ...
- Golang自定义包导入
# 文件Tree project -/bin -/pkg -/src -main.go -/test -test1.go -test2.go main.go package main import ( ...
- javascript call apply
call 和 apply 都是为了改变某个函数运行时的 context 即上下文而存在的,换句话说,就是为了改变函数体内部 this 的指向.因为 JavaScript 的函数存在「定义时上下文」和「 ...