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

在dbutils中处理事务

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

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

如果需要在dbutils中管理事务。则用户必须自己传递并控制connection。
@Test
	public 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();
		}
	}


不确定条件的查询

// 不确定条件的查询
	@Test
	public 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);
			//将页数放到req
			req.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
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值