终于接触到了传说中的分页程序

MySQL安装配置与分页技术
今天所讲的知识点
A MySql的安装与配置
B MySql的使用常识
C MySql的常用命令
D 假分页
E 真分页
F 分页组件

我对知识点的分析
A MySql的安装与配置
1、禁用防火墙等
2、选择自定义安装,以修改安装路径

3、跳过注册

4、完成安装,选择配置

5、详细设置


5、配置数据库安装路径,选择默认。

6、选择MySQL数据库的端口号,默认为3306

7、选择数据库默认编码,修改的编码要与Java项目中使用的编码一致,否则会出现乱码

8、设置服务名称,配置环境变量

9、配置root用户的密码

10、测试

表示配置成功,数据库可以使用。

B MySql的使用常识
一、启动MySQL服务
1、 在 服务 中直接启动
2、 在cmd中输入 net start mysql(此命令有效的前提,path变量中有net命令的目录“c:/windows/system32;”)

二、进入MySql数据库(如同Oracle进入到scott用户下)
1、在cmd中输入(此命令有效的前提,path变量中有MySql安装目录的bin目录)
mysql -uroot –pmysqladmin :-u后跟用户名,注意没有空格、-p后跟密码
2、在开始菜单中选择MySQL命令行,打开后,输入密码也可以进入MySQL数据库

三、修改编码
修改MySQL安装目录下的my.ini文件的两个默认编码配置
default-character-set=gbk

四、修改端口号
在my.ini文件中还可以修改端口号

注意:修改后需要重新启动MySQL服务,并需要将之前自行建立的数据库删除重新建立

C MySql的常用命令
1、显示某用户下的所有数据库:show databases;
提示说明:information_schema、mysql两个数据库为MySQL系统数据库,绝对不允许手工配置或修改。
2、创建数据库:create database 数据库名;
3、删除数据库:drop database数据库名;
4、使用数据库:use 数据库名;
5、显示当前数据库下的所有表:show tables;
6、数据库的CRUD语句与Oracle基本一致,但不需要进行commit提交,MySQL默认自动提交(C:Create,R:Read,U:Update,D:Delete)
常用字段类型:
int、double、varchar(xx)、date、datetime(包含时间)、text(保存大文本)
约束与自动增长:
check、primary key 、foreign key等约束与Oracle语法相同,
auto_increment:在MySQL中在某字段后面加auto_increment标记,表示该列自动增长,一般加入到主键字段中。
插入数据时,不要将自动增长列加入到插入语句中,该列值自动增长。

不同的是:MySql可以使用一条语句插入多条数据
INSERT INTO 表名称 (字段名列表) VALUES (第一条记录值),( 第二条记录值)…..;
多条记录中间使用 , 分隔

7、读入SQL脚本:
source 路径+文件名
例如:source d:/test.sql 读入并执行d:/test.sql文件中的sql语句

8、取得当前日期:
select sysdate();或select now();:均为取得当前系统时间,且包含日期与时间

D 假分页
1、特点
a)不是在数据库中进行查询分页,而是将所有数据查询出来,在页面进行分页显示处理。
b)该方法查询效率比较低,但是容易进行数据库移植,但是实际开发中基本不使用假分页
固定代码
conn.jsp

<%@ page language="java" import="java.sql.*" pageEncoding="UTF-8"%>
<%
//如果直接打开的是此页面,使得转向登录页面,但这样做以后,此页面就不能作为请求页面了,只能作为包含页面
if(request.getRequestURL().toString().contains("login_head.jsp")){
response.sendRedirect(request.getContextPath()+"/login.jsp");
}
%>

<%!
final String DBDRIVER="oracle.jdbc.driver.OracleDriver";
final String DBURL="jdbc:oracle:thin:@localhost:1521:mldn";
final String DBUSER="scott";
final String DBPASS="tiger";
%>
<%
//加载数据库驱动
Class.forName(DBDRIVER);
//连接数据库
Connection conn=DriverManager.getConnection(DBURL,DBUSER,DBPASS);
//生成数据库操作对象prmt
PreparedStatement prmt=null;
%>


