文档版本 | 开发工具 | 测试平台 | 工程名字 | 日期 | 作者 | 备注 |
---|---|---|---|---|---|---|
V1.0 | 2016.05.15 | lutianfei | none |
获取一个DataBaseMetaData
通过DataBaseMetaData获得 数据库连接的基本参数
获得数据库、表、列、主键、外键 定义信息
常用API
参数元数据主要用于获取:sql语句中占位符的相关信息.
PreparedStatement . getParameterMetaData()
常用API
注意:在获取参数类型时会产生异常
ResultSet. getMetaData()
常用API
public static void main(String[] args) throws SQLException {
Connection con = JdbcUtils.getConnection();
ResultSet rs = con.createStatement().executeQuery(
"select * from account");
// 得到结果集元数据
ResultSetMetaData rsmd = rs.getMetaData();
// System.out.println(rsmd.getColumnCount());//获取结果集中列数量
//
// System.out.println(rsmd.getColumnName(2));//获取结果集中指定列的名称.
//
// System.out.println(rsmd.getColumnTypeName(3));//获取结果集中指定列的类型。
int count = rsmd.getColumnCount();
for (int i = 1; i <= count; i++) {
System.out.print(rsmd.getColumnName(i)+"("+rsmd.getColumnTypeName(i)+")" + "\t");
}
System.out.println();
while (rs.next()) {
for (int i = 1; i <= count; i++) {
System.out.print(rs.getObject(i) + "\t\t");
}
System.out.println();
}
}
commons-dbutils 是 Apache 组织提供的一个开源 JDBC工具类库,它是对JDBC的简单封装,学习成本极低,并且使用dbutils能极大简化jdbc编码的工作量,同时也不会影响程序的性能。因此dbutils成为很多不喜欢hibernate的公司的首选。
简单说,它就是一个简单的jdbc封装工具,使用dbutils可以简化操作,要使用dbutils需要导入jar包。
JAR包: commons.dbutils-1.4.jar
API介绍:
1、QueryRunner
框架核心类 ,所有数据库操作都是必须通过 QueryRunner 进行的,用于执行sql语句的类。
2、ResultSetHandler
结果集封装接口,完成将ResultSet 结果集 封装为一个Java对象
3、DbUtils
工具类 提供驱动管理、事务管理、释放资源等一系列公共方法
close(…)
throws java.sql.SQLException closeQuietly(…)
commitAndCloseQuietly
(Connection conn) loadDriver
(java.lang.String driverClassName):这一方装载并注册*JDBC驱动程序*,如果成功就返回true。使用该方法,你不需要捕捉这个异常ClassNotFoundException。1.QueryRunner怎样获取
2.QueryRunner中的三个核心方法
总结:
怎样配套使用:
模仿QueryRunner
public T query(Connection con, String sql, MyResultSetHandler mrs,Object... params) throws SQLException {
PreparedStatement pst = con.prepareStatement(sql); // 得到一个预处理的Statement.
// 问题:sql语句中可能存在参数,需要对参数赋值。
ParameterMetaData pmd = pst.getParameterMetaData();
// 可以得到有几个参数
int count = pmd.getParameterCount();
for (int i = 1; i <= count; i++) {
pst.setObject(i, params[i - 1]);
}
ResultSet rs = pst.executeQuery(); // 得到了结果集,要将结果集封装成用户想要的对象,但是,工具不可能知道用户需求。
return mrs.handle(rs);
}
public int update(Connection con, String sql, Object... params) throws SQLException {
PreparedStatement pst = con.prepareStatement(sql); // 得到一个预处理的Statement.
// 问题:sql语句中可能存在参数,需要对参数赋值。
ParameterMetaData pmd = pst.getParameterMetaData();
// 可以得到有几个参数
int count = pmd.getParameterCount();
for (int i = 1; i <= count; i++) {
pst.setObject(i, params[i - 1]);
}
int row = pst.executeUpdate();
// 关闭资源
pst.close();
return row;
}
该接口用于处理 java.sql.ResultSet
,将数据按要求转换为另一种形式。
ArrayHandler
, 将结果集中第一条记录封装到Object[]数组,数组中的每一个元素就是记录中的字段值。
ArrayListHandler
, 将结果集中每一条记录封装到Object[],数组中的每一个元素就是记录中的字段值。在将这些数组装入到List集合。BeanHandler
(重点), 将结果集中第一条记录封装到一个javaBean中。BeanListHandler
(重点), 将结果集中每一条记录封装到javaBean中,在将javaBean封装到List集合。ColumnListHandler
, 将结果集中指定列的值封装到List集合.MapHandler
, 将结果集中第一条记录封装到Map集合中,集合的 key就是字段名称,value就是字段值MapListHandler
, 将结果集中每一条记录封装到Map集合中,集合的 key就是字段名称,value就是字段值,在将这些Map封装到List集合KeyedHandler
,在使用指定的列的值做为一个Map集合的key,值为每一条记录的Map集合封装。ScalarHandler
进行单值查询 select count(*) from account;//介绍ResultSetHandler的九个实现类.
public class ResultSetHandlerImplTest {
// ArrayHandler
@Test
public void fun1() throws SQLException {
QueryRunner runner = new QueryRunner(DataSourceUtils.getDataSource());
Object[] obj = runner
.query("select * from account", new ArrayHandler());
System.out.println(Arrays.toString(obj));
}
// ArrayListHandler
@Test
public void fun2() throws SQLException {
QueryRunner runner = new QueryRunner(DataSourceUtils.getDataSource());
List
public class MyBeanHandler implements MyResultSetHandler {
private Class clazz;
public MyBeanHandler(Class clazz) {
this.clazz = clazz;
}
public Object handle(ResultSet rs) throws SQLException {
Object obj = null;
Map map = new HashMap();
ResultSetMetaData md = rs.getMetaData();
int count = md.getColumnCount();
if (rs.next()) {
try {
obj = clazz.newInstance();
for (int i = 1; i <= count; i++) {
map.put(md.getColumnName(i),
new String[] { rs.getString(md.getColumnName(i)) });
}
BeanUtils.populate(obj, map);
} catch (InstantiationException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
} catch (InvocationTargetException e) {
e.printStackTrace();
}
}
return obj;
}
// 从结果集的方向去封装数据
// public Object handle(ResultSet rs) throws SQLException {
// Object obj = null;
// // 1.得到结果集元数据
// ResultSetMetaData md = rs.getMetaData();
// // 2.得到所有字段名称
// int count = md.getColumnCount();
//
// if (rs.next()) {//遍历结果集
// try {
// BeanInfo bif = Introspector.getBeanInfo(clazz); //得到BeanInfo
// PropertyDescriptor[] pds = bif.getPropertyDescriptors();
// //得到javaBean的所有属性描述器
// obj = clazz.newInstance();
// for (int i = 1; i <= count; i++) {
// String name = md.getColumnName(i); //得到每一列的名称
//
// for(PropertyDescriptor pd:pds){
// if(name.equals(pd.getName())){ //与javaBean的属性比较
//
// pd.getWriteMethod().invoke(obj,
// rs.getObject(name));//使用setXxx方法将结果集中的字段值封装到JavaBean的对应属性上。
// }
// }
// }
// } catch (InstantiationException e) {
// e.printStackTrace();
// } catch (IllegalAccessException e) {
// e.printStackTrace();
// } catch (IntrospectionException e) {
// e.printStackTrace();
// } catch (IllegalArgumentException e) {
// e.printStackTrace();
// } catch (InvocationTargetException e) {
// e.printStackTrace();
// }
//
// }
// return obj;
// }
// 从javaBean 的方向去封装数据
// public Object handle(ResultSet rs) throws SQLException {
//
// Object obj = null;
// // 1.得到clazz所有bean属性.
// try {
//
// BeanInfo bif = Introspector.getBeanInfo(clazz);
//
// PropertyDescriptor[] pds = bif.getPropertyDescriptors();
// if (rs.next()) {
// obj = clazz.newInstance();
// for (PropertyDescriptor pd : pds) {
//
// // 得到所有属性名称
// String name = pd.getName();
// System.out.println(name);
// // 得到所有属性对应的set方法
// Method setMethod = pd.getWriteMethod();
// if (setMethod != null) { // 就可以将class对应的写方法去掉
//
// setMethod.invoke(obj, rs.getObject(name));
// }
// }
//
// }
//
// } catch (IntrospectionException e) {
// e.printStackTrace();
// } catch (InstantiationException e) {
// e.printStackTrace();
// } catch (IllegalAccessException e) {
// e.printStackTrace();
// } catch (IllegalArgumentException e) {
// // TODO Auto-generated catch block
// e.printStackTrace();
// } catch (InvocationTargetException e) {
// // TODO Auto-generated catch block
// e.printStackTrace();
// }
//
// return obj;
// }
}
day19_2
代码说明。登录成功后,访问到一个页面success.jsp,在页面上添加一个连接,就是客户信息的CRUD操作。
1.客户信息
字段名 | 说明 | 类型 |
---|---|---|
Id | 编号 | varchar(40) |
name | 客户姓名 | varchar(20) |
gender | 性别 | varchar(10) |
birthday | 生日 | date |
cellphone | 手机 | varchar(20) |
电子邮件 | varchar(40) | |
preference | 客户爱好 | varchar(100) |
type | 客户类型 | varchar(40) |
description | 备注 | varchar(255) |
create table customer(
id varchar(40) primary key,
name varchar(20),
gender varchar(10),
birthday date,
cellphone varchar(20),
email varchar(40),
preference varchar(100),
type varchar(40),
description varchar(255)
);
2.搭建环境
应用的jar文件
编写代码:
private String id;
private String name;
private String gender;
private Date birthday;
private String cellphone;
private String email;
private String preference;
private String type;
private String description;
insert into customer values("a11","tom","男","2010-10-10","13888888888","[email protected]","吃,喝,玩","vip","good man");
insert into customer values("a11","fox","男","2000-10-10","13888888888","[email protected]","吃,喝,玩","vip","good man");
insert into customer values("a11","james","男","1990-10-10","13888888888","[email protected]","吃,喝,玩","vip","good man");
查看所有客户信息
List
。 <c:forEach items="${cs}" var="c">
<tr>
<td><input type="checkbox">
td>
<td>${c.id }td>
<td>${c.name}td>
<td>${c.gender }td>
<td>${c.birthday }td>
<td>${c.cellphone }td>
<td>${c.email }td>
<td>${c.preference }td>
<td>${c.type }td>
<td>${c.description }td>
<td><a>编辑a> <a>删除a>td>
tr>
c:forEach>
编辑
request.setCharacterEncoding("utf-8");
new String(request.getParameter(name).getBytes("iso8859-1"),"utf-8");
public void update(Customer c) throws SQLException {
String sql = "update customer set name=?,gender=?,birthday=?,cellphone=?,email=?,preference=?,type=?,description=? where id=?";
QueryRunner runner = new QueryRunner(DataSourceUtils.getDataSource());
runner.update(sql, c.getName(), c.getGender(), c.getBirthday(),
c.getCellphone(), c.getEmail(), c.getPreference(), c.getType(),
c.getDescription(), c.getId());
}
修改完成后,在重新查询一次
response.sendRedirect(request.getContextPath() + "/findAll");
解决关于回显示时的问题:
<tag>
<name>sexname>
<tag-class>cn.itcast.customer.tag.GenderTagtag-class>
<body-content>emptybody-content>
<attribute>
<name>gendername>
<required>truerequired>
<rtexprvalue>truertexprvalue>
attribute>
tag>
* 3.在页面上使用
* 1.使用taglib导入
* 2.使用` `
"www.customer.com" appBase="D:\java1110\workspace\day19_2"
unpackWARs="true" autoDeploy="true">
"org.apache.catalina.valves.AccessLogValve" directory="logs"
prefix="localhost_access_log." suffix=".txt"
pattern="%h %l %u %t "%r" %s %b" />
"" docBase="D:\java1110\workspace\day19_2\WebRoot" />
</Host>