Dbutils

操作数据第三方包。依赖数据源DataSource(DBCP|C3p0)。

QueryRunner – 接收DataSource|Connection,查询数据删除修改操作。返回结果。

ResultSetHandler – 结果集句柄,将结果数据封装成程序所需要的数据类型Map,List,Bean。

第一步:创建一个新的java项目

第二步:导入包

Mysql.jar

Dbcp.jar – 连接池的包。

Dbtutil.jar

第三步:创建dataSource数据源

driverClassName=com.mysql.jdbc.Driver

url=jdbc:mysql:///db909?characterEncoding=UTf8

username=root

password=1234

maxActive=5

工厂类创建一个唯一的dataSorce
package cn.itcast.utils;
import java.io.InputStream;
import java.util.Properties;
import javax.sql.DataSource;
import org.apache.commons.dbcp.BasicDataSourceFactory;
public class DataSourceUtils {
private static DataSource ds;
static{
try{
//读取资源文件
InputStream in = DataSourceUtils.class
.getClassLoader().getResourceAsStream("dbcp.properties");
//读取资源对象
Properties prop = new Properties();
prop.load(in);
//创建ds
ds = new BasicDataSourceFactory().createDataSource(prop);
}catch(Exception e){
throw new RuntimeException(e.getMessage(),e);
}
}
//返回整个池对象
public static DataSource getDatasSource(){
return ds;
}
}

第四步:开始测试dbutils的使用

Queryrunner.query 只可以执行select语句。

Queryrunner.update只可以接收update,delte,insert语句。

保存数据:

@Test
public void insert1() throws Exception{
QueryRunner run = new QueryRunner(getDatasSource());
String sql = "insert into users values('U002','李四','888')";
run.update(sql);
}
//接收?
@Test
public void insert2() throws Exception{
QueryRunner run = new QueryRunner(getDatasSource());
String sql = "insert into users values(?,?,?)";
run.update(sql,"U003","王五","");
}
//删除
@Test
public void del1() throws Exception{
QueryRunner run = new QueryRunner(getDatasSource());
String sql = "delete from users where name=?";
int len = run.update(sql,"李四");
System.err.println(len);
}
@Test
public void udpate1() throws Exception{
QueryRunner run = new QueryRunner(getDatasSource());
String sql = "update users set name=? where id=?";
run.update(sql,"赵'七","U001");
}

查询:

查询时除了使用queryrunner还要使用别一个核心类resultsethandler:结果集的句本周 封装结果到List,Map,Bean。

ArrayHandler,  - 用于查询一行唯一的数据。Object[]

QueryRunner run = new QueryRunner(getDatasSource());

       String sql = "select * from users";

       Object[] os = run.query(sql,new ArrayHandler());

       for(Object o:os){

           System.err.println(o);

       }

结果是:

U001

赵'七

123

ArrayListHandler,  - 将所有的结果封装成List<Object[]>
QueryRunner run = new QueryRunner(getDatasSource());
String sql = "select * from users";
List<Object[]> list = run.query(sql,new ArrayListHandler());
for(Object[] os:list){
for(Object o:os){
System.err.print(o+"\t");
}
System.err.println("\n=====");
}

返回的是:

U001   赵'七   123

=====

U002   AaA 44

=====

U003   88  777

=====

 BeanHandler,   - 返回一个 Bean,结果封装到Bean。只查询第一行。适合根据id查询唯一的一行。
@Test
public void query2() throws Exception{
QueryRunner run = new QueryRunner(getDatasSource());
String sql = "select * from users where id=?";
User user =
run.query(sql,new BeanHandler<User>(User.class),"U003");
System.err.println(user);
}
BeanListHandler ,  - 返回List<Bean>所有行,都封装到List,适合于查询多个结果
@Test
public void query3() throws Exception{
QueryRunner run = new QueryRunner(getDatasSource());
String sql = "select * from users";
List<User> us =
run.query(sql,new BeanListHandler<User>(User.class));
for(User u:us){
System.err.println(u);
} }

结果是:

User [id=U001, name=赵'七, pwd=123]

User [id=U002, name=AaA, pwd=44]

User [id=U003, name=88, pwd=777]

ColumnListHandler, - 查询一个字段时就可以使用这种方式 select name from table;
QueryRunner run = new QueryRunner(getDatasSource());
String sql = "select * from users";
List<Object> list = run.query(sql, new ColumnListHandler("pwd"));
for(Object o:list){
System.err.println(o);
}
 KeyedHandler --
QueryRunner run = new QueryRunner(getDatasSource());
String sql = "select * from users";
Map<Object,Map<String,Object>> mm =
run.query(sql, new KeyedHandler("id"));
Iterator it = mm.keySet().iterator();
while(it.hasNext()){
Map m1 = mm.get(it.next());
System.err.println(m1.get("id")+","+m1.get("name")+","+m1.get("pwd"));
}

结果是:

800x600

Normal
0

7.8 磅
0
2

false
false
false

EN-US
ZH-CN
X-NONE

MicrosoftInternetExplorer4

/* Style Definitions */
table.MsoNormalTable
{mso-style-name:普通表格;
mso-tstyle-rowband-size:0;
mso-tstyle-colband-size:0;
mso-style-noshow:yes;
mso-style-priority:99;
mso-style-parent:"";
mso-padding-alt:0cm 5.4pt 0cm 5.4pt;
mso-para-margin:0cm;
mso-para-margin-bottom:.0001pt;
mso-pagination:widow-orphan;
font-size:10.0pt;
font-family:"Times New Roman","serif";}

{U001={id=U001, pwd=123, name=赵'七}, U002={id=U002, pwd=44, name=AaA}, U003={id=U003, pwd=777, name=88}}

, MapHandler ,  与 BeanHandler应,只返回第一行,封装成Map类型 - 也适合于查询一个结果集的
适合于关联查询,且没有匹配的Bean。
MapListHandler ,  - 
List<Map>
@Test
public void query6() throws Exception{
QueryRunner run = new QueryRunner(getDatasSource());
String sql = "SELECT u.name as uname,c.name as cname"+
" FROM users u INNER JOIN contacts c ON u.id=c.uid";
System.err.println(sql);
List<Map<String,Object>> mm = run.query(sql,new MapListHandler());
System.err.println(mm);
}
SELECT u.name as uname,c.name as cname FROM users u INNER JOIN contacts c ON u.id=c.uid
[{uname=Jack, cname=Rose}, {uname=Jack, cname=李四}, {uname=Jack, cname=王五}, {uname=张三, cname=马六}, {uname=张三, cname=赵七}]
ScalarHandler – 标量- 用于select count()|sum|avg|max …一些聚合函数
@Test
public void query7() throws Exception{
QueryRunner run = new QueryRunner(getDatasSource());
String sql = "select count(*) from contacts";
Object o = run.query(sql,new ScalarHandler());
Integer ss = Integer.valueOf(o.toString());
System.err.println(ss);
}

800x600

Normal
0

7.8 磅
0
2

false
false
false

EN-US
ZH-CN
X-NONE

MicrosoftInternetExplorer4

/* Style Definitions */
table.MsoNormalTable
{mso-style-name:普通表格;
mso-tstyle-rowband-size:0;
mso-tstyle-colband-size:0;
mso-style-noshow:yes;
mso-style-priority:99;
mso-style-parent:"";
mso-padding-alt:0cm 5.4pt 0cm 5.4pt;
mso-para-margin:0cm;
mso-para-margin-bottom:.0001pt;
mso-pagination:widow-orphan;
font-size:10.0pt;
font-family:"Times New Roman","serif";}

总结:

1:包装HttpServletRequest。是对getParaqmgermap增强。

2:用dbcp连接数据库,并在一个项目中维护一个唯一的dataSource。

工厂类,一个datasource的成员静态。

  Static代码块中读取配置文件连接数据库。创建datasource。

    提供一个工厂方法返回整个池对象。

3:dbutils的所有查询方法

所有ResultSetHandler的子类做一次。

MapHandler

MapListHandler

BeanHandler

BeanListHandler

ScalerHandler


800x600

Normal
0

7.8 磅
0
2

false
false
false

EN-US
ZH-CN
X-NONE

MicrosoftInternetExplorer4

/* Style Definitions */
table.MsoNormalTable
{mso-style-name:普通表格;
mso-tstyle-rowband-size:0;
mso-tstyle-colband-size:0;
mso-style-noshow:yes;
mso-style-priority:99;
mso-style-parent:"";
mso-padding-alt:0cm 5.4pt 0cm 5.4pt;
mso-para-margin:0cm;
mso-para-margin-bottom:.0001pt;
mso-pagination:widow-orphan;
font-size:10.0pt;
font-family:"Times New Roman","serif";}

java学习笔记—第三方操作数据库包专门接收DataSource-dbutils (30)的更多相关文章

  1. java学习笔记—第三方数据库连接池包1(29)

    第一步:导入dbcp包 第二步:通过核心类连接数据 BasicDataSource它是javax.sql.DataSrouce的子类. 一个工具类:BasicDataSourceFactory. 手工 ...

  2. python学习笔记:操作数据库

    1.下载安装模块 第一种:cmd下:执行命令下载安装:pip3 install pymysql 第二种:IDE下pycharm python环境路径下添加模块 2.连接数据库 import pymys ...

  3. Java学习笔记——IO操作之对象序列化及反序列化

    对象序列化的概念 对象序列化使得一个程序可以把一个完整的对象写到一个字节流里面:其逆过程则是从一个字节流里面读出一个事先存储在里面的完整的对象,称为对象的反序列化. 将一个对象保存到永久存储设备上称为 ...

  4. Java学习笔记——IO操作之以图片地址下载图片

    以图片地址下载图片 读取给定图片文件的内容,用FileInputStream public static byte[] mReaderPicture(String filePath) { byte[] ...

  5. java学习笔记07--日期操作类

    java学习笔记07--日期操作类   一.Date类 在java.util包中定义了Date类,Date类本身使用非常简单,直接输出其实例化对象即可. public class T { public ...

  6. Java学习笔记——File类之文件管理和读写操作、下载图片

    Java学习笔记——File类之文件管理和读写操作.下载图片 File类的总结: 1.文件和文件夹的创建 2.文件的读取 3.文件的写入 4.文件的复制(字符流.字节流.处理流) 5.以图片地址下载图 ...

  7. Java学习笔记:基本输入、输出数据操作实例分析

    Java学习笔记:基本输入.输出数据操作.分享给大家供大家参考,具体如下: 相关内容: 输出数据: print println printf 输入数据: Scanner 输出数据: JAVA中在屏幕中 ...

  8. Java学习笔记4

    Java学习笔记4 1. JDK.JRE和JVM分别是什么,区别是什么? 答: ①.JDK 是整个Java的核心,包括了Java运行环境.Java工具和Java基础类库. ②.JRE(Java Run ...

  9. 《Java学习笔记(第8版)》学习指导

    <Java学习笔记(第8版)>学习指导 目录 图书简况 学习指导 第一章 Java平台概论 第二章 从JDK到IDE 第三章 基础语法 第四章 认识对象 第五章 对象封装 第六章 继承与多 ...

随机推荐

  1. Ubuntu12.04编译vlc-android详细流程

    作者:wainiwann 出处:http://www.cnblogs.com/wainiwann/ 本文版权归作者所有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则 ...

  2. java 重定向和转发 的区别

    重定向方式的含义是第一个页面通知浏览器发送一个新的页面请求.因为,当你使用重定向时,浏览器中所显示的URL会变成新页面的URL, 而当使用转发时,该URL会保持不变. 重定向的速度比转发慢,因为浏览器 ...

  3. C#预编译的问题

    C#预编译宏并不像C++那样编译之后就不存在了.在UNITY的C#脚本中 #if UNITY_ANDROID && !UNITY_EDITOR AndroidJavaClass jc ...

  4. Struts2 学习记录-1--Struts2中的配置文件

    目录 1. web.xml 2. struts.xml 3. struts.properties文件 4.注解式开发 5.与Spring框架集成的配置 主要涉及3个配置文件:web.xml.strut ...

  5. jqzoom插件图片放大功能的一些BUG

    建议使用cloud-zoom插件,jqzoom插件就不要使用了 点击查看——图片放大镜——jQuery插件Cloud Zoom 刚开始使用的是jqzoom插件,但问题太多了,就不说插入到页面中使用了, ...

  6. swagger框架

    1.1   介绍 Swagger是一个简单又强大的能为你的Restful风格的Api生成文档工具.在项目中集成这个工具,根据我们自己的配置信息能够自动为我们生成一个api文档展示页,可以在浏览器中直接 ...

  7. Golang之函数练习

    小例题: package main import "fmt" /* 函数练习, 可变参数使用 写一个函数add 支持1个或多个int相加,并返回相加结果 写一个函数concat,支 ...

  8. Efficient algorithms for polyploid haplotype phasing 多倍体单体型分型的有效算法

    背景:单倍型的推断,或沿着相同染色体的等位基因序列,是遗传学中的基本问题,并且是许多分析的关键组分,包括混合物图谱,通过下降和插补识别身份区域. 基于测序读数的单倍型定相引起了很多关注. 已经广泛研究 ...

  9. PolyCluster: Minimum Fragment Disagreement Clustering for Polyploid Phasing 多聚类:用于多倍体的最小碎片不一致聚类

    摘要 分型是计算生物学的一个新兴领域,在临床决策和生物医学科学中有着重要的应用. 虽然机器学习技术在许多生物医学应用中显示出巨大的潜力,但它们在分型中的用途尚未完全理解. 在本文中,我们研究了基于聚类 ...

  10. android 的AlertDialog对话框

    private int selectedFruitIndex = 0;  private void showMsg2() {//  Dialog alertDialog = new AlertDial ...