在dbutils中处理事务
事务是指用户的一次操作。这一次操作有可能是一个表,也有可能是多个表,也有可能是对一个表的多次操作。
只要是:
1:对数据数据库进行多次操作。
2:多个表,还是一个表的多次update,detelete,inset都应该开始一个事务。
如果仅做一次与数据库的操作。即只执行一个sql语句,则可以不用开事务。
如果仅做select 则没有必要开事务。
事务是指用户的一次操作,这一次操作,只能有一个结果,要不然就全部成功,要不然就全部不成功。
如果需要在dbutils中管理事务。则用户必须自己传递并控制connection。
只要是:
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 :一共需要多少行。
SELECT * FROM users LIMIT 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);
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);
|
|
|