list.jsp

<%@ page language="java" pageEncoding="UTF-8"%>
<%@ page import="java.util.*" %>
<%@ page import="java.text.*" %>
<%
String path = request.getContextPath();
String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
%>

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<base href="<%=basePath%>">

<title>My JSP 'index.jsp' starting page</title>
<meta http-equiv="pragma" content="no-cache">
<meta http-equiv="cache-control" content="no-cache">
<meta http-equiv="expires" content="0">
<meta http-equiv="keywords" content="keyword1,keyword2,keyword3">
<meta http-equiv="description" content="This is my page">
<!--
<link rel="stylesheet" type="text/css" href="styles.css">
-->
<script type="text/javascript">
function changeCp(cp) {
// 修改表单中的cp值,并提交表单
document.split_form.cp.value = cp ;
document.split_form.submit();
}
function changeLs(ls) {
// 修改表单中的ls值,并提交表单
document.split_form.ls.value = ls ;
// 将cp的值改回1,防止出现显示记录不存在的问题
document.split_form.cp.value = 1;
document.split_form.submit();
}
</script>
</head>

<body>
<center>
<%@ include file="conn.jsp" %>
<%
String sql = "SELECT * FROM emp" ;
prmt = conn.prepareStatement(sql);
ResultSet rs = prmt.executeQuery();
// 转换日期的显示格式
SimpleDateFormat sf = new SimpleDateFormat("yyyy年MM月dd日");
%>
<table border="1" width="80%">
<tr>
<td>雇员编号</td>
<td>雇员姓名</td>
<td>工作</td>
<td>领导编号</td>
<td>雇佣时间</td>
<td>薪金</td>
<td>奖金</td>
<td>部门编号</td>
</tr>
<%
// 保存当前循环到第X条记录
int count = 0;
// 定义页数
int cp = 1;
// 定义每页显示记录数
int ls = 5 ;
// 定义每页显示记录数的选择数组
int[] allLs = {2,5,10,20};
try{
// 接收传递的cp值,当第一次进入页面时,会进入到 catch部分,则cp值会按照默认的1来进行处理。
cp = Integer.parseInt(request.getParameter("cp")) ;
// 接收传递的ls值
ls = Integer.parseInt(request.getParameter("ls")) ;
} catch (NumberFormatException e) {}

while(rs.next()) {
count++;
//控制当前页显示的记录范围
if (count <= (cp * ls) && count > (cp - 1) * ls) {
%>
<tr>
<td><%=rs.getInt(1) %></td>
<td><%=rs.getString(2) %></td>
<td><%=rs.getString(3) %></td>
<td><%=rs.getInt(4) %></td>
<td><%=sf.format(rs.getDate(5)) %></td>
<td><%=rs.getDouble(6) %></td>
<td><%=rs.getDouble(7) %></td>
<td><%=rs.getInt(8)%></td>
</tr>
<%
}
}
// 计算总页数
int allPage = (count - 1) / ls + 1 ;
%>
</table>
<br>
<input type="button" value="首页" <%=cp==1?"disabled":"" %> onClick="changeCp(1);">
<input type="button" value="上一页" <%=cp==1?"disabled":"" %> onClick="changeCp(<%=cp-1 %>);">
<input type="button" value="下一页" <%=cp==allPage?"disabled":"" %> onClick="changeCp(<%=cp+1 %>);">
<input type="button" value="尾页" <%=cp==allPage?"disabled":"" %> onClick="changeCp(<%=allPage %>);">

跳转到 第 <select name="mycp" onchange="changeCp(this.value)">
<%
for (int i = 1; i <= allPage ;i++) {
%>
<option value="<%=i %>" <%=i==cp?"selected":"" %>><%=i %></option>
<%
}
%>
</select> 页

