天天看点

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