html(四)数据库curd操作与分页查询
数据库操作curd :
1.首先要建立项目处理好自己逻辑包:
其中util工具包中建立两个工具类 jdbc连接和page分页
DBUtil.java:
db工具类就是用于连接数据库的jdbc架包,里面是curd的实现。
package com.etc.utils; import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException; import javax.sql.rowset.CachedRowSet; import com.sun.rowset.CachedRowSetImpl; /**
* 数据库访问的通用类
*
* @author Administrator
*
*/
public class DBUtil {
private final static String URL = "jdbc:mysql://localhost/day07";
private final static String USER = "root";
private final static String PASSWORD = "123456";
private final static String DRIVER = "com.mysql.jdbc.Driver"; /**
* 定义方法返回一个连接(Connection)对象
*
* @return 返回值就是一个连接对象
*/
private static Connection getConnection() {
Connection conn = null;
try {
Class.forName(DRIVER);
conn = DriverManager.getConnection(URL, USER, PASSWORD);
} catch (ClassNotFoundException e) {
e.printStackTrace();
} // 低版本的jdbc jar包
catch (SQLException e) {
e.printStackTrace();
}
return conn;
} /**
* 一个方法来做增加删除和修改
*
* @param sql 要执行的sql
* @param param 执行的sql中包含的参数的实际值
* @return int 表示的是受影响的行
*/
public static int execUpdate(String sql, Object... param) {
Connection conn = getConnection();
PreparedStatement pstmt = null;
int result = 0;
try {
pstmt = conn.prepareStatement(sql);
for (int i = 0; i < param.length; i++) {
pstmt.setObject(i + 1, param[i]);
}
result = pstmt.executeUpdate();
} catch (SQLException e) {
e.printStackTrace();
} finally {
closeAll(null, pstmt, conn);
}
return result;
} /**
* 一个方法来做查询
*
* @param sql 要执行查询的sql语句
* @param param 要执行sql对应的参数
* @return CachedRowSet 缓存的结果集
*/
public static CachedRowSet execQuery(String sql, Object... param) {
Connection conn = getConnection();
PreparedStatement pstmt = null;
ResultSet rs = null;
// 实例化CachedRowSetImpl
CachedRowSetImpl crs = null;
try {
crs = new CachedRowSetImpl();
pstmt = conn.prepareStatement(sql);
// 可以吧param当成是一个数组
System.out.println(param.length); for (int i = 0; i < param.length; i++) {
pstmt.setObject(i + 1, param[i]);
}
rs = pstmt.executeQuery();
// 建立rs和crs关系,可以将rs的数据行缓存到crs中了
crs.populate(rs);
} catch (SQLException e) {
e.printStackTrace();
} finally {
// 释放资源等 此处代码省略
closeAll(rs, pstmt, conn);
}
return crs;
} /**
* 释放资源
*
* @param rs 结果集兑现
* @param pstmt 预处理语句对象
* @param conn 连接对象
*/
private static void closeAll(ResultSet rs, PreparedStatement pstmt, Connection conn) {
try {
if (rs != null)
rs.close();
} catch (SQLException e) {
e.printStackTrace();
}
try {
if (pstmt != null)
pstmt.close();
} catch (SQLException e) {
e.printStackTrace();
}
try {
if (conn != null)
conn.close();
} catch (SQLException e) {
e.printStackTrace();
}
} }
Page.java:
通过字段分页的总页数、总数、页面显示数、所有数据集合来实例化实现分页显示。
package com.etc.utils; import java.util.ArrayList;
import java.util.List; public class Page<T> {
// 总页数
private int totalPageCount = 1;
// 页面大小,即每页显示记录数
private int pageSize = 10;
// 记录总数
private int totalCount = 0;
// 当前页码
private int currPageNo = 1;
// 每页集合
List<T> list = new ArrayList<>(); public int getTotalPageCount() {
return totalPageCount;
}
public void setTotalPageCount(int totalPageCount) {
this.totalPageCount = totalPageCount;
}
public int getPageSize() {
return pageSize;
}
public void setPageSize(int pageSize) {
this.pageSize = pageSize;
}
public int getTotalCount() {
return totalCount;
}
public void setTotalCount(int totalCount) {
this.totalCount = totalCount;
}
public int getCurrPageNo() {
return currPageNo;
}
public void setCurrPageNo(int currPageNo) {
this.currPageNo = currPageNo;
}
public List<T> getList() {
return list;
}
public void setList(List<T> list) {
this.list = list;
} }
User.java:
实现包 entityr User就是普通的user类定义了查询用户的id,username,password 根据自己数据库的表建立相对应的自段。
package com.etc.entity; public class User {
private int uid=0;
private String username;
private String password; public User(int uid, String username, String password) {
super();
this.uid = uid;
this.username = username;
this.password = password;
} public User() {
super();
} public int getUid() {
return uid;
} public void setUid(int uid) {
this.uid = uid;
} public String getUsername() {
return username;
} public void setUsername(String username) {
this.username = username;
} public String getPassword() {
return password;
} public void setPassword(String password) {
this.password = password;
} }
数据库设计:
2.建立最重要的DAO层(数据访问层):
因为传入的是User类 所以值都是user.get方法来获取界面传入的值:
DBUtil.execUpdate("insert into t_user(username,password) values(?,?)", user.getUsername(), user.getPassword());
登陆时需要验证账号密码是否正确,此时需要对数据库的数据进行验证,如果正确返回user对象,不正确则返回null:
UserDao:
package com.etc.dao; import java.sql.SQLException; import javax.sql.rowset.CachedRowSet; import com.etc.entity.User;
import com.etc.utils.DBUtil;
import com.etc.utils.Page; public class UserDao {
//设置注册实现
public void reg(User user) {
//通过工具类DBUtil的execUpdate方法,传入sql和值(username,password)
DBUtil.execUpdate("insert into t_user(username,password) values(?,?)", user.getUsername(), user.getPassword());
}
//设置登陆实现
public User login(String username, String password) {
//传入你登陆要验证的账号密码,此时会通过sql语句来通过账号密码来判断是否存在 存在就继续向下执行 不存在就返回null
CachedRowSet rowSet = DBUtil.execQuery("select * from t_user where username=? and password=?", username,
password);
try {
//循环获取值 直到账号密码全部一致
while (rowSet.next()) {
//获取数据库的uid,username,password
int uid = rowSet.getInt("uid");
String username2 = rowSet.getString("username");
String password2 = rowSet.getString("password");
//将值传入新实例化的user对象中
User user = new User(uid, username2, password2);
//返回user对象
return user;
}
} catch (SQLException e) {
e.printStackTrace();
}
return null;
}
//分页显示数据
public Page<User> queryByPage(Page<User> page) {
///通过sql语句 count(1)计算数据中所有的所有数据总数
CachedRowSet rowSet = DBUtil.execQuery("select count(1) from t_user");
try {
//获取查询出来的总数
while (rowSet.next()) {
//sql中默认将第一个值设置为第一列
int total = rowSet.getInt(1);
//将总数传入page中
page.setTotalCount(total);
}
} catch (SQLException e) {
e.printStackTrace();
}
//通过sql语句限制查询的每页的数量 ( limit ?,? )方法
//传入的值 (page.getCurrPageNo()-1)*page.getPageSize() , page.getPageSize()
// (页数-1) * 显示的数量
CachedRowSet rowSet2 = DBUtil.execQuery("select * from t_user limit ?,?", (page.getCurrPageNo()-1)*page.getPageSize(),page.getPageSize()); try {
//循环遍历
while (rowSet2.next()) {
int uid = rowSet2.getInt("uid");
String username2 = rowSet2.getString("username");
String password2 = rowSet2.getString("password");
User user = new User(uid, username2, password2);
//在page中的集合添加每个页面显示的值
page.getList().add(user);
}
} catch (SQLException e) {
e.printStackTrace();
}
return page;
}
}
main.jsp:
<%@page import="com.etc.entity.User"%>
<%@page import="com.etc.utils.Page"%>
<%@page import="com.etc.dao.UserDao"%>
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>
<%
//实例化一个usredao和page才能使用其方法
UserDao userDao = new UserDao();
Page<User> pa = new Page<>(); //获取页面默认返回值pageNo
String pageNo = request.getParameter("pageNo"); //如果第一次登陆或者没登陆时 将显示的页面设为1
if (pageNo == null || "".equals(pageNo)) {
pa.setCurrPageNo(1); } else {
//如果不是第一次登陆 设置显示的值为你选择的值
pa.setCurrPageNo(Integer.valueOf(pageNo));
} //将page传入dao中
userDao.queryByPage(pa); //循环遍历分页集合中的值
for (User u : pa.getList()) {
out.print(u.getUid() + "," + u.getUsername() + "," + u.getPassword() + "<br>");
}
%> 当前第<%=pa.getCurrPageNo()%>页
<br>
<%--将页面默认返回pageNo设置为pa.getCurrPageNo() - 1来设为当前页面的页面数
从而传给userdao 来获取当前页数 计算需要遍历的行数为 0-10还是10-20 --%>
<a href="?pageNo=<%=pa.getCurrPageNo() - 1%>">上一页</a>
<a href="?pageNo=<%=pa.getCurrPageNo() + 1%>">下一页</a>
</body>
</html>
里面的注册 、登陆在上一篇已经提到了 所以这两篇可以合成一个项目 就是最上边显示的项目图。
html(四)数据库curd操作与分页查询的更多相关文章
- Laravel框架数据库CURD操作、连贯操作使用方法
Laravel框架数据库CURD操作.连贯如何来操作了这个操作性是非常的方便简单了我们在这里来为各位介绍一篇相关的教程,具体的细节步骤如下文介绍. Laravel是一套简洁.优雅的PHP Web开 ...
- Laravel框架数据库CURD操作、连贯操作
这篇文章主要介绍了Laravel框架数据库CURD操作.连贯操作.链式操作总结,本文包含大量数据库操作常用方法,需要的朋友可以参考下 一.Selects 检索表中的所有行 $users = DB::t ...
- Laravel框架数据库CURD操作、连贯操作总结
这篇文章主要介绍了Laravel框架数据库CURD操作.连贯操作.链式操作总结,本文包含大量数据库操作常用方法,需要的朋友可以参考下 一.Selects 检索表中的所有行 复制代码代码如下: $use ...
- Laravel框架中的数据库CURD操作、连贯操作、链式操作的用法
Laravel是一套简洁.优雅的PHP Web开发框架(PHP Web Framework).它可以让你从面条一样杂乱的代码中解脱出来:它可以帮你构建一个完美的网络APP,而且每行代码都可以简洁.富于 ...
- .net使用SqlBulkCopy类操作DataTable批量插入数据库数据,然后分页查询坑
在使用SqlBulkCopy类操作DataTable批量插入数据,这种操作插入数据的效率很高,就会导致每一条数据在保存的时间基本一样,在我们分页查询添加的数据是,使用数据的添加时间来排序就会出现每页的 ...
- Php mysql 常用代码、CURD操作以及简单查询
C/S:Client ServerB/S:Brower Server php主要实现B/S LAMP :Linux系统 A阿帕奇服务器 Mysql数据库 Php语言 mysql常用代码 ...
- 用Java实现异构数据库的高效通用分页查询功能
不同数据库的分页查询语句有着较大区别,其中MySQL数据的limit offset语法最为简单,而SQL Server数据库和Oracle数据库的分页就比较复杂了. 网上常见的SQL Server和O ...
- sql分页查询(2005以后的数据库)和access分页查询
sql分页查询: select * from ( select ROW_NUMBER() over(order by 排序条件) as rowNumber,* from [表名] where 条件 ) ...
- 四种方式实现SQLServer 分页查询
SQLServer 的数据分页: 假设现在有这样的一张表:CREATE TABLE test( id int primary key not null identity, names varchar( ...
随机推荐
- TypeScript类型检查机制
类型推断 指不需要指定变量的类型,TS编译器可以根据某些规则自动推断出类型. 什么时候会有类型推断? 声明变量时没有指定类型 函数默认参数 函数返回值 ...... let a; // 这时自动推断为 ...
- jQuery ajax请求struts action实现异步刷新
第一步:导入相关jar包,本样例需导入struts相关jar包,json-lib.jar,gson-2.1.jar可以任意选择,但是这里需要都导入,因为为了做测试,两种jar包的转换方式都用到了. 第 ...
- vsync信号产生与分发
以下分析基于android 4.4代码 vsync信号的产生.分发涉及到以下几个类,先主要了解下他们各自的功能: HWComposer:产生hardware vsync,post fb VSyncTh ...
- Leetcode812.Largest Triangle Area最大三角形面积
给定包含多个点的集合,从其中取三个点组成三角形,返回能组成的最大三角形的面积. 示例: 输入: points = [[0,0],[0,1],[1,0],[0,2],[2,0]] 输出: 2 解释: 这 ...
- 网络流24题 餐巾计划(DCOJ8008)
题目描述 一个餐厅在相继的 n nn 天里,每天需用的餐巾数不尽相同.假设第 i ii 天需要 ri r_iri 块餐巾.餐厅可以购买新的餐巾,每块餐巾的费用为 P PP 分:或者把旧餐巾送到快 ...
- Servlet接口
ServletRequest接口 ServletRequest的对象用于向Servlet提供客户端请求信息,如内容类型,内容长度,参数名称和值,标题信息,属性等. RequestDispatcher接 ...
- [React Native] 解析JSON文件
在编写代码时,开发者有时需要存储一些比较多,在应用程序运行时不需要更改的数据.文件大不便于写在代码中,可以把这些数据存储到JSON文件中. 优点非常明显: 1. 数据存放在单独的文件中,代码精简有条理 ...
- 谷歌好样的,把 www 也干掉了
谷歌好样的,把 www 也干掉了 继把 http 干掉后,这次 Chrome 76 连 https 和 www 都一起干掉了. 喜欢简洁,但这个功能演化过程可不简单. 最早觉得把 http 干掉很不方 ...
- thinkphp5.0 路由规则配置
开启路由‘url_route_on’ => true 首页路由'/' =>'home/index/index' 其它路由(1)'route' => 'home/index/route ...
- python 文本文件的读取