每页显示 <select name="myls" onchange="changeLs(this.value)">
<%
for (int i = 0;i < allLs.length;i++) {
%>
<option value="<%=allLs[i] %>" <%=ls == allLs[i]?"selected":"" %>><%=allLs[i] %></option>
<%
}
%>
</select>

<!-- 定义一个隐藏的表单,处理页数和每页记录数的传递 -->
<form action="" method="post" name="split_form">
<input type="hidden" name="cp" value="<%=cp %>">
<input type="hidden" name="ls" value="<%=ls %>">
</form>
</center>
</body>
</html>



E 真分页、分页组件
注意:不同的数据库使用的分页查询关键字也不同。
Oracle:ROWNUM
MySQL:LIMIT
SQLServer:TOP

分页组件break_page_groupware.jsp
<%-- 真分页组件 --%>
<%--
需要分页时,将以下内容复制到分页页面上
<jsp:include page="break_page_group.jsp">
<jsp:param name="cp" value="<%=cp %>"/>
<jsp:param name="ls" value="<%=ls %>"/>
<jsp:param name="allRecorders" value="<%=allRecorders %>"/>
<jsp:param name="keyword" value="<%=keyword %>"/>
<jsp:param name="searchFlag" value="FALSE"/>
<jsp:param name="changeLsFlag" value="TRUE"/>
</jsp:include>
searchFlag:表示是否需要加入按关键字查询功能,如果需要加入则value设置为TRUE,并加上keyword参数
changeLsFlag:表示是否需要加入改变每页显示记录数功能,如果需要加入则value设置为TRUE
--%>

<%@ page language="java" pageEncoding="UTF-8"%>

<script type="text/javascript">
function changeCp(cp) {
// 修改表单中的cp(页码)值,并提交表单
document.split_form.cp.value = cp ;
document.split_form.submit();
}
function changeLs(ls) {
// 修改表单中的ls(每页显示的记录数)值,并提交表单
document.split_form.ls.value = ls ;
// 将cp的值改回1,防止出现显示记录不存在的问题
document.split_form.cp.value = 1;
document.split_form.submit();
}
function search() {
// 为表单中的cp重新赋值,改为1
document.split_form.cp.value = 1;
document.split_form.submit();
}
</script>

<%
// 保存全部记录数,以计算总页数
int allRecorders = 0;
// cp已记录页码,默认第一页
int cp = 1;
// 定义每页显示记录数,默认为5条
int ls = 5 ;

//判断接收的参数是否为空,为空表示第一次打开页面
if(request.getParameter("cp")==null){
cp=1;
}else{
cp = Integer.parseInt(request.getParameter("cp")) ;
}
//判断接收的参数是否为空,应该不会为空,因为每页显示的记录数有一个默认值
if(request.getParameter("ls")==null){
ls=5;
}else{
ls = Integer.parseInt(request.getParameter("ls")) ;
}
//判断接收的参数是否为空,为空表示数据库中没有记录
if(request.getParameter("allRecorders")==null){
allRecorders=0;
}else{
allRecorders = Integer.parseInt(request.getParameter("allRecorders"));
}

// 计算总页数
int allPage = (allRecorders - 1) / ls + 1 ;
%>

<input type="button" value="首页" <%=cp==1?"disabled":"" %> onClick="changeCp(1);">
<input type="button" value="上一页" <%=cp==1?"disabled":"" %> onClick="changeCp(<%=cp-1 %>);">
<input type="button" value="下一页" <%=cp==allPage?"disabled":"" %> onClick="changeCp(<%=cp+1 %>);">
<input type="button" value="尾页" <%=cp==allPage?"disabled":"" %> onClick="changeCp(<%=allPage %>);">

跳转到 第 <select name="mycp" onchange="changeCp(this.value)">
<%
for (int i = 1; i <= allPage ;i++) {
%>
<option value="<%=i %>" <%=i==cp?"selected":"" %>><%=i %></option>
<%
}
%>
</select> 页

