天天看點

Servlet系列教材 (十九)- CRUD - 用Servlet 做增删改查CRUD一套 

CRUD是常見的頁面功能,即我們常說的增删改查 

C - Creation 增加 

R - Retrieve 查詢 

U - Update 修改 

D - DELETE 删除 

本章節将介紹如何與JDBC結合,通過servlet查詢資料庫,根據查詢結果,得到一個html頁面,顯示資料庫中的内容。 

本例借助JDBC章節的Hero類和HeroDAO類進行資料庫查詢

步驟1:先運作,看到效果,再學習

步驟2:模仿和排錯

步驟3:效果

步驟4:準備實體類Hero

步驟5:準備DAO 類 HeroDAO

步驟6:建立表Hero的SQL

步驟7:為web應用導入mysql-jdbc的jar包

步驟8:編寫 HeroListServlet

步驟9:配置web.xml

步驟10:重新開機tomcat,通路http://127.0.0.1/listHero

步驟 1 : 先運作,看到效果,再學習

老規矩,先下載下傳下載下傳區(點選進入)的可運作項目,配置運作起來,确認可用之後,再學習做了哪些步驟以達到這樣的效果。

步驟 2 : 模仿和排錯

在確定可運作項目能夠正确無誤地運作之後,再嚴格照着教程的步驟,對代碼模仿一遍。 

模仿過程難免代碼有出入,導緻無法得到期望的運作結果,此時此刻通過比較正确答案 ( 可運作項目 ) 和自己的代碼,來定位問題所在。 

采用這種方式,學習有效果,排錯有效率,可以較為明顯地提升學習速度,跨過學習路上的各個檻。 

推薦使用diffmerge軟體,進行檔案夾比較。把你自己做的項目檔案夾,和我的可運作項目檔案夾進行比較。 

這個軟體很牛逼的,可以知道檔案夾裡哪兩個檔案不對,并且很明顯地标記出來 

這裡提供了綠色安裝和使用教程:diffmerge 下載下傳和使用教程

步驟 3 : 效果

這樣就把表Hero裡的資料都查出來了

Servlet系列教材 (十九)- CRUD - 用Servlet 做增删改查CRUD一套 

步驟 4 : 準備實體類Hero

Hero類有id,name,hp,damage等屬性。

并且為每一個屬性提供public的getter和setter。

package

bean;

public

class

Hero {

public

int

id;

public

String name;

public

float

hp;

public

int

damage;

public

int

getId() {

return

id;

}

public

void

setId(

int

id) {

this

.id = id;

}

public

String getName() {

return

name;

}

public

void

setName(String name) {

this

.name = name;

}

public

float

getHp() {

return

hp;

}

public

void

setHp(

float

hp) {

this

.hp = hp;

}

public

int

getDamage() {

return

damage;

}

public

void

setDamage(

int

damage) {

this

.damage = damage;

}

}

步驟 5 : 準備DAO 類 HeroDAO

準備一個HeroDAO,提供增加,删除,修改,查詢等正常資料庫操作方法

package

dao;

import

java.sql.Connection;

import

java.sql.DriverManager;

import

java.sql.PreparedStatement;

import

java.sql.ResultSet;

import

java.sql.SQLException;

import

java.sql.Statement;

import

java.util.ArrayList;

import

java.util.List;

import

bean.Hero;

public

class

