主要内容:使用JDBC访问数据库中数据(Java Web数据可视化案例)
文章目录
前期准备:
安装 JDK、MySQL、Tomcat 和 Eclipse的 Java Web 版本;
1、Eclipse需要Web版本JAVA环境变量配置步骤及测试(JDK的下载 & 安装 & 环境配置教程)(右上角其实也可以更改)
确认Eclipse的版本:
2、此内容涉及数据库,如果没有数据库点此链接下载
3、Tomcat是必须安装并配置的,否则不能运行,Tomcat下载安装以及配置(详细教程)
案例:
要求:使用Java Web技术把数据库中数据分析的结果展示到网页上,分析结果是关于购买图书的记录,具体包括购买年份、图书名称、作者、价格等信息,具体要求如下:
1、写出创建数据库表 book 并插入模拟数据的SOL语句
2、编写表示信息的实体类 BookBean,应该包括成员变量、访问器方法和构造方法。
3、编写 BookDao类,连接到数据库,执行查询,封装查询结果
4、编写 BookServlet类,关联到请求/list 上,调用 BookDao得到数据并存储到reguest 对象中,然后转向 list.isp.
5、编写listisp,使用JSTL 把查询的结果显示在网页上
第一步:创建数据库及数据
首先需要创建数据库和表使用MySQL创建数据库和表更多学习,也可以看下面的语句
用命令行方式创建数据库
首先【Win+R】打开cmd,或者在MySQL安装的位置,打开 bin 文件夹输入cmd回车
然后输入:mysql -u root -p
,再输入密码即可
(1)、创建数据库:create database practice2020;
(2)、使用数据库:use practice2020
(3)、创建表:
create table book(
id int primary key auto_increment,
year int,
bookname int,
author varchar(255),
price varchar(255)
);
(4)、为了方便在界面上展示效果在这插入语句:
insert into book values(1,2002,'Web前端','张三','25.5');
insert into book values(2,2012,'JAVA','李四','52.1');
最后test02这个数据库里的book表的数据:
接下来我们要编写代码来表示数据库里的数据
第二步:编写实体类
(1)、类名
(2)、成员变量,和表中的列对应
(3)、访问器方法,setter方法和getter方法
(4)、无参数构造方法
(5)、有参数的构造方法,有多少个成员,就给多少个参数
通常与数据库中的表结构一致。
package Bean;
public class BookBean {
private int id;
private String year;
private String bookname;
private String author;
private String price;
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getYear() {
return year;
}
public void setYear(String year) {
this.year = year;
}
public String getBookname() {
return bookname;
}
public void setBookname(String bookname) {
this.bookname = bookname;
}
public String getAuthor() {
return author;
}
public void setAuthor(String author) {
this.author = author;
}
public String getPrice() {
return price;
}
public void setPrice(String price) {
this.price = price;
}
public BookBean(int id, String year, String bookname, String author, String price) {
super();
this.id = id;
this.year = year;
this.bookname = bookname;
this.author = author;
this.price = price;
}
}
第三步:编写Dao类
访问数据库,取出数据库数据
// 得到所有数据
public List<BookBean> list() {
// (1)定义存储数据的容器
List<BookBean> datas = new ArrayList<>();
// (2)把相关对象定义成成员变量
// (3)try...catch...finally
try {
// (6)写sql语句
String sqlString = "select * from book order by id";
// (7)连接到数据库
Class.forName(driverName);
con = DriverManager.getConnection(url, username, password);
// (8)执行sql语句,会得到结果集
pstmt = con.prepareStatement(sqlString);
ResultSet rSet = pstmt.executeQuery(sqlString);
// (9)遍历结果集,next指向下一行,并返回true,
// 如果没有下一行了,返回false,循环结束
while (rSet.next()) {
// (10)取出当前行的各个列
int id = rSet.getInt(1);
String year = rSet.getString(2);
String bookname = rSet.getString(3);
String author = rSet.getString(4);
String price = rSet.getString(5);
// (11)转换成对象(封装成),调用多个参数的构造方法
BookBean bookBean = new BookBean(id, year, bookname, author, price);
// (12)把当前对象添加到集合中(容器中)
datas.add(bookBean);
}
} catch (Exception e) {
// (4)处理异常
// System.out.println(e.getMessage());
e.printStackTrace();
} finally {
// (5)释放资源
if (rs != null) {
try {
rs.close();
} catch (Exception e2) {
}
}
if (pstmt != null) {
try {
pstmt.close();
} catch (Exception e2) {
}
}
if (con != null) {
try {
con.close();
} catch (Exception e2) {
}
}
}
// (13)把表示所有对象的数据返回
return datas;
}
这里如果说你换了个项目,那么有些参数你是需要改的:
// (1)定义存储数据的容器
List<BookBean> datas = new ArrayList<>();
// (6)写sql语句
String sqlString = "select * from book order by id";
// (10)取出当前行的各个列
int id = rSet.getInt(1);
String year = rSet.getString(2);
String bookname = rSet.getString(3);
String author = rSet.getString(4);
String price = rSet.getString(5);
// (11)转换成对象(封装成),调用多个参数的构造方法
BookBean bookBean = new BookBean(id, year, bookname, author, price);
第四步:编写Servlet代码
进行业务处理,如果没有业务,只是把Dao里面的数据直接返回给Controller
package servlet;
import java.io.IOException;
//.....import信息在此省略
import java.util.List;
// (1)关联到FindAll地址
@WebServlet("/FindAll")
public class FindAllServlet extends HttpServlet {
private static final long serialVersionUID = 1L;
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// (2)前两行调用servcie或者DAO得到数据
BookDao dao = new BookDao();
List<BookBean> datas = dao.list();
// (3)传值到界面,第一个参数是名字,第二个参数是具体值
request.setAttribute("datas", datas);
// (4)跳转到界面,list.jsp是显示数据的界面,list.jsp可以继续访问request
RequestDispatcher rd = request.getRequestDispatcher("list.jsp");
rd.forward(request, response);
}
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// TODO Auto-generated method stub
doGet(request, response);
}
}
第五步:画页面
编写HTML文件或JSP、Vue文件都可以,只要是前端的
这里用的是JSP
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>数据列表</title>
</head>
<body>
<table>
<tr>
<th>ID</th>
<th>购买年份</th>
<th>图书名称</th>
<th>作者</th>
<th>价格</th>
</tr>
<!-- request.setAttribute("datas",datas); -->
<!-- datas表示所有数据,data表示其中的一个数据 -->
<c:forEach var="data" items="${datas}">
<tr>
<td>${data.id}</td>
<td>${data.year}</td>
<td>${data.bookname}</td>
<td>${data.author}</td>
<td>${data.price}</td>
</tr>
</c:forEach>
</table>
</body>
</html>
页面运行效果
练习:
要求:使用Java Web技术把数据库中数据分析的结果展示到网页上,分析结果是关于全国学历教育入学数education,具体包括年份、本科入学人数、高中入学人数和初中入学人数。具体要求如下:
1、写出创建数据库表education并插入模拟数据的SQL语句。
2、编写表示信息的实体类 EducationBean,应该包括成员变量、访问器方法和构造方法。
3、编写 EducationDao类,连接到数据库,执行查询,封装查询结果。
4、编写EducationServlet类,关联到请求/list 上,调用EducationDao得到数据并存储到request对象中,然后转向 list.jsp
5、编写 list.jsp,使用JSTL把查询的结果显示在网页上。
第一步:创建数据库及数据
① 写出创建数据库test,表education并插入模拟数据的SQL语句
首先创建数据库:create database test;
然后使用数据库:use test
然后创建表:
create table education(
year int primary key,
benke int,
gaozhong int,
chuzhong int
);
然后插入一些模拟数据并查看:
插入数据:
insert into education values(2018,3000,4000,5000);
insert into education values(2019,3300,4400,5200);
insert into education values(2020,3400,4500,5300);
insert into education values(2021,3500,4600,5500);
查看数据: select * from education;
第二步:编写实体类
② 编写表示信息的实体类 EducationBean,应该包括成员变量、访问器方法(set、get)和构造方法
打开Java编译工具,这里用的是Eclipse
选择【File】→【new】→【Project】
接着选择【web】→【Dynamic Web Project】
然后起个名字直接点完成
接下来创建实体类bean
在src上点击右键,new→package
输入名字bean
然后创建类EducationBean
在bean上点右键,new→class
输入名字EducationBean
接下来编写代码(跟数据库对应):
package bean;
public class EducationBean {
//成员变量
private int year;
private int benke;
private int gaozhong;
private int chuzhong;
}
然后生成访问器方法(set、get)和构造方法
生成set、get方法动图演示:
生成构造方法动图演示:
最后EducationBean 里面完整代码:
package bean;
public class EducationBean {
//成员变量
private int year;
private int benke;
private int gaozhong;
private int chuzhong;
//生成set、get方法
public int getYear() {
return year;
}
public void setYear(int year) {
this.year = year;
}
public int getBenke() {
return benke;
}
public void setBenke(int benke) {
this.benke = benke;
}
public int getGaozhong() {
return gaozhong;
}
public void setGaozhong(int gaozhong) {
this.gaozhong = gaozhong;
}
public int getChuzhong() {
return chuzhong;
}
public void setChuzhong(int chuzhong) {
this.chuzhong = chuzhong;
}
//生成构造方法
public EducationBean(int year, int benke, int gaozhong, int chuzhong) {
super();
this.year = year;
this.benke = benke;
this.gaozhong = gaozhong;
this.chuzhong = chuzhong;
}
}
第三步:编写Dao类
③ 编写 EducationDao类,连接到数据库,执行查询,封装查询结果
把驱动程序放到工程里面的lib文件夹,跟着自己的mysql版本走(百度自行搜索jar包下载)
要在上方加上mysql连接的代码
private String url = "jdbc:mysql://localhost:3306/test?useSSL=false";
// 数据库信息,旧版本中不用useSSL=false
private String username = "root";
private String password = "123456";
private String driverName = "com.mysql.jdbc.Driver";
private Connection con=null; //连接对象
private PreparedStatement pstmt = null; //语句对象
private ResultSet rs = null; //结果集对象
接下来跟着上方案例的第三步来写,中间的一些参数要改
要改的地方:
数据库名字、数据库字段、表名、用户名、密码、实体类名字、当前行的各个列、构造方法中的参数
package dao;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.util.ArrayList;
import java.util.List;
import bean.EducationBean;
public class EducationDao {
private String url = "jdbc:mysql://localhost:3306/test?useSSL=false";
// 数据库信息,旧版本中不用useSSL=false
private String username = "root";
private String password = "123456";
private String driverName = "com.mysql.jdbc.Driver";
private Connection con=null; //连接对象
private PreparedStatement pstmt = null; //语句对象
private ResultSet rs = null; //结果集对象
// 得到所有数据
public List<EducationBean> list(){
// (1)定义存储数据的容器
List<EducationBean> datas = new ArrayList<>();
// (2)把相关对象定义成成员变量
// (3)try...catch...finally
try {
// (6)写sql语句
String sqlString = "select * from education order by year";
// (7)连接到数据库
Class.forName(driverName);
con = DriverManager.getConnection(url,username,password);
// (8)执行sql语句,会得到结果集
pstmt = con.prepareStatement(sqlString);
ResultSet rSet = pstmt.executeQuery(sqlString);
// (9)遍历结果集,next指向下一行,并返回true,
// 如果没有下一行了,返回false,循环结束
while(rSet.next()) {
// (10)取出当前行的各个列
int year = rSet.getInt(1);
int benke = rSet.getInt(2);
int gaozhong = rSet.getInt(3);
int chuzhong = rSet.getInt(4);
// (11)转换成对象(封装成),调用多个参数的构造方法
EducationBean educationBean = new EducationBean(year, benke,gaozhong,chuzhong);
// (12)把当前对象添加到集合中(容器中)
datas.add(educationBean);
}
} catch (Exception e) {
// (4)处理异常
//System.out.println(e.getMessage());
e.printStackTrace();
} finally {
// (5)释放资源
if(rs!=null) {
try {
rs.close();
} catch (Exception e2) {
}
}
if(pstmt!=null) {
try {
pstmt.close();
} catch (Exception e2) {
}
}
if(con!=null) {
try {
con.close();
} catch (Exception e2) {
}
}
}
// (13)把表示所有对象的数据返回
return datas;
}
}
解释:
con:连接对象
pstmt:语句对象
ResultSet:结果集对象
第四步:编写Servlet代码
④ 编写 EducationServlet类,关联到请求/list上,调用EducationDao得到数据并存储到request对象中,然后转向 list.jsp
首先新建servlet这样一个包
然后在包上右键新建Servlet
起名:EducationServlet
点下一步后,因为关联到请求/list 上,所以:
当然不在这一步改也可以,创建好后在代码内改也行
新建好后直接找到doGet方法,把上方案例中的2、3、4步复制过来,改下实体类、Dao包名字即可:
protected void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
// TODO Auto-generated method stub
EducationDao dao = new EducationDao();
List<EducationBean> datas = dao.list();
// (3)传值到界面,第一个参数是名字,第二个参数是具体值
request.setAttribute("datas", datas);
// (4)跳转到界面,list.jsp是显示数据的界面,list.jsp可以继续访问request
RequestDispatcher rd = request.getRequestDispatcher("list.jsp");
rd.forward(request, response);
}
第五步:画页面
⑤ 编写 list.jsp,使用JSTL把查询的结果显示在网页上
需要把JSTL的库放在lib文件夹内(百度自行搜索jar包下载)
接下来新建JSP页面
取名为:list.jsp
这里的页面内容也可以跟着上面的案例来改:
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>数据列表</title>
</head>
<body>
<table>
<tr>
<th>年</th>
<th>本科人数</th>
<th>高中人数</th>
<th>初中人数</th>
</tr>
<!-- request.setAttribute("datas",datas); -->
<!-- datas表示所有数据,data表示其中的一个数据 -->
<c:forEach var="data" items="${datas}">
<tr>
<td>${data.year}</td>
<td>${data.benke}</td>
<td>${data.gaozhong}</td>
<td>${data.chuzhong}</td>
</tr>
</c:forEach>
</table>
</body>
</html>
到此代码全部写完
页面运行效果
运行Servlet:
至此项目包目录:
扩展:
Dao类代码中JDBC代码
1、 JDBC是Java访问各种数据库管理系统的标准的API,用户编写数据库访问代码的时候不需要关注数据库管理系统的实现细节。
2、使用JDBC的准备工作:
不同的数据库管理系统需要对应的驱动程序,驱动程序是一个压缩包jar包。
要访问的数据库的基本信息:数据库位置(IP+端口+数据库名),认证信息(用户名和口令)
SQL语句:要完成的功能对应的SQL语句
3、JDBC相关的接口和类:
Driver
:表示连接数据库的驱动程序,通过驱动程序与数据库交互;
Connection
:表示应用程序与数据库之间的连接,不管进行什么操作都要先连接到数据库;
Statement、PreparedStatement、CallableStatement
:执行SQL语句
ResultSet
:表示执行查询时候的结果集
JDBC使用
1、加载驱动程序:
格式:Class.forName
(驱动程序名字)
例如:Class.forName("com.mysql.jdbc.Driver");
2、创建连接:
格式:Connection con = DriverManager.getConnection(constr,user,pass);
constr
表示连接字符串,user
表示用户名,pass
表示密码
例如:Connection con = DriverManager.getConnection("jdbc:mysql://localhost:3306/bookstore" ,"root" ,"root");
3、创建语句对象:
格式:Statement stmt = con.createStatement();
4、执行增删改:
格式:int n = stmt.executeUpdate(sql)
, n
表示执行成功的记录数
例如:
String sql = "insert into student values('000004,wangfei',20)";
int n = stmt.executeUpdate(sql);
正常插入返回1,插入失败返回0
5、执行查询:
格式:ResultSet rs = stmt.executeQuery(sql)
,n
表示执行成功的记录数,sql
表示要执行的sql语句
例如:
String sql ="select * from student";
ResultSet rs = stmt.executeQuery(sql);
6、结果集处理:
结果集就像一个有表头的表格
通过next方法
指向下一行,如果没有下一行返回false
使用getInt(n)
,或者getInt(列名)
得到当前行的第一列,返回值是int类型
使用getString(n)
,或getString(列名)
,返回值是String类型
查询单个值(例如某个表的记录数):
rs.next();
int n = rs.getInt(1);
查询一条记录(例如根据主键查询学生):
if(rs.next())
String sname = rs.getString(2)
查询多条记录(例如查询所有学生):
while(rs.next))
String sname = rs.getString(2);
7、关闭相关对象:
需要关闭的对象:连接对象Connection
、语句对象Statement
、结果集对象ResultSet
关闭顺序:结果集对象、语句对象、连接对象
通常关闭的时候,需要异常处理:
//加载驱动程序,驱动程序不存在
//执行的SQL语句出错了
//连接的数据库不存在,数据库没有启动也会出错
if(rs!=null) try{rs.close()}catch(Exception e);
if(stmt!=null) try{stmt.close()}catch(Exception e);
if(con!=null) try{con.close()}catch(Exception e);
8、异常处理
在访问数据库的过程中可能发生各种异常,所以需要进行异常处理。
完整代码
package util;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.List;
public class DBBean {
//数据库信息,旧版本中不用useSSL=false
private String url = "jdbc:mysql://localhost:3306/practice2020?useSSL=false";
private String username = "root";
private String password = "root";
private String driverName = "com.mysql.jdbc.Driver";
private Connection con=null; //连接对象
private PreparedStatement pstmt = null; //语句对象
private ResultSet rs = null; //结果集对象
//连接、执行、关闭
public DBBean() throws ClassNotFoundException, SQLException {
//加载驱动程序,创建连接
Class.forName(driverName);
con = DriverManager.getConnection(url,username,password);
}
//增删改(区别在SQL语句和SQL语句里面需要的变量)
public int executeUpdate(String sql,List<Object> params) throws SQLException{
//创建语句对象
pstmt = con.prepareStatement(sql);
//如果有参数,表示提供的参数在SQL语句里面需要变量。如果变量和参数不一致,报错
if(params!=null && params.size()>0){
//有多少变量循环多少次
for(int i=0;i<params.size();i++){
//对变量赋值
pstmt.setObject(i+1,params.get(i));
}
}
return pstmt.executeUpdate();
}
//查询
public ResultSet executeQuery(String sql,List<Object> params) throws SQLException{
pstmt = con.prepareStatement(sql);
if(params!=null && params.size()>0){
for(int i=0;i<params.size();i++){
pstmt.setObject(i+1,params.get(i));
}
}
return pstmt.executeQuery();
}
//关闭
public void close(){
if(rs!=null){
try {rs.close();
}catch(Exception ee){}
}
if(pstmt!=null){
try {pstmt.close();
}catch(Exception ee){}
}
if(con!=null){
try {con.close();
}catch(Exception ee){}
}
}
}
总结:
实现自己数据的展示
基本过程:
(1)创建 Web 工程;
(2)创建表示信息的实体类;
(3)添加两个类库:json 和 mysql 驱动程序;
(4)复制 DBBean,修改数据库信息;
(5)创建 DAO,从数据库中获取信息;
(6)创建 Service,调用 DAO 得到数据;
(7)创建 Servlet,调用 Service,对用户返回 JSON 数据;
(8)创建页面文件,获取 Servlet 的数据并显示。