<%
//是否需要增加改变每页显示的记录数的功能
String changeLsFlag = request.getParameter("changeLsFlag");
if ("TRUE".equals(changeLsFlag)) {
// 定义每页显示记录数的选择数组
int[] allLs = {2,5,10,20};
%>
每页显示 <select name="myls" onchange="changeLs(this.value)">
<%
for (int i = 0;i < allLs.length;i++) {
%>
<option value="<%=allLs[i] %>" <%=ls == allLs[i]?"selected":"" %>><%=allLs[i] %></option>
<%
}
%>
</select>
<%
}
%>

<!-- 定义一个隐藏的表单,处理页数的传递 -->
<form action="" method="post" name="split_form">
<%
//是否需要增加按照关键字查询的功能
String searchFlag = request.getParameter("searchFlag");
if ("TRUE".equals(searchFlag)) {
// 定义查询关键字
String keyword = "";
// 判断是否为空,为空表示全查询
if (request.getParameter("keyword") == null) {
keyword = "" ;
}else{
keyword=request.getParameter("keyword");
}
%>
请输入查询关键字:<input type="text" name="keyword" value="<%=keyword %>"> <input type="button" value="查询" onClick="search();">
<%
}
%>
<input type="hidden" name="cp" value="<%=cp %>">
<input type="hidden" name="ls" value="<%=ls %>">
</form>




分页文件:list_break_page.jsp
<%@ page language="java" import="java.sql.*" pageEncoding="UTF-8"%>
<%@ page import="java.text.*"%>
<%@ page import="java.util.*"%>
<%
String path = request.getContextPath();
String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
%>

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<base href="<%=basePath%>">

<title>My JSP 'list.jsp' starting page</title>

<meta http-equiv="pragma" content="no-cache">
<meta http-equiv="cache-control" content="no-cache">
<meta http-equiv="expires" content="0">
<meta http-equiv="keywords" content="keyword1,keyword2,keyword3">
<meta http-equiv="description" content="This is my page">
<!--
<link rel="stylesheet" type="text/css" href="styles.css">
-->
<script type="text/javascript">
function goback(){
history.back();
}
</script>

</head>

<body>
<!-- 包含login_head.jsp文件,判断是否已登陆 -->
<%@ include file="login_head.jsp" %>
<%
request.setCharacterEncoding("UTF-8");
%>
<table border="0" width="100%">
<tr>
<td align="right"><a href="<%=path%>/quit.jsp" style="">退出系统</a></td>
</tr>
</table>

<center>
<%
// 保存全部记录数
int allRecorders = 0;
// 保存当前页码
int cp = 1;
// 定义每页显示记录数
int ls = 5 ;
// 定义关键字
String keyword = request.getParameter("keyword");
// 判断是否为空,第一次打开页面为空,如果不填写关键字也为空
if (keyword == null) {
keyword = "" ;
}
//方法一
// try{
// // 接收传递的cp值,当第一次进入页面时,会进入到 catch部分,则cp值会按照默认的1来进行处理。
// cp = Integer.parseInt(request.getParameter("cp")) ;
// // 接收传递的ls值
// ls = Integer.parseInt(request.getParameter("ls")) ;
// } catch (NumberFormatException e) {}

//方法二
//判断接收的参数是否为空,为空表示第一次打开页面
if(request.getParameter("cp")==null){
cp=1;
}else{
cp = Integer.parseInt(request.getParameter("cp")) ;
}
//判断接收的参数是否为空,应该不会为空,因为每页显示的记录数有一个默认值
if(request.getParameter("ls")==null){
ls=5;
}else{
ls = Integer.parseInt(request.getParameter("ls")) ;
}
%>
<%@ include file="conn.jsp" %>
<%
// 查询出全部记录数
String allSql = "SELECT count(*) FROM emp WHERE ename LIKE ?" ;
prmt = conn.prepareStatement(allSql);
prmt.setString(1,"%"+keyword+"%");
ResultSet rs = prmt.executeQuery();
if (rs.next()) {
// 取得全部记录数
allRecorders = rs.getInt(1);
}
%>
<%
String sql = "SELECT empno,ename FROM emp WHERE ename LIKE ?" ;
prmt = conn.prepareStatement(sql);
prmt.setString(1,"%"+keyword+"%");
rs = prmt.executeQuery();
Map<Integer,String> mgrM=new HashMap<Integer,String>();
while(rs.next()) {
mgrM.put(rs.getInt(1),rs.getString(2));
}

