JavaWeb15-DBUtils(Java真正的全栈开发)

DBUtils

一.DBUtils

1. DButils的介绍

dbutils的介绍及其作用

DBUtils是java编程中的数据库操作实用工具,小巧简单实用。

作用:

封装了对JDBC的操作,简化了JDBC操作,可以少写代码。

例如:

对于数据表的读操作,可以把结果转成Array,List等java集合,便于程序员操作;

对于数据表的写操作,也变得很简单(只需写sql语句)

可以使用数据源,使用JNDI,数据库连接池等技术来优化性能--重用已经构建好的数据库连接对象

dbutils三个核心功能介绍

QueryRunner类

QueryRunner中提供了对sql语句操作的API

主要有一下三个方法:

query() 用于执行select

update() 用于执行 insert update delete

batch() 批处理

ResultSetHandler接口

用于定义select操作后,怎样封装结果集.

DBUtils类

就是一个工具类,定义了关闭资源与事务处理的方法

2. DButils入门案例

a. 导入jar包 (除了commons-dbutils-1.4.jar还需连接池和驱动jar包)

b. 创建QueryRunner对象

c. 使用query方法执行select语句

d. 使用ResultSetHandler封装结果集

e. 使用DbUtils类释放资源

public static void main(String[] args) throws SQLException {

//创建QueryRunner对象

QueryRunner runner=new QueryRunner(DataSourceUtils.getDateSource());

//调用查询方法

List<User> list=runner.query("select * from user", new ResultSetHandler<List<User>>() {

@Override

public List<User> handle(ResultSet rs) throws SQLException {

List<User> list=new ArrayList<User>();

while(rs.next()){

list.add(new User(rs.getInt(1), rs.getString(2), rs.getString(3)));

}

return list;

}

});

//遍历结果

if(list.size()>0){

for (User user : list) {

System.out.println(user);

}

}

}

3. DButils API详解-DButils类

关闭操作

事务操作

4. DButils API详解-QueryRunner类

构造方法

QueryRunner runner=new QueryRunner(DataSouce ds);有参数构造.

这时代表它的事务是自动事务,一条sql一个事务.

QUeryRunner runner=new QueryRunner();无参数构造

它的事务是手动事务

有参数的QueryRunner与无参数的QueryRunner它们在执行query,update,batch方法时,是不一样的。有参数QueryRunner----它使用的query,update,batch方法时,是不用传递Connection参数的. 无参数QueryRunner----它使用的query,update,batch方法时,是需要有Connection参数的.如果使用的是QueryRunner()无参数,底层使用的是PreparedStatement对象,使用完成后会自动关闭PreparedStatement,但是Connection对象不会关闭.如果使用的是QueryRunner(DataSource ds)有参数,底层会先根据传递的数据源对象,获取一个Connection对象.它使用的是也是PreparedStatement对象,使用完成后关闭了PreparedStatement对象,并且也关闭了Connection对象.

query方法

update方法

batch方法

5. DButils API详解-ResultSetHandler接口

ResultSetHandler功能分析

它主要是用于将结果集封装到对象中.

自定义封装就是创建一个ResultSetHandler的实现类去完成封装。

在dbutils的api中提供了ResultSetHandler的实现类:

ArrayHandler :将ResultSet中第一行的数据转化成对象数组

ArrayListHandler将ResultSet中所有的数据转化成List,List中存放的是Object[]

BeanHandler :将ResultSet中第一行的数据转化成类对象

BeanListHandler :将ResultSet中所有的数据转化成List,List中存放的是类对象

ColumnListHandler :将ResultSet中某一列的数据存成List,List中存放的是Object对象

KeyedHandler :将ResultSet中存成映射,key为某一列对应为Map。Map中存放的是数据

MapHandler :将ResultSet中第一行的数据存成Map映射

MapListHandler :将ResultSet中所有的数据存成List。List中存放的是Map

ScalarHandler :将ResultSet中一条记录的其中某一列的数据存成Object

ResultSetHandler中handler方法作用

它的主要作用是用于将结果集数据封装到我们指定的一个对象中。

6. ResultSetHandler九个实现类的介绍

ArrayHandler

ArrayListHandler

BeanHandler

BeanListHandler

ColumnListHandler

MapHandler

MapListHandler

KeyedHandler

ScalarHandler

二.案例

案例准备:

将resource下的页面下的webroot替换掉myeclipse中的webroot

部署项目之后,访问 localhost:xx/dayxx/admin/login/home.jsp

这个页面也是我们以后在登录成功之后的后台首页

后台页面是使用frameset做的框架,分为上中下三部分,

中间左边的菜单栏是一棵树(dtree)

dtree的用法:

1.创建一棵树

2.添加根节点

3.添加其他节点

//创建一棵树

var d = new dTree('d');

//添加根节点

d.add(0,-1,'系统菜单树');

//添加其他节点

d.add(1,0,'商品管理','${pageContext.request.contextPath}/admin/login/welcome.jsp','','mainFrame');

add方法的参数说明:

位置 参数别名 类型 功能

1 id int 节点自身的id(唯一)

2 pid int 节点的父节点id

3 name string 节点显示在页面上的名称

4 url string 节点的链接地址

5 title string 鼠标放在节点上显示的提示信息

6 target string 节点链接所打开的目标frame

7 icon string 节点关闭状态时显示的图标

8 iconOpen string 节点打开状态时显示的图标

9 open bool 节点第一次加载是否打开

注意:前三个参数必须有.

在今天的案例里面:我们要完成添加商品,展示全部商品以及修改商品这三个功能

添加商品的页面:/admin/products/add.jsp

展示全部商品的页面:/admin/products/list.jsp

