数据库操作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操作与分页查询的更多相关文章

  1. Laravel框架数据库CURD操作、连贯操作使用方法

    Laravel框架数据库CURD操作.连贯如何来操作了这个操作性是非常的方便简单了我们在这里来为各位介绍一篇相关的教程,具体的细节步骤如下文介绍.   Laravel是一套简洁.优雅的PHP Web开 ...

  2. Laravel框架数据库CURD操作、连贯操作

    这篇文章主要介绍了Laravel框架数据库CURD操作.连贯操作.链式操作总结,本文包含大量数据库操作常用方法,需要的朋友可以参考下 一.Selects 检索表中的所有行 $users = DB::t ...

  3. Laravel框架数据库CURD操作、连贯操作总结

    这篇文章主要介绍了Laravel框架数据库CURD操作.连贯操作.链式操作总结,本文包含大量数据库操作常用方法,需要的朋友可以参考下 一.Selects 检索表中的所有行 复制代码代码如下: $use ...

  4. Laravel框架中的数据库CURD操作、连贯操作、链式操作的用法

    Laravel是一套简洁.优雅的PHP Web开发框架(PHP Web Framework).它可以让你从面条一样杂乱的代码中解脱出来:它可以帮你构建一个完美的网络APP,而且每行代码都可以简洁.富于 ...

  5. .net使用SqlBulkCopy类操作DataTable批量插入数据库数据,然后分页查询坑

    在使用SqlBulkCopy类操作DataTable批量插入数据,这种操作插入数据的效率很高,就会导致每一条数据在保存的时间基本一样,在我们分页查询添加的数据是,使用数据的添加时间来排序就会出现每页的 ...

  6. Php mysql 常用代码、CURD操作以及简单查询

    C/S:Client ServerB/S:Brower Server php主要实现B/S LAMP :Linux系统    A阿帕奇服务器    Mysql数据库   Php语言 mysql常用代码 ...

  7. 用Java实现异构数据库的高效通用分页查询功能

    不同数据库的分页查询语句有着较大区别,其中MySQL数据的limit offset语法最为简单,而SQL Server数据库和Oracle数据库的分页就比较复杂了. 网上常见的SQL Server和O ...

  8. sql分页查询(2005以后的数据库)和access分页查询

    sql分页查询: select * from ( select ROW_NUMBER() over(order by 排序条件) as rowNumber,* from [表名] where 条件 ) ...

  9. 四种方式实现SQLServer 分页查询

    SQLServer 的数据分页: 假设现在有这样的一张表:CREATE TABLE test( id int primary key not null identity, names varchar( ...

随机推荐

  1. Leetcode868.Binary Gap二进制间距

    给定一个正整数 N,找到并返回 N 的二进制表示中两个连续的 1 之间的最长距离. 如果没有两个连续的 1,返回 0 . 示例 1: 输入:22 输出:2 解释: 22 的二进制是 0b10110 . ...

  2. CodePlus2017 12月月赛 div2火锅盛宴

    当时看到这道题感觉真是难过,我数据结构太弱啦. 我们来看看需要求什么: 1.当前熟了的食物的最小id 2.当前熟了的食物中有没有编号为id的食物 3.当前没熟的食物中有没有编号为id的食物 4.当前没 ...

  3. 想要快速完成一个Python项目,离不开这些开源库

    链接:https://opensource.com/article/18/9/python-libraries-side-projects 在Python / Django世界中有一句话:我们为语言而 ...

  4. tftp-server服务器搭建

    学习搭建TFTP服务器(步骤来于网上) 以contos6.5为例 执行下面的命令能够看到服务是否已经启动,若已经启动则不用安装,否则需要安装下面的步骤安装tftp-server服务器 netstat ...

  5. pl/sql基础知识—定义并使用变量

    n  介绍 在编写pl/sql程序是,可以定义变量和常量:在pl/sql程序中包括有: ①标量类型(scalar) ②复合类型(composite) ③参照类型(reference) ④lob(lar ...

  6. 从程序员的角度分析微信小程序

    昨天朋友圈被微信小程序刷爆了. 我赶快在书架上拿出三年前买的书,把上面的土擦干净,压压惊. 作为一个并不是资深的程序员. 从程序员的角度分析一下微信小程序,欢迎指点. 首先吐槽 微信小程序只发了200 ...

  7. 【Django入坑之路】基础操作(过滤,继承,跳转)

    1:自定过滤器 1创建templatetags文件夹 2在里面创建自定义py文件:固定格式: from django import template from django.utils.safestr ...

  8. APP上线前,如何做运营推广工作?

    http://www.cocoachina.com/market/20150723/12731.html 一 竞品分析 1.选择竞品,做好定位(选择两个产品最好,最多三个). 如何获取竞品? A 百度 ...

  9. phpcms url路由规则、多站点、PC手机切换

    解决一个分站点pc手机共存的问题 首先需要有PC手机两套模板.通过修改url路由规则,在同一目录下生成PC手机两套静态网站,PC使用默认url路由规则,手机端使用文件名追加“_m”的路由规则. 然后通 ...

  10. Python中的简单实现UDP协议没有粘包问题

    服务端: import socket server=socket.socket(socket.AF_INET,socket.SOCK_DGRAM) #数据报协议->udp server.bind ...