sql = "SELECT deptno,dname FROM dept" ;
prmt = conn.prepareStatement(sql);
rs = prmt.executeQuery();
Map<Integer,String> deptnoM=new HashMap<Integer,String>();
while(rs.next()) {
deptnoM.put(rs.getInt(1),rs.getString(2));
}

sql = "SELECT temp.empno,temp.ename,temp.job,temp.mgr,temp.hiredate,temp.sal,temp.comm,temp.deptno FROM(SELECT empno,ename,job,mgr,hiredate,sal,comm,deptno ,ROWNUM rn FROM emp WHERE ename LIKE ? AND ROWNUM<=?) temp WHERE temp.rn >?" ;
prmt = conn.prepareStatement(sql);
prmt.setString(1,"%"+keyword+"%");
prmt.setInt(2,cp*ls);
prmt.setInt(3,(cp-1) * ls);
rs = prmt.executeQuery();

//从查询结果中取得列名称
ResultSetMetaData rsmd=rs.getMetaData();
%>
<table border="1" width="80%">
<%-- 直接添加列名称
<tr>
<td>empno</td>
<td>ename</td>
<td>job</td>
<td>mgr</td>
<td>hiredate</td>
<td>sal</td>
<td>comm</td>
<td>deptno</td>
</tr>
--%>
<tr>
<td><%=rsmd.getColumnName(1) %></td>
<td><%=rsmd.getColumnName(2) %></td>
<td><%=rsmd.getColumnName(3) %></td>
<td><%=rsmd.getColumnName(4) %></td>
<td><%=rsmd.getColumnName(5) %></td>
<td><%=rsmd.getColumnName(6) %></td>
<td><%=rsmd.getColumnName(7) %></td>
<td><%=rsmd.getColumnName(8) %></td>
</tr>
<%
while(rs.next()) {
%>
<tr>
<td><%=rs.getInt(1) %></td>
<td><%=rs.getString(2) %></td>
<td><%=rs.getString(3) %></td>
<td><%=mgrM.get(rs.getInt(4))==null?"无":mgrM.get(rs.getInt(4)) %></td>
<td><%=new SimpleDateFormat("yyyy年MM月dd日").format(rs.getDate(5)) %></td>
<td><%=rs.getDouble(6) %></td>
<td><%=rs.getDouble(7) %></td>
<td><%=deptnoM.get(rs.getInt(8))==null?"无":deptnoM.get(rs.getInt(8)) %></td>
</tr>
<%
}
rs.close();
prmt.close();
conn.close();
%>
</table>
<br />
<input type="button" value="返回" onclick="goback();" />

<%-- 动态包含分页组件页面 --%>
<jsp:include page="break_page_groupware.jsp">
<jsp:param name="cp" value="<%=cp %>"/>
<jsp:param name="ls" value="<%=ls %>"/>
<jsp:param name="allRecorders" value="<%=allRecorders %>"/>
<jsp:param name="keyword" value="<%=keyword %>"/>
<jsp:param name="searchFlag" value="TRUE"/>
<jsp:param name="changeLsFlag" value="TRUE"/>
</jsp:include>

</center>
</body>
</html>



今天讲解的代码有些难以理解,主要还是以分页为主,难度系数较高,虽然知识点可以充分的理解,但还是有待提高,慢慢来吧,学的有些辛苦,一个多月了,坚持下下。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值