数据库操作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>

里面的注册 、登陆在上一篇已经提到了  所以这两篇可以合成一个项目 就是最上边显示的项目图。

最新文章

  1. git 指令
  2. [Java入门笔记] Java语言基础(三):运算符
  3. 通过innobackupex实现对MySQL的完整备份与还原
  4. js的原型链和constructor
  5. SQL1159 Initialization error with DB2 .NET Data Provider, reason code 7(问题补充)
  6. ShortestPath:Six Degrees of Cowvin Bacon(POJ 2139)
  7. 【Fibonacci】BestCoder #28B Fibonacci
  8. Android 常见adb命令
  9. (Java 多线程系列)java volatile详解
  10. 【NO.7】HTTP请求-参数化
  11. Java子类实例化的过程
  12. RAC(ReactiveCocoa)介绍(一)
  13. 剑指Offer 65. 矩阵中的路径 (回溯)
  14. Linux 常用命令笔记-2
  15. C# 操作符 &lt;&lt; 与 &gt;&gt;
  16. Deep learning with Python 学习笔记(9)
  17. Debian &amp; CentOS建立本地iso源
  18. Vue:Vue2.0搭建脚手架
  19. MySQL transaction
  20. const与常量,傻傻分不清楚~

热门文章

  1. Eight HDU-1043 (bfs)
  2. Python3.7.4入门-5输入输出
  3. saltstack+python批量修改服务器密码
  4. scorllview嵌套gridview和listview的兼容问题
  5. iOS9 CASpringAnimation 弹簧动画详解
  6. SDUT-2498_AOE网上的关键路径
  7. 2019-4-10-VisualStudio-2019-尝试使用-C#-8.0-新的方式
  8. Python与Java异常类层级区别
  9. python 逗号分隔值文件的操作
  10. Linux下如何切换用户