1、jdbc.properties組態檔
jdbc.properties
driverClass=com.mysql.jdbc.Driver
jdbcUrl=jdbc:mysql://localhost:3306/animedb?useUnicode=true&characterEncoding=utf8&useSSL=false&serverTimezone=GMT%2b8
user=root
password=root
2、JDBCUtil 工具類
JDBCUtil.java
package com.kgc.jdbc;
import java.io.InputStream;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.Statement;
import java.util.Properties;
/**
* JDBC資料庫操作工具類-都是公共的靜態方法(不需要實體化),減少代碼冗余
* @author zhukang
*
*/
public class JDBCUtil {
/**
* 讀取外部的資料庫連接資訊組態檔,獲取資料庫連接物件
*/
public static Connection getConnection() throws Exception {
// 創建Properties屬性物件
Properties properties = new Properties();
// 使用反射機制,讀取外部組態檔
InputStream inputStream = JDBCUtil.class.getClassLoader().getResourceAsStream("jdbc.properties");
// 加載輸入流物件,獲取組態檔內容
properties.load(inputStream);
// 讀取資料庫連接資訊
String driverClass = properties.getProperty("driverClass");
String jdbcUrl = properties.getProperty("jdbcUrl");
String user = properties.getProperty("user");
String password = properties.getProperty("password");
// 加載驅動
Class.forName(driverClass);
// 獲取資料庫連接物件
return DriverManager.getConnection(jdbcUrl, user, password);
}
/**
* 增刪改的通用方法:只需要提供執行的SQL陳述句和SQL陳述句需要的引數,使用預處理物件
*/
public static int update(String executeSql, Object ... params){
// 定義資料庫連接和預處理操作物件
Connection conn = null;
PreparedStatement pstmt = null;
// 定義SQL陳述句執行的影響行數
int row = 0;
// 公共執行增刪改的處理代碼
try {
// 獲取資料庫連接
conn = getConnection();
// 創建預處理操作物件
pstmt = conn.prepareStatement(executeSql);
// 實作動態傳參,注意: 傳入的預編譯SQL的?和傳入的引數個數和順序要一致,即:要保證一一對應
for (int i = 0; i < params.length; i++) {
pstmt.setObject(i + 1, params[i]);
}
// 執行增刪改操作,并獲取影響行數
row = pstmt.executeUpdate();
} catch (Exception e) {
e.printStackTrace();
} finally {
releaseResource(conn, pstmt, null);
}
// 回傳影響行數
return row;
}
/**
* 查詢的通用方法:只需要提供執行的SQL陳述句和SQL陳述句需要的引數,使用預處理物件
*/
public static ResultSet select(String executeSql, Object ... params){
// 定義資料庫連接,預處理操作物件,結果集物件
Connection conn = null;
PreparedStatement pstmt = null;
ResultSet rs = null;
// 公共執行查詢的處理代碼
try {
// 獲取資料庫連接
conn = getConnection();
// 創建預處理操作物件
pstmt = conn.prepareStatement(executeSql);
// 實作動態傳參,注意: 傳入的預編譯SQL的?和傳入的引數個數和順序要一致,即:要保證一一對應
for (int i = 0; i < params.length; i++) {
pstmt.setObject(i + 1, params[i]);
}
// 執行查詢操作,并獲取結果集
rs = pstmt.executeQuery();
} catch (Exception e) {
e.printStackTrace();
} finally {
//最好不釋放資源,因為rs要回傳,關閉后,直接外層不可以使用
releaseResource(conn, pstmt, rs);
}
// 回傳查詢結果集
return rs;
}
/**
* 釋放資料庫操作物件資源
*/
public static void releaseResource(Connection conn, Statement stmt, ResultSet rs){
try {
// 手動釋放
if (null != rs) {
rs.close();
}
if (null != stmt) {
stmt.close();
}
if (null != conn) {
conn.close();
}
} catch (Exception e) {
e.printStackTrace();
}
}
}
3、作業總結技巧 (JdbcUtil 頁面跳轉 Jstl)
這些只是我個人的思考,可能會比較冗余,我是為了多思考,記錄當時的感受;
且以訪問資源為主和jstl,后面的以Ajax為主;
3.1Jstl妙用 (基于 Jstl遍歷資料添加元素)
3.1 型別cid->型別名 顯示資料時 外鍵資訊對應
animesList:為動漫list集合的資料,放在request域中;
categoriesList:為動漫的型別,放在session域中(主要是因為方便修改和添加的時候方便獲取型別);
外層回圈,遍歷每條動漫資料,內層回圈,查詢動漫對應的型別名稱;
<!--
animesList:為動漫list集合的資料,放在request域中;
categoriesList:為動漫的型別,放在session域中(主要是因為方便修改和添加的時候方便獲取型別)
外層回圈,遍歷每條動漫資料,內層回圈,查詢動漫對應的型別名稱
-->
<c:forEach items="${animesList}" var ="anime" varStatus="status">
<!-- 遍歷動漫的cid -->
<c:forEach items="${categoriesList}" var ="category" varStatus="status">
<!-- 根據動漫的cid 與 型別的id 匹配對應的動漫型別 -->
<c:if test="${ anime.cid eq category.id}" var="flag">
${category.name}
</c:if>
</c:forEach>
</c:forEach>
3.2 型別cid->型別名 修改資料時 外鍵資訊對應
修改動漫資料,跳修改頁面后顯示資料,型別可以選擇并且,選擇了以前的型別selected="selected"
<!-- 修改動漫資料,跳修改頁面后顯示資料,型別可以選擇并且,選擇了以前的型別selected="selected" -->
<select name="cid" id="categories">
<!-- 動漫型別 將資料放進session中然后直接通過Jstl運算式遍歷 -->
<c:forEach items="${categoriesList}" var ="category" varStatus="status">
<option value="https://www.cnblogs.com/xiaoqigui/p/${category.id }"
<c:if test="${ upAnimes.cid eq category.id}" var="flag">
selected="selected"
</c:if>
>${category.name }</option>
</c:forEach>
</select>
3.2.response 回傳彈窗,并跳轉
直接在回傳中寫javaScript;
resp.getWriter().print("<script type='text/javascript'>alert('洗掉成功!!!'); location.href = 'https://www.cnblogs.com/xiaoqigui/p/animes'</script>");
3.3 getPartment(str) 再次理解
如果屬性,沒有引數就是空字串“” ,如果沒有屬性,獲取的就是null
getPartment(str); //如果屬性,沒有引數就是空字串“” ,如果沒有屬性,獲取的就是null
getPartment(str).trim(); //防止不小心多輸入空格,去掉前后的空格,但是 trim()必須保證引數值不為 null
3.4 模糊 sql拼接
like concat(''%,?,'%') 方便模糊查詢
sql拼接及 Object陣列 陣列動態添加引數的弊端(后面使用List集合添加陣列,最后在轉成陣列);
//注意這種引數判斷的思想
//條件查詢動漫
public List<Animes> searchAnimes(Search search) throws SQLException{
List<Animes> animesList = new ArrayList<>();
String executeSql = "select `id`,`cid`,`name`,`author`,`actor`,`produce`,`create_date` from animes";
//引數
Object[] params = {};
//如果有引數
if(!"".equals(String.valueOf(search.getAnimeName())) || !"".equals(String.valueOf(search.getAnimeAuthor())) || !"0".equals(String.valueOf(search.getAnimeCategory()))) {
executeSql = executeSql.concat(" where");
}
//如果有動漫名
if(!"".equals(String.valueOf(search.getAnimeName()))) {
executeSql = executeSql.concat(" name like concat('%',?,'%')");
Object[] params1 = {search.getAnimeName()};
params = params1;
}
//如果有動漫名 和作者
if(!"".equals(String.valueOf(search.getAnimeName())) && !"".equals(String.valueOf(search.getAnimeAuthor()))) {
executeSql = executeSql.concat(" and author like concat('%',?,'%')");
Object[] params2 = {search.getAnimeName(),search.getAnimeAuthor()};
params = params2;
}else if(!"".equals(String.valueOf(search.getAnimeAuthor()))){
//如果 作者
executeSql = executeSql.concat(" author like concat('%',?,'%')");
Object[] params3 = {search.getAnimeAuthor()};
params = params3;
}
//如果有 作者名 和 動漫名 和 型別
if(!"".equals(String.valueOf(search.getAnimeName())) && !"".equals(String.valueOf(search.getAnimeAuthor())) && !"0".equals(String.valueOf(search.getAnimeCategory()))) {
executeSql = executeSql.concat(" and cid = ?");
Object[] params4 = {search.getAnimeName(),search.getAnimeAuthor(),search.getAnimeCategory()};
params = params4;
}else if(!"".equals(String.valueOf(search.getAnimeName())) && !"0".equals(String.valueOf(search.getAnimeCategory()))) {
//動漫名 和 型別
executeSql = executeSql.concat(" and cid = ?");
Object[] params5 = {search.getAnimeName(),search.getAnimeCategory()};
params = params5;
}else if(!"".equals(String.valueOf(search.getAnimeAuthor())) && !"0".equals(String.valueOf(search.getAnimeCategory()))) {
//作者 和 型別
executeSql = executeSql.concat(" and cid = ?");
Object[] params6 = {search.getAnimeAuthor(),search.getAnimeCategory()};
params = params6;
}else if(!"0".equals(String.valueOf(search.getAnimeCategory()))){
//型別
executeSql = executeSql.concat(" cid = ?");
Object[] params7 = {search.getAnimeCategory()};
params = params7;
}
System.out.println("searchAnimes 搜索的SQL==>"+executeSql);
ResultSet rs = JDBCUtil.select(executeSql, params);
while(rs.next()) {
Animes anime = new Animes();
anime.setId(rs.getInt("id"));
anime.setCid(rs.getInt("cid"));
anime.setName(rs.getString("name"));
anime.setAuthor(rs.getString("author"));
anime.setActor(rs.getString("actor"));
anime.setProduce(rs.getString("produce"));
anime.setCreate_date(rs.getDate("create_date"));
animesList.add(anime);
}
System.out.println("----- AnimesImpl 遍歷資料庫中查詢的資料 ----");
for (int i = 0; i < animesList.size(); i++) {
System.out.println(animesList.get(i).toString());
}
System.out.println("----- AnimesImpl 遍歷資料庫中查詢的資料結束 ---");
return animesList;
}
3.5 標記 搜索關鍵字
在資料查詢的時候將關鍵字進行替換 replace(oldstr,new str);
//標記關鍵字 name
String markName = "replace(`name`,'"+search.getAnimeName() +"',\"<span style='color:red'>"+search.getAnimeName()+"</span>\") as 'name'";
//標記關鍵字 author
String markAuthor = "replace(`author`,'"+search.getAnimeAuthor() +"',\"<span style='color:red'>"+search.getAnimeAuthor()+"</span>\") as 'author'";
//執行的sql
String executeSql = "select `id`,`cid`,"+markName+","+markAuthor+",`actor`,`produce`,`create_date` from animes";
3.6 分頁查詢
//分頁查詢所有的動漫資料
public List<Animes> pageSelectAllAnimes(PageUtil pageUtil) throws SQLException{
List<Animes> animesList = new ArrayList<>();
String executeSql = "select `id`,`cid`,`name`,`author`,`actor`,`produce`,`create_date` from animes limit ?,?";
//引數
Object[] params = {(pageUtil.getPageNum()-1)*pageUtil.getPageSize(),pageUtil.getPageSize()};
ResultSet rs = JDBCUtil.select(executeSql, params);
while(rs.next()) {
Animes anime = new Animes();
anime.setId(rs.getInt("id"));
anime.setCid(rs.getInt("cid"));
anime.setName(rs.getString("name"));
anime.setAuthor(rs.getString("author"));
anime.setActor(rs.getString("actor"));
anime.setProduce(rs.getString("produce"));
anime.setCreate_date(rs.getDate("create_date"));
animesList.add(anime);
}
System.out.println("----- AnimesImpl 列印測驗 當前頁=》"+pageUtil.getPageNum()+",頁面大小=》"+pageUtil.getPageSize());
for (int i = 0; i < animesList.size(); i++) {
System.out.println(animesList.get(i).toString());
}
System.out.println("-----------------------------------");
return animesList;
}
3.7 分頁工具類
//分頁工具類
public class PageUtil {
//一共多少條資料
private int dateCount;
//每頁顯示的資料條數
private int pageSize = 5;
//當前頁
private int pageNum = 1;
//最大頁數
private int maxPageNum;
//構造方法,需要 資料量 和 頁面大小
public PageUtil(int dateCount) {
this.dateCount = dateCount;
this.maxPageNum = (this.dateCount%pageSize) == 0 ? (this.dateCount/pageSize) : (this.dateCount/pageSize) +1 ;
}
//獲取當前頁面
public int getPageNum() {
return pageNum;
}
//設定當前頁面
public void setPageNum(int pageNum) {
this.pageNum = pageNum;
}
//獲取最大頁面數
public int getMaxPageNum() {
return this.maxPageNum;
}
//獲取頁面大小
public int getPageSize() {
return pageSize;
}
//設定頁面大小
public void setPageSize(int pageSize) {
this.pageSize = pageSize;
//頁面大小切換后應該重新切換頁面數量
this.maxPageNum = (this.dateCount%pageSize) == 0 ? (this.dateCount/pageSize) : (this.dateCount/pageSize) +1 ;
}
//獲取資料總條數
public int getDateCount() {
return dateCount;
}
}
3.8 獲取select的值 change()事件動態獲取pageSize 并拼接引數
select標簽的change()事件, 切換選項時觸發;
<!-- href拼接pageSize -->
<script type="text/javascript" src="https://www.cnblogs.com/xiaoqigui/p/${pageContext.request.contextPath}/js/jquery-3.4.1.min.js" ></script>
<script type="text/javascript">
$(function(){
//獲取頁面大小
let pageSize = $("#pageSize").val();
//加載頁面先拼接頁面
$(".pagea").each(function(){
let oldhref = https://www.cnblogs.com/xiaoqigui/p/$(this).attr("href").substr(0,30);
let newhref = https://www.cnblogs.com/xiaoqigui/p/oldhref + pageSize;
//alert(newhref);
$(this).attr("href",newhref);
});
//修改pageSize
//select標簽的change()事件, 切換選項時觸發
$("#pageSize").change(function(){
pageSize = $("#pageSize option:selected").val();
//alert(pageSize);
//修改后的pageSize
$(".pagea").each(function(){
let oldhref = https://www.cnblogs.com/xiaoqigui/p/$(this).attr("href").substr(0,30);
let newhref = https://www.cnblogs.com/xiaoqigui/p/oldhref + pageSize;
//alert(newhref);
$(this).attr("href",newhref);
});
//根據新的pageSize跳轉
//alert(pageSize);
//跳轉的新頁面
//alert("pageSearch?pageNum=1&&pageSize="+pageSize);
location.href = "https://www.cnblogs.com/xiaoqigui/p/pageSearch?pageNum=1&&pageSize="+pageSize;
});
});
</script>
跳轉頁面的鏈接 首頁,上一頁,下一頁,尾頁
<!-- pageNum 當前頁 -->
<a href="https://www.cnblogs.com/xiaoqigui/p/pageSearch?pageNum=1&pageSize=" >首頁</a> |
<c:if test="${pageUtil.pageNum ne 1}" var="sexFlag">
<a href="https://www.cnblogs.com/xiaoqigui/p/pageSearch?pageNum=${pageUtil.pageNum -1 }&pageSize=" ><<上一頁</a> |
</c:if>
<c:if test="${pageUtil.pageNum ne pageUtil.maxPageNum}" var="sexFlag">
<a href="https://www.cnblogs.com/xiaoqigui/p/pageSearch?pageNum=${pageUtil.pageNum +1 }&pageSize=" >下一頁>></a> |
</c:if>
<a href="https://www.cnblogs.com/xiaoqigui/p/pageSearch?pageNum=${pageUtil.maxPageNum }&pageSize=" >尾頁</a> |
3.9 動態顯示pageSize
<!-- 動態顯示pageSize
pageSizeList 為 PageSize 物件集合 PageSize 物件只有一個 String pageSize 頁面大小屬性
-->
<select name="pageSize" id="pageSize">
<!--頁面大小 pageSize -->
<c:forEach items="${pageSizeList}" var ="pageSize" varStatus="status">
<option value="https://www.cnblogs.com/xiaoqigui/p/${pageSize.pageSize}"
<c:if test="${pageUtil.pageSize eq pageSize.pageSize}">
selected = "selected"
</c:if>
>${pageSize.pageSize}</option>
</c:forEach>
</select>
3.10 登錄 AnimeServlet 第一次跳轉到展示頁面 需要準備一些資料
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//======從資料庫獲取動漫資料 不走條件查詢======
List<Animes> animesList = new ArrayList<>();
AnimesImpl animesImpl = new AnimesImpl();
// try {
// animesList = animesImpl.selectAllAnimes();
// } catch (SQLException e) {
// e.printStackTrace();
// }
//======從資料庫獲取動漫資料 走條件查詢======
//獲取動漫的總條數
int dateCount = 0;
try {
dateCount = animesImpl.selectAllAnimesCounts();
} catch (SQLException e) {
e.printStackTrace();
}
PageUtil pageUtil = new PageUtil(dateCount);
//將分頁物件放進session域中,初始化頁面物件
req.getSession().setAttribute("pageUtil", pageUtil);
try {
animesList = animesImpl.pageSelectAllAnimes(pageUtil);
} catch (SQLException e) {
e.printStackTrace();
}
//將動漫集合放入request中
req.setAttribute("animesList", animesList);
//======動漫型別======
List<Category> categoriesList = new ArrayList<>();
CategoryImpl categoryImpl = new CategoryImpl();
try {
categoriesList = categoryImpl.selectAllCategories();
} catch (SQLException e) {
e.printStackTrace();
}
//將型別資料放進session中
req.getSession().setAttribute("categoriesList", categoriesList);
//頁面大小
List<PageSize> pageSizeList = new ArrayList<PageSize>();
pageSizeList.add(new PageSize("3"));
pageSizeList.add(new PageSize("5"));
pageSizeList.add(new PageSize("10"));
pageSizeList.add(new PageSize("15"));
//將pageSize放進session中
req.getSession().setAttribute("pageSizeList", pageSizeList);
System.out.println("==AnimeServlet 動漫資料條數"+dateCount+"當前頁"+pageUtil.getPageNum()+"最大頁"+pageUtil.getMaxPageNum()+"===");
//轉發到動漫串列頁面
req.getRequestDispatcher("web6Jdbc/animeListJson.jsp").forward(req, resp);
}
3.11 分頁Servlet->PageSelectAnimeServlet
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//第幾頁
int pageNum = Integer.parseInt(req.getParameter("pageNum")==null ? "1" :req.getParameter("pageNum"));
//頁面大小
int pageSize = Integer.parseInt(req.getParameter("pageSize")==null ? "5" :req.getParameter("pageSize"));
System.out.println("PageSelectAnimeServlet 當前頁=》"+pageNum+",頁面大小=》"+pageSize);
AnimesImpl animesImpl = new AnimesImpl();
PageUtil pageUtil = null;
try {
//現在每次實體化都先獲取資料總數,后面考慮更好的方法 ??小問題
pageUtil = new PageUtil(animesImpl.selectAllAnimesCounts());
} catch (SQLException e1) {
e1.printStackTrace();
}
pageUtil.setPageNum(pageNum);
pageUtil.setPageSize(pageSize);
//每次分頁查詢要將分頁工具類重新更新
req.getSession().setAttribute("pageUtil", pageUtil);
List<Animes> animesList = new ArrayList<Animes>();
try {
animesList = animesImpl.pageSelectAllAnimes(pageUtil);
//將動漫集合放入request中
req.setAttribute("animesList", animesList);
} catch (SQLException e) {
e.printStackTrace();
}
//轉發到動漫串列頁面
req.getRequestDispatcher("web6Jdbc/animeListJson.jsp").forward(req, resp);
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/501438.html
標籤:Java
上一篇:springboot整合xxl-job分布式定時任務【圖文完整版】
下一篇:api介面基礎Day1