HeroDAO {

public

HeroDAO() {

try

{

Class.forName(

"com.mysql.jdbc.Driver"

);

catch

(ClassNotFoundException e) {

e.printStackTrace();

}

}

public

Connection getConnection() 

throws

SQLException {

return

DriverManager.getConnection(

"jdbc:mysql://127.0.0.1:3306/how2java?characterEncoding=UTF-8"

"root"

,

"admin"

);

}

public

int

getTotal() {

int

total = 

;

try

(Connection c = getConnection(); Statement s = c.createStatement();) {

String sql = 

"select count(*) from hero"

;

ResultSet rs = s.executeQuery(sql);

while

(rs.next()) {

total = rs.getInt(

1

);

}

System.out.println(

"total:"

+ total);

catch

(SQLException e) {

e.printStackTrace();

}

return

total;

}

public

void

add(Hero hero) {

String sql = 

"insert into hero values(null,?,?,?)"

;

try

(Connection c = getConnection(); PreparedStatement ps = c.prepareStatement(sql);) {

ps.setString(

1

, hero.name);

ps.setFloat(

2

, hero.hp);

ps.setInt(

3

, hero.damage);

ps.execute();

ResultSet rs = ps.getGeneratedKeys();

if

(rs.next()) {

int

id = rs.getInt(

1

);

hero.id = id;

}

catch

(SQLException e) {

e.printStackTrace();

}

}

public

void

update(Hero hero) {

String sql = 

"update hero set name= ?, hp = ? , damage = ? where id = ?"

;

try

(Connection c = getConnection(); PreparedStatement ps = c.prepareStatement(sql);) {

ps.setString(

1

, hero.name);

ps.setFloat(

2

, hero.hp);

ps.setInt(

3

, hero.damage);

ps.setInt(

4

, hero.id);

ps.execute();

catch

(SQLException e) {

e.printStackTrace();

}

}

public

void

delete(

int

id) {

try

(Connection c = getConnection(); Statement s = c.createStatement();) {

String sql = 

"delete from hero where id = "

+ id;

s.execute(sql);

catch

(SQLException e) {

e.printStackTrace();

}

}

public

Hero get(

int

id) {

Hero hero = 

null

;

try

(Connection c = getConnection(); Statement s = c.createStatement();) {

String sql = 

"select * from hero where id = "

+ id;

ResultSet rs = s.executeQuery(sql);

if

(rs.next()) {

hero = 

new

Hero();

String name = rs.getString(

2

);

float

hp = rs.getFloat(

"hp"

);

int

damage = rs.getInt(

4

);

hero.name = name;

hero.hp = hp;

hero.damage = damage;

hero.id = id;

}

catch

(SQLException e) {

e.printStackTrace();

}

return

hero;

}

public

List<Hero> list() {

return

list(

, Short.MAX_VALUE);

}

public

List<Hero> list(

int

start, 

int

count) {

List<Hero> heros = 

new

ArrayList<Hero>();

String sql = 

"select * from hero order by id desc limit ?,? "

;

try

(Connection c = getConnection(); PreparedStatement ps = c.prepareStatement(sql);) {

ps.setInt(

1

, start);

ps.setInt(

2

, count);

ResultSet rs = ps.executeQuery();

while

(rs.next()) {

Hero hero = 

new

Hero();

int

id = rs.getInt(

1

);

String name = rs.getString(

2

);

float

hp = rs.getFloat(

"hp"

);

int

damage = rs.getInt(

4

);

hero.id = id;

hero.name = name;

hero.hp = hp;

hero.damage = damage;

heros.add(hero);

}

catch

(SQLException e) {

e.printStackTrace();

}

return

heros;

}

}

步驟 6 : 建立表Hero的SQL

用于建立表Hero的SQL語句

DROP TABLE IF EXISTS `hero`;

CREATE TABLE `hero` (

`id` int(11) NOT NULL AUTO_INCREMENT,

`name` varchar(30) DEFAULT NULL,

`hp` float DEFAULT NULL,

`damage` int(11) DEFAULT NULL,

PRIMARY KEY (`id`)

) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8;

步驟 7 : 為web應用導入mysql-jdbc的jar包

為web應用導入mysql-jdbc的jar包與為項目導入mysql-jdbc的jar包不同,其作用的web應用在tomcat中運作起來後,能夠找到jar包中的類。

是以需要把 mysql 的jar包放在WEB-INF/lib 目錄下。

注: mysql-connector-java-5.0.8-bin.jar 可以在右側下載下傳

注: 放在WEB-INF/lib 下指的是能夠web應用中找到對應的class,如果要在eclipse中做調試,還是需要為項目添加該jar才可以。

Servlet系列教材 (十九)- CRUD - 用Servlet 做增删改查CRUD一套 

步驟 8 : 編寫 HeroListServlet

做一個Hero的維護頁面需要一些通用的操作,比如增加,删除,編輯,修改,查詢等。

每個不同的操作,都需要一個對應的Servlet,除了做Hero之外,還會做到其他的一些表的相關操作,是以好的規範會對将來的維護更有好處。

一般會這樣命名,以查詢為例 HeroListServlet : [表][行為]Servlet 這樣一種命名規則。

是以對于Hero而言就會如此命名:

增加 HeroAddServlet

删除 HeroDeleteServlet

編輯 HeroEditServlet

修改 HeroUpdateServlet

查詢 HeroListServlet

在HeroListServlet中,會使用HeroDAO把資料查詢出來,然後拼接成一個table用于顯示其内容

package

servlet;

import

java.io.IOException;

import

java.util.List;

import

javax.servlet.ServletException;

import

javax.servlet.http.HttpServlet;

import

javax.servlet.http.HttpServletRequest;

import

javax.servlet.http.HttpServletResponse;

import

bean.Hero;

import

dao.HeroDAO;

public

class

HeroListServlet 

extends

HttpServlet {

protected

void

service(HttpServletRequest request, HttpServletResponse response)

throws

ServletException, IOException {

response.setContentType(

"text/html; charset=UTF-8"

);

List<Hero> heros = 

new

HeroDAO().list();

StringBuffer sb = 

new

StringBuffer();

sb.append(

"<table align='center' cellspacing='0'>\r\n"

);

sb.append(

"<tr><td>id</td><td>name</td><td>hp</td><td>damage</td></tr>\r\n"

);

String trFormat = 

"<tr><td>%d</td><td>%s</td><td>%f</td><td>%d</td></tr>\r\n"

;

for

(Hero hero : heros) {

String tr = String.format(trFormat, hero.getId(), hero.getName(), hero.getHp(), hero.getDamage());

sb.append(tr);

}

sb.append(

"</table>"

);

response.getWriter().write(sb.toString());

}

}

步驟 9 : 配置web.xml

在web.xml中把路徑 listHero映射到HeroListServlet上。

<?

xml

version

=

"1.0"

encoding

=

"UTF-8"

?>

<

web-app

>

<

servlet

>

<

servlet-name

>HelloServlet</

servlet-name

>

<

servlet-class

>HelloServlet</

servlet-class

>

<

load-on-startup

>10</

load-on-startup

>

</

servlet

>

<

servlet-mapping

>

<

servlet-name

>HelloServlet</

servlet-name

>

<

url-pattern

>/hello</

url-pattern

>

</

servlet-mapping

>

<

servlet

>

<

servlet-name

>LoginServlet</

servlet-name

>

<

servlet-class

>LoginServlet</

servlet-class

>

</

servlet

>

<

servlet-mapping

>

<

servlet-name

>LoginServlet</

servlet-name

>

<

url-pattern

>/login</

url-pattern

>

</

servlet-mapping

>    

<

servlet

>

<

servlet-name

>RegisterServlet</

servlet-name

>

<

servlet-class

>RegisterServlet</

servlet-class

>

</

servlet

>

<

servlet-mapping

>

<

servlet-name

>RegisterServlet</

servlet-name

>

<

url-pattern

>/register</

url-pattern

>

</

servlet-mapping

>

<

servlet

>

<

servlet-name

>HeroListServlet</

servlet-name

>

<

servlet-class

>servlet.HeroListServlet</

servlet-class

>

</

servlet

>

<

servlet-mapping

>

<

servlet-name

>HeroListServlet</

servlet-name

>

<

url-pattern

>/listHero</

url-pattern

>

</

servlet-mapping

>    

</

web-app

>

步驟 10 : 重新開機tomcat,通路http://127.0.0.1/listHero

重新開機tomcat,通路

http:

//127.0.0.1/listHero

Servlet系列教材 (十九)- CRUD - 用Servlet 做增删改查CRUD一套 

更多内容,點選了解: https://how2j.cn/k/servlet/servlet-query/563.html