修改商品的页面:/admin/products/edit.jsp

接下来看看做这些功能需要准备什么:

查看商品时显示的信息

添加商品时的信息

商品具有的信息:

商品编号

商品名称

商品价格

商品数量

商品类别

商品描述

创建商品表及实体类:

Create table products(

id varchar(50) primary key,

name varchar(30),

price double,

pnum int,

category varchar(20),

description varchar(200)

);

private String id;

private String name;

private Double price;

private Integer pnum;

private String category;

private String description;

导入jar包

1. 案例-添加商品分析

功能描述

在add.jsp页面上输入商品信息完成商品信息添加到数据库操作,添加完成后跳转到商品查询页面,显示出所有商品

分析

步骤:

1. 添加商品的页面是 admin/products/add.jsp

2. 当输入商品信息,应该将信息提交到一个servlet中(AddProductServlet)

3. 在AddProductServlet中.获取请求参数封装到javaBean 然后调用ProductService中的addProduct(Product p)方法完成添加商品操作。

4. 在ProductService中的addProduct方法内调用ProductDao中的addProduct(Product p)方法完成添加 商品操作

5. 在ProductDao中的addProduct方法内使用dbutils完成商品添加

2. 案例-添加商品实现

3. 案例-查询全部商品分析

功能描述

在点击left.jsp页面上的商品查看时,展示出所有商品信息

分析

步骤:

1.修改left.jsp页面上的路径

在点击商品查看时,就会访问ListProductServlet.

2.在ListProductServlet中调用service,在调用dao查询出所有商品信息 List<Product> ps;

3.将ps通过request.setAttribute(“ps”,ps)请求转发到admin/products/list.jsp页面

4.在list.jsp页面上显示出ps集合中商品的信息。

通过<c:forEach>将所有的ps中的数据迭代出来展示

4. 案例-查询全部商品实现

5. 案例-修改商品信息分析

功能描述

在商品展示页面上,点击编辑商品,首先将商品的详细信息展示出来,在页面上可以对商品息进行修改,当修改后,跳转到展示商品页面展示出所有商品信息

分析

步骤:

1.根据id查询出商品并展示在页面上

a. 修改list.jsp页面上的编辑连接

b. 在FindProductByIdServlet中获取id值

c. 在FindProductByIdServlet调用service中findProductById方法得到一个Product对象

d. 将Product存储到request域中,并请求转发到/admin/products/edit.jsp页面

e. 在edit.jsp页面通过el表达式获取商品信息。

注意:在修改页面上,如何选中下拉选

var category = "${p.category}"; //1.得到商品的类别
//2.将category这个下拉框中的option的value与category相同的项设置为默认值
var ops = document.getElementById("category").options;
for ( var i = 0; i < ops.length; i++) {
if (ops[i].value == category) {
ops[i].selected = true;
}
}

2.修改操作

根据商品的id来进行修改操作。我们在开发中,一般进行修改时,在表单中都会存在一个隐藏域。

a. .在edit.jsp页面上添加一个隐藏域,它用于保存商品的id.

b. 表单提交到EditProductServlet中,通过BeanUtils将数据封装到Product 对象中,调用ProductServcie的修改操作的方法

c. 在ProductService中调用ProductDao中修改操作的方法

d. 在ProductDao中进行修改

e. 当修改完成后,我们重新查询出商品信息

6. 案例-修改商品信息实现

原文发布于微信公众号 - Java帮帮(javahelp)

原文发表时间:2017-02-02

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏JackieZheng

探秘Tomcat——从一个简陋的Web服务器开始

前言:   无论是之前所在实习单位小到一个三五个人做的项目,还是如今一个在做的百人以上的产品,一直都能看到tomcat的身影。工作中经常遇到的操作就是启动和关闭...

21870
来自专栏有趣的django

Django rest framework源码分析(1)----认证

一、基础 1.1.安装 两种方式: github pip直接安装 pip install django-rest-framework 1.2.需要先了解的一...

690110
来自专栏DOTNET

学会WCF之试错法——数据传输

服务契约 [ServiceContract] public interface IService { [OperationCon...

33160
来自专栏木头编程 - moTzxx

微信小程序Ⅵ [wx.request 的回调使用]

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/u011415782/article/de...

1.3K30
来自专栏章鱼的慢慢技术路

MFC绘图基础——上机操作步骤

56530
来自专栏别先生

基于jsp+servlet图书管理系统之后台用户信息查询操作

上一篇的博客写的是插入操作,且附有源码和数据库,这篇博客写的是查询操作,附有从头至尾写的代码(详细的注释)和数据库!   此次查询操作的源码和数据库:http:...

477100
来自专栏C/C++基础

Linux命令(47)——file命令

file命令用来识别文件类型,对文件的检查分为文件系统、魔法幻数检查和语言检查三个过程,也可用来辨别一些文件的编码格式。它是通过查看文件的头部信息来获取文件类型...

14320
来自专栏Android 研究

Android系统启动——2init进程

严格上讲,Android系统实际上是运行于Linux内核之上的一系列"服务进程",并不算一个完成意义上的"操作系统";而这一系列进程是维持Android设备正常...

27420
来自专栏我的博客

ThinkPHP3.1.2笔记

1.开启trace 方法一:在配置文件中添加(默认在config.php,如果定义debug模式,可以定义在debug.php) SHOW_PAGE_TRAC...

27280
来自专栏从零开始的linux

linux基础命令2

date命令 查看年月日 # date +%F 2017-02-22 查看时分秒 # date +%T 15:12:50 查看星期 date +%a Wed ...

34780

扫码关注云+社区

领取腾讯云代金券