Java中JDBC的常见封装
来源:互联网 发布:淘宝怎么看以前的评价 编辑:程序博客网 时间:2024/05/17 15:58
ThreadLocal
ThreadLocal API
ThreadLocal类只有三个方法:
l void set(T value):保存值;
l T get():获取值;
l void remove():移除值。
key
value
thread1
aaa
thread2
bbb
thread3
ccc
ThreadLocal的内部是Map
ThreadLocal内部其实是个Map来保存数据。虽然在使用ThreadLocal时只给出了值,没有给出键,其实它内部使用了当前线程做为键。
class MyThreadLocal<T> {
private Map<Thread,T>map = new HashMap<Thread,T>();
publicvoid set(T value) {
map.put(Thread.currentThread(), value);
}
publicvoid remove() {
map.remove(Thread.currentThread());
}
public T get() {
returnmap.get(Thread.currentThread());
}
}
BaseServlet
BaseServlet的作用
在开始客户管理系统之前,我们先写一个工具类:BaseServlet。
我们知道,写一个项目可能会出现N多个Servlet,而且一般一个Servlet只有一个方法(doGet或doPost),如果项目大一些,那么Servlet的数量就会很多。
写一个BaseServlet。它的作用是让一个Servlet可以处理多种不同的请求。不同的请求调用Servlet的不同方法。我们写好了BaseServlet后,让其他Servlet继承BaseServlet,例如CustomerServlet继承BaseServlet,然后在CustomerServlet中提供add()、update()、delete()等方法,每个方法对应不同的请求。
BaseServlet分析
我们知道,Servlet中处理请求的方法是service()方法,这说明我们需要让service()方法去调用其他方法。例如调用add()、mod()、del()、all()等方法!具体调用哪个方法需要在请求中给出方法名称!然后service()方法通过方法名称来调用指定的方法。
无论是点击超链接,还是提交表单,请求中必须要有method参数,这个参数的值就是要请求的方法名称,这样BaseServlet的service()才能通过方法名称来调用目标方法。例如某个链接如下:
<a href=”/xxx/CustomerServlet?method=add”>添加客户</a>
BaseServlet代码
publicclass BaseServlet extends HttpServlet {
/*
* 它会根据请求中的m,来决定调用本类的哪个方法
*/
protectedvoid service(HttpServletRequest req, HttpServletResponse res)
throws ServletException, IOException {
req.setCharacterEncoding("UTF-8");
res.setContentType("text/html;charset=utf-8");
//例如:http://localhost:8080/demo1/xxx?method=add
String methodName = req.getParameter("method");//它是一个方法名称
//当没用指定要调用的方法时,那么默认请求的是execute()方法。
if(methodName ==null || methodName.isEmpty()) {
methodName = "execute";
}
Class c = this.getClass();
try {
// 通过方法名称获取方法的反射对象
Method m = c.getMethod(methodName, HttpServletRequest.class,
HttpServletResponse.class);
// 反射方法目标方法,也就是说,如果methodName为add,那么就调用add方法。
String result = (String) m.invoke(this, req, res);
// 通过返回值完成请求转发
if(result !=null && !result.isEmpty()) {
req.getRequestDispatcher(result).forward(req, res);
}
} catch (Exception e) {
thrownew ServletException(e);
}
}
}
DBUtils
DBUtils简介
DBUtils是Apache Commons组件中的一员,开源免费!
DBUtils是对JDBC的简单封装,但是它还是被很多公司使用!
DBUtils的Jar包:dbutils.jar
DBUtils主要类
l DbUtils:都是静态方法,一系列的close()方法;
l QueryRunner:
Ø update():执行insert、update、delete;
Ø query():执行select语句;
Ø batch():执行批处理。
QueryRunner之更新
QueryRunner的update()方法可以用来执行insert、update、delete语句。
1. 创建QueryRunner
构造器:QueryRunner();
2. update()方法
intupdate(Connection con, String sql, Object… params)
@Test
publicvoid fun1() throws SQLException {
QueryRunner qr = new QueryRunner();
String sql = "insert into user values(?,?,?)";
qr.update(JdbcUtils.getConnection(), sql,"u1", "zhangSan","123");
}
还有另一种方式来使用QueryRunner
1. 创建QueryRunner
构造器:QueryRunner(DataSource)
2. update()方法
intupdate(String sql, Object… params)
这种方式在创建QueryRunner时传递了连接池对象,那么在调用update()方法时就不用再传递Connection了。
@Test
publicvoid fun2() throws SQLException {
QueryRunner qr = new QueryRunner(JdbcUtils.getDataSource());
String sql = "insert into user values(?,?,?)";
qr.update(sql, "u1", "zhangSan", "123");
}
ResultSetHandler
执行select语句之后得到的是ResultSet,然后我们还需要对ResultSet进行转换,得到最终我们想要的数据。你可以希望把ResultSet的数据放到一个List中,也可能想把数据放到一个Map中,或是一个Bean中。
DBUtils提供了一个接口ResultSetHandler,它就是用来ResultSet转换成目标类型的工具。你可以自己去实现这个接口,把ResultSet转换成你想要的类型。
DBUtils提供了很多个ResultSetHandler接口的实现,这些实现已经基本够用了,我们通常不用自己去实现ResultSet接口。
l MapHandler:单行处理器!把结果集转换成Map<String,Object>,其中列名为键!
l MapListHandler:多行处理器!把结果集转换成List<Map<String,Object>>;
l BeanHandler:单行处理器!把结果集转换成Bean,该处理器需要Class参数,即Bean的类型;
l BeanListHandler:多行处理器!把结果集转换成List<Bean>;
l ColumnListHandler:多行单列处理器!把结果集转换成List<Object>,使用ColumnListHandler时需要指定某一列的名称或编号,例如:new ColumListHandler(“name”)表示把name列的数据放到List中。
l ScalarHandler:单行单列处理器!把结果集转换成Object。一般用于聚集查询,例如select count(*) from tab_student。
QueryRunner之查询
QueryRunner的查询方法是:
public<T> T query(String sql, ResultSetHandler<T> rh, Object… params)
public<T> T query(Connection con, String sql, ResultSetHandler<T> rh,Object… params)
query()方法会通过sql语句和params查询出ResultSet,然后通过rh把ResultSet转换成对应的类型再返回。
@Test
publicvoid fun1() throws SQLException {
DataSource ds = JdbcUtils.getDataSource();
QueryRunner qr = new QueryRunner(ds);
String sql = "select * from tab_student where number=?";
Map<String,Object> map = qr.query(sql,new MapHandler(), "d_2000");
System.out.println(map);
}
@Test
publicvoid fun2() throws SQLException {
DataSource ds = JdbcUtils.getDataSource();
QueryRunner qr = new QueryRunner(ds);
String sql = "select * from tab_student";
List<Map<String,Object>> list = qr.query(sql,new MapListHandler());
for(Map<String,Object> map : list) {
System.out.println(map);
}
}
@Test
publicvoid fun3() throws SQLException {
DataSource ds = JdbcUtils.getDataSource();
QueryRunner qr = new QueryRunner(ds);
String sql = "select * from tab_student where number=?";
Student stu = qr.query(sql, new BeanHandler<Student>(Student.class),"d_2000");
System.out.println(stu);
}
@Test
publicvoid fun4() throws SQLException {
DataSource ds = JdbcUtils.getDataSource();
QueryRunner qr = new QueryRunner(ds);
String sql = "select * from tab_student";
List<Student> list = qr.query(sql,new BeanListHandler<Student>(Student.class));
for(Student stu : list) {
System.out.println(stu);
}
}
@Test
publicvoid fun5() throws SQLException {
DataSource ds = JdbcUtils.getDataSource();
QueryRunner qr = new QueryRunner(ds);
String sql = "select * from tab_student";
List<Object> list = qr.query(sql,new ColumnListHandler("name"));
for(Object s : list) {
System.out.println(s);
}
}
@Test
publicvoid fun6() throws SQLException {
DataSource ds = JdbcUtils.getDataSource();
QueryRunner qr = new QueryRunner(ds);
String sql = "select count(*) from tab_student";
Number number = (Number)qr.query(sql,new ScalarHandler());
int cnt = number.intValue();
System.out.println(cnt);
}
QueryRunner之批处理
QueryRunner还提供了批处理方法:batch()。
我们更新一行记录时需要指定一个Object[]为参数,如果是批处理,那么就要指定Object[][]为参数了。即多个Object[]就是Object[][]了,其中每个Object[]对应一行记录:
@Test
publicvoid fun() throws SQLException {
DataSource ds = JdbcUtils.getDataSource();
QueryRunner qr = new QueryRunner(ds);
String sql = "insert into tab_student values(?,?,?,?)";
Object[][] params = new Object[10][];//表示要插入10行记录
for(int i = 0; i < params.length; i++) {
params[i] = new Object[]{"d_300" + i,"name" + i, 30 + i, i%2==0?"男":"女"};
}
qr.batch(sql, params);
}
- Java中JDBC的常见封装
- java中简单的db封装,jdbc
- JAVA-JDBC的封装
- Java中JDBC常见对象
- java的jdbc简单封装
- Java中JDBC连接,封装版
- JAVA中创建JDBC以及对jdbc的封装(数据库为mysql)
- Java jdbc mysql的封装类
- java jdbc封装
- Java JDBC封装模式
- Java 封装jdbc查询
- java jdbc 两层轻量封装
- [JAVA] Spring封装JDBC
- 2、Java应用中常见的JDBC连接字符串(SQLite、MySQL、Oracle、Sybase、SQLServer、DB2)
- JDBC的封装
- JDBC 的封装
- Jdbc的普通封装
- JDBC的封装类
- getHibernateTemplate.find()和session.createQuery()方法总结
- 38.To make audit information more productive, the DBA executes the following command before starting
- coreseek+php之sphinx扩展安装+php调用示例
- Linux下PHP+MySQL+CoreSeek中文检索引擎配置
- 如何在java程序中调用linux命令或者shell脚本
- Java中JDBC的常见封装
- Valid Sudoku
- Pool tag list
- 【整理】Linux下中文检索引擎coreseek4安装,以及PHP使用sphinx的三种方式(sphinxapi,sphinx的php扩展,SphinxSe作为mysql存储引擎)
- 初始化内存管理
- deepin安装vsftpd(仅配置篇--续--虚拟用户篇)
- 物理内存的管理
- slab分配器
- 处理器高速缓存和TLB控制