数据库连接池-DBUtils高级 事务+不确定条件查询+分页

来源:互联网 发布:知乎怎么更新答案 编辑:程序博客网 时间:2024/05/22 09:21

在dbutils中处理事务

事务是指用户的一次操作。这一次操作有可能是一个表,也有可能是多个表,也有可能是对一个表的多次操作。
只要是:
1:对数据数据库进行多次操作。
2:多个表,还是一个表的多次update,detelete,inset都应该开始一个事务。

如果仅做一次与数据库的操作。即只执行一个sql语句,则可以不用开事务。
如果仅做select 则没有必要开事务。
事务是指用户的一次操作,这一次操作,只能有一个结果,要不然就全部成功,要不然就全部不成功。

如果需要在dbutils中管理事务。则用户必须自己传递并控制connection。
@Testpublic void tx1() throws Exception {QueryRunner run = new QueryRunner(DataSourceUtils.getDatasSource());Connection con = DataSourceUtils.getConn();try {String sql = "insert into users values('U008','AA','AA')";// 设置事务的开始标记con.setAutoCommit(false);run.update(con, sql);String sql2 = "insert into users values('U009,'AA','AA')";run.update(con, sql2);// 提交con.commit();} catch (Exception e) {System.err.println("出错了");con.rollback();} finally {con.close();}}


不确定条件的查询

// 不确定条件的查询@Testpublic void query1() throws Exception {QueryRunner run = new QueryRunner(DataSourceUtils.getDatasSource());Contact c = new Contact();// c.setId("C001");c.setName("王'");c.setSex("1");c.setTel("123");c.setAddr("中国");c.setAge(55);String sql = "select * from contacts where 1=1";List<Object> params = new ArrayList<Object>();if (c.getId() != null) {sql += " and id=?";params.add(c.getId());}if (c.getSex() != null) {sql = sql + " and sex=?";params.add(c.getSex());}if (c.getName() != null) {sql += " and name like ?";params.add("%" + c.getName() + "%");}if (c.getAddr() != null) {sql += " and addr like ?";params.add("%" + c.getAddr() + "%");}if (c.getTel() != null) {sql += " and tel like ?";params.add("%" + c.getTel() + "%");}if (c.getAge() != null) {sql += " and age=?";params.add(c.getAge());}System.err.println(">>>>>>:" + sql);System.err.println(params);List<Contact> cs = run.query(sql, new BeanListHandler<Contact>(Contact.class), params.toArray());for (Contact cc : cs) {System.err.println(cc);}}


分页

有一个limit关键字可以查询指定的行数:
Limit start,limit
Start :从第几行以后开始的行号。>start
Limit :一共需要多少行。

第一步:向usre表中写入100行数据



第二步:先在sqlyog中用select做一个分页的分析


SELECT * FROM users LIMIT 10,10;

第三步:分析一共显示多少页

自己确定每一页显示几行:10行
pageSize = 10;
计算确定数据表一共分几页:
101/pageSize=100/10=10页。
rows = select count(1) from users;
方法1:pageCount = rows/pageSize + (rows%pageSize==0?0:1);
方法2:pageCount = (rows+ (pageSize-1))/(pageSize);

计算确定数据表一共分几页:101/pageSize=100/10=10页。rows = select count(1) from users;方法1:pageCount = rows/pageSize + (rows%pageSize==0?0:1);  方法2:pageCount = (rows+ (pageSize-1))/(pageSize);public void doGet(HttpServletRequest req, HttpServletResponse response)throws ServletException, IOException {//第一步:定义每页显示多少行int pageSize = 10;try{//第二步:获取数据表中有多少行QueryRunner run = new QueryRunner(DataSourceUtils.getDatasSource());String sql = "select count(*) from users";Object o = run.query(sql,new ScalarHandler());int rows = Integer.parseInt(o.toString());//第三步:计算一共分多少页int pageCount= rows/pageSize+(rows%pageSize==0?0:1);//将页数放到reqreq.setAttribute("pageCount",pageCount);}catch(Exception e){e.printStackTrace();}//转发到req.getRequestDispatcher("/jsps/show.jsp").forward(req, response);}

第四步:分析limit的开始位置

用户请求的面码

start

算法:

1

Limit 0,pageSize

Start

= (currentPage-1)*pageSize

2

Limit 10,pageSize

3

Limit 20,pageSize

 

第五步:对分页以后页码再分页

       每个页面,最多显示10个页码

       pageNum=10;

startNo

endNo

 

当前页码

页码范围

算法

1

1~10

If(currentPage<=pageNum/2)

  1~10

2

 

3

 

4

 

5

 

6

2~11

6-4=2 =

6-(pageNum/2-1)=2 = startNo

endNo = startNo+(pageNum-1)=11

7

3~12

8

4~13

9

 

 

10

 

 

11

 

11-4 = 7

endNo = 7+9=16

endNo = 11;

startNo = 2 = endNo-(pageNum-1);

 

 

 

 

 

 

 

 

 

 


0 0
原创粉丝点击