项目的构成:
主要知识框架
题目:
Java数据库编程
在安装配置好Mysql数据库后,使用Java语言通过JDBC直接连接数据库,在数据库中建表并进行表数据的增删查改。
关键代码:
……
Class.forName(……); //加载数据库驱动名
String url=…..; //数据连接的url
String name=……; //数据库访问的用户名
String password=……; //数据库访问的密码
Connection con= DriverManager.getConnection(url, name, password);
……
在安装配置好数据库Mysql后,需要使用Java编程完成如下任务:
(1)创建数据库表users,字段分别为username(主键,varchar(10))、pass(varchar(8));数据库表person,字段按分别为username(varchar(10),对应于users表的username)、name(主键,varchar(20))、age(int,可以为空)、teleno(char(11),可以为空);如表users中username则表person中也不能有相应的username的数据。
(2)在表users中插入4行数据,数据分别是(ly,123456)、(liming,345678)、(test, 11111)、(test1,12345),在表person中插入3行数据,数据分别为(ly,雷力)、(liming,李明,25)、(test,测试用户,20,13388449933);
(3)在person表中插入5行数据,分别为(ly,王五)、(test2,测试用户2)、(test1,测试用户1,33)、(test,张三,23,18877009966)、(admin,admin)。对于表中已有的username,则根据最新的数据修改其相应字段值;如该username不存在,则首先在表users中插入该username,默认的password为888888,然后才能将数据插入至person表。
(4)删除users表中test打头的username,同时按照规则一并删除person表相应的数据。
要求每个处理阶段均要在控制台打印出处理完成后的结果,格式按照制表方式输出,如:
表users
字段名xx 字段名xx ….
xx xx
表person
字段名xx 字段名xx ….
xx xx
其中,在使用Java对数据库进行增删改查的操作时,必须对数据库的访问进行代码封装,即要创建一个类或者多个类,这些类负责与数据库的进行交互,其它的类通过调用这些类中的方法来实现对数据库相应数据的操作,而且后续实验也需要使用本实验的封装类进行操作。如未进行代码封装,则实验基准分降低。
自此实验结束,按照要求提交源代码进行检查。
编写web页面,完成对实验一数据库的操作
1、编写页面如图2.6所示
图2.6 数据库操作页面图
2、分别对应于2个表单编写后台处理逻辑(可以用JSP或Servlet进行处理),然后返回一个页面处理结果的页面,告知用户成功完成什么操作(如是进行了删除操作则信息相应改变),页面内有链接进行数据库数据的查询,如图2.7所示。
图2.7 数据库操作页面图
3、点击”查看数据库数据”则跳转到如图2.8所示页面,将数据库数据在页面中呈现出来,页面内有返回数据库操作页面的链接,点击即可跳转到数据库操作页面。
图2.8 数据库数据查询页面图
4、编码要求:重用实验一的JDBC封装类,通过该封装类来进行数据库的增删改查。
一、JBDC
使用泛型,java的反射机制:参考文章:reference1
(1)泛型:可以加强类型安全,减少类型转换
(2)java反射机制:可以取得任意一个已经class的内部信息,例如属性和方法
两个实体类:
Person:
package entity;
public class Person {
private String username;
private String name;
private String age;
private String teleno;
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getAge() {
return age;
}
public void setAge(String age) {
this.age = age;
}
public String getTeleno() {
return teleno;
}
public void setTeleno(String teleno) {
this.teleno = teleno;
}
public Person(String username, String name, String age, String teleno) {
super();
this.username = username;
this.name = name;
this.age = age;
this.teleno = teleno;
}
public Person(String username, String age, String teleno) {
super();
this.username = username;
this.age = age;
this.teleno = teleno;
}
public Person() {
super();
}
@Override
public String toString() {
return "Person [name=" + name + ", age=" + age + ", teleno=" + teleno + "]";
}
}
Users:
package entity;
public class Users {
private String username;
private String pass;
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public String getPass() {
return pass;
}
public void setPass(String pass) {
this.pass = pass;
}
public Users(String username, String pass) {
super();
this.username = username;
this.pass = pass;
}
public Users(String pass) {
super();
this.pass = pass;
}
public Users() {
super();
}
@Override
public String toString() {
return "Person [username=" + username + ", pass=" + pass+ "]";
}
}
DBUtil:数据库的连接,增删改查操作都在这里面。但是bug也在这里面,因为对于数据库的连接来说有很大的问题。但是这个地方我也没想明白。
package util;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;
import java.util.ResourceBundle;
import com.mysql.jdbc.PreparedStatement;
//公共数据库操作类
public class DBUtil {
// 数据库连接地址
public static String URL;
// 用户名
public static String USERNAME;
// 密码
public static String PASSWORD;
// mysql的驱动类
public static String DRIVER;
private static ResourceBundle rb = ResourceBundle.getBundle("util.db-config");
private DBUtil() {
}
// 使用静态块加载驱动程序
static {
URL = rb.getString("jdbc.url");
USERNAME = rb.getString("jdbc.username");
PASSWORD = rb.getString("jdbc.password");
DRIVER = rb.getString("jdbc.driver");
try {
Class.forName(DRIVER);
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
}
// 定义一个获取数据库连接的方法
public static Connection getConn() {
Connection conn = null;
try {
conn = DriverManager.getConnection(URL, USERNAME, PASSWORD);
} catch (SQLException e) {
e.printStackTrace();
System.out.println("获取连接失败");
}
return conn;
}
// 关闭数据库连接
/* public static void close(ResultSet rs, Connection conn,
PreparedStatement ps) {
if (rs != null) {
try {
rs.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
if (ps != null) {
try {
ps.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
if (conn != null) {
try {
conn.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
}*/
public static void close(Connection connection,
PreparedStatement preparedStatement) {
try {
preparedStatement.close();
connection.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
//插入、删除、修改
//有缺省
// public static boolean insertUpdateDelete(String sql, Object[] params)throws SQLException {
// Connection connection = getConn();
// PreparedStatement preparedStatement = null;
// int resultCode = -1;
// try {
// preparedStatement = (PreparedStatement) connection
// .prepareStatement(sql);
// for (int i = 1; i < params.length + 1; i++) {
// // 赋值的时候,索引是从1开始的
// preparedStatement.setObject(i, params[i - 1]);
// }
// resultCode = preparedStatement.executeUpdate();
// } catch (SQLException e) {
// e.printStackTrace();
// } finally {
// // 关闭连接
// close(connection, preparedStatement);
// }
// return resultCode == 1 ? true : false;
// }
/*增删改:0-失败 1-成功 -1-系统错误*/
public static int insertUpdateDelete(String sql)throws SQLException, ClassNotFoundException{
Connection connection = getConn();
PreparedStatement preparedStatement = null;
//ResultSet rs = null;
int resultCode = -1;
// 使用PreparedStatement:是Statement的子接口,可以传入带占位符的SQL语句,提供了补充占位符变量的方法
// resultCode执行sql返回的结果值
try
{
preparedStatement = (PreparedStatement) connection
.prepareStatement(sql);
//rs = preparedStatement.getGeneratedKeys();
resultCode = preparedStatement.executeUpdate();
if(resultCode>0){
//System.out.println("操作成功,受到影响的行数为:"+resultCode);
return 1;
}
else{
//System.out.println("操作失败");
return 0;
}
} catch(SQLException e){
return -1;
}catch(Exception e)
{
return -1;
}finally {
close(connection, preparedStatement);
}
//return resultCode == 1 ? true : false;
}
//查询所有或者根据条件查询
public static List<Object> select(String sql, Class classname,
Object[] params) {
// 获取数据库连接
Connection connection = getConn();
// 查询结果集
List<Object> objectList = new ArrayList<Object>();
try {
PreparedStatement preparedStatement = (PreparedStatement) connection
.prepareStatement(sql);
// 如果有查询条件
if (params != null) {
for (int i = 1; i < params.length + 1; i++) {
preparedStatement.setObject(i, params[i - 1]);
}
}
ResultSet resultSet = preparedStatement.executeQuery();
// 要查的列表数量
int columnCount = resultSet.getMetaData().getColumnCount();
while (resultSet.next()) {
// 构建一个对象实例
GenericClassBean<GenericClassBean> classBean = new GenericClassBean<GenericClassBean>(classname);
Object beanObject = classBean.getClassBean(classBean);
for (int i = 1; i <= columnCount; i++) {
// 获取查询的字段名称
String columnName = resultSet.getMetaData().getColumnName(i);
// 获取查询的字段的值
String value = resultSet.getString(i);
// 给对象属性赋值
GenericClassBean.setClassBeanPropertyValue(beanObject, columnName,
value);
}
objectList.add(beanObject);
}
} catch (SQLException e) {
e.printStackTrace();
}
return objectList;
}
public static int select(String sql, int flag) {
// TODO Auto-generated method stub
Connection connection = getConn();
try {
PreparedStatement preparedStatement = (PreparedStatement) connection
.prepareStatement(sql);
ResultSet resultSet = preparedStatement.executeQuery();
if(resultSet.next())
{
flag = 1;//不为空
}
else
{
flag = -2;//为空
}
// 要查的列表数量
int columnCount = resultSet.getMetaData().getColumnCount();
String[] colNames = new String[columnCount];
for(int i=0; i<columnCount; i++)
{
colNames[i] = resultSet.getMetaData().getColumnName(i+1);
System.out.print(colNames[i] +"\t" );
}
System.out.print("\n");
while(resultSet.next())
{
for(String colName:colNames){
if(resultSet.getString(colName)==null)
{
System.out.print(" ");
}
else
System.out.print(resultSet.getString(colName) + "\t");
}
System.out.println();
}
} catch (SQLException e) {
e.printStackTrace();
}
return flag;
}
}
GenericClassBean:
package util;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
/**
* 泛型类,获取实例化对象
*
* @param <T>
*/
public class GenericClassBean<T> {
private static Class beanClass;
public GenericClassBean(Class beanClass) {
this.beanClass = beanClass;
}
/**
* 获取对象示例
*
* @param t
* @return
*/
public T getClassBean(T t) {
try {
t = (T) beanClass.newInstance();
} catch (InstantiationException | IllegalAccessException e) {
e.printStackTrace();
}
return t;
}
/**
* 给对象属性赋值
*
* @param propertyName
* 对象的set方法名称
* @param paropertyValue
* 对象set方法set的值
*/
public static void setClassBeanPropertyValue(Object object,
String propertyName, String paropertyValue) {
Method method = null;
/*
* propertyName对应的是对象的属性名称,和数据库列名称也要相同,例如User类的属性有username,
* 对应的数据库字段也是username,对应的方法名称就是setUsername
*/
propertyName = propertyName.substring(0, 1).toUpperCase()
+ propertyName.substring(1);
String setMethod = "set" + propertyName;
try {
// 找到对象的set方法
method = beanClass.getMethod(setMethod, String.class);
} catch (NoSuchMethodException | SecurityException e) {
e.printStackTrace();
}
try {
// 调用方法set方法给属性赋值
method.invoke(object, paropertyValue);
} catch (IllegalAccessException | IllegalArgumentException
| InvocationTargetException e) {
e.printStackTrace();
}
}
}
一个用来测试的主函数:
package util;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import entity.Person;
public class MainTest {
private static final boolean False = false;
public static void menu()
{
System.out.println("\t请输入要进行的操作:\n");
System.out.println("\t1:插入操作"+"\t2:删除操作"+"\t3:修改操作"+"\t4:查询操作"+"\t5:打印表"+"\t\t6:退出\n" );
}
// public static void print_table(String table)
// {
// String operate = "select * from " + table;
// DBUtil.select(operate);
// }
public static String get_first_object(String str)//获取sql语句中的key
{
Pattern p1=Pattern.compile("\'(.*?)\'");
Matcher m = p1.matcher(str);
ArrayList<String> list = new ArrayList<String>();
while (m.find()) {
list.add(m.group().trim().replace("\'","")+" ");
}
String object = list.get(0);
return object;
}
public static void main(String[] args) throws SQLException, ClassNotFoundException {
// String selectSql_3 = "select * from person";
// List<Object> productList = DBUtil.select(selectSql_3, Person.class,
// null);
// System.out.print(productList.size());
// for (int i = 0; i < productList.size(); i++) {
// Person pro = (Person) productList.get(i);
// System.out.println("name"+pro.getName());
//
// }
String uname2 = "lyy";
String sql_query = "select * from users";
int flag = -1;
flag = DBUtil.select(sql_query, flag);
System.out.print(flag);
/*String uname = "";
String Default = "delete from person where username = " + "'"+uname+ "'";
int f = DBUtil.insertUpdateDelete(Default);
System.out.println(f);*/
// String uname2 = "ly";
// String sql_query = "select * from users";
// List<Object> productList = DBUtil.select(sql_query , Person.class,
// null);
// System.out.print(productList.size());
}
}
Mysql数据库的连接配置文件:
jdbc.url=jdbc:mysql://localhost:3306/my_sql?useUnicode=true&characterEncoding=utf-8&useSSL=false
jdbc.username=root
jdbc.password=1234
jdbc.driver=com.mysql.jdbc.Driver
二、servelet
看了这个博客感觉只写一个servelet就可以了,但是我。。还是太菜了。对JSP不太熟悉,对一些事件的响应不太会处理,所以用了两个servelet。参考博客:reference2
后来看一个相关的教学视频,里面的老师说对数据库的增删改查每种功能对应一个servelet。。。没什么经验,也不知道谁是对的。
参考:reference3 这个教程真的太棒了。很喜欢里面的老师,讲的很清楚。
关于post和get里面要分别写点什么还需要去学习。
MyController.java
package Myservlet;
import java.io.IOException;
import java.sql.SQLException;
import java.util.List;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import entity.Users;
import util.DBUtil;
/**
* Servlet implementation class MyController
*/
@WebServlet("/MyController")
public class MyController extends HttpServlet {
private static final long serialVersionUID = 1L;
private Object userList;
public MyController() {
super();
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//response.getWriter().append("Served at: ").append(request.getContextPath());
doPost(request, response);
}
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//doGet(request, response);
request.setCharacterEncoding("utf-8");
//获取前端的请求码
String requestCode = request.getParameter("requestCode");
int code = Integer.valueOf(requestCode);
int flag = -1;
switch(code)
{
case 1:
response.setContentType("text/html; charset=utf-8");
response.setCharacterEncoding("utf-8");
flag = -1;
String uname = request.getParameter("username");
String nname = request.getParameter("name");
// int aage = Integer.parseInt(request.getParameter("age"));
String aage = request.getParameter("age");
String tele = request.getParameter("teleno");
String sql = "insert into person values('" + uname + "','" + nname+ "','" + aage +"','"+ tele + "')";
try {
flag = DBUtil.insertUpdateDelete(sql);
} catch (ClassNotFoundException | SQLException e) {
e.printStackTrace();
}
response.setContentType("text/html; charset=utf-8");
response.setCharacterEncoding("utf-8");
if(flag==1)
{
response.getWriter().write("数据库操作结果: " + "成功插入person " + uname);
}
else
{
//response.getWriter().write("数据库操作结果: " + "插入失败");
response.getWriter().write("数据库操作结果: " + "成功插入person " + uname);
String Default = "insert into users values('" + uname + "','888888')";
try {
DBUtil.insertUpdateDelete(Default);
} catch (ClassNotFoundException | SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
try {
flag = DBUtil.insertUpdateDelete(sql);
} catch (ClassNotFoundException | SQLException e) {
e.printStackTrace();
}
}
response.getWriter().write("<br>"+"<a href='/JDBC_JSP_MVC/Queryallservlet'>查看数据库数据</a>");
break;
case 2:
flag = -1;
int flag2 = -1;
response.setContentType("text/html; charset=utf-8");
response.setCharacterEncoding("utf-8");
String uname2 = request.getParameter("username");
String sql2 = "delete from users where username = " + "'"+uname2+ "'";
String sql_query = "select * from users where username = '" + uname2 + "'";
flag2 = DBUtil.select(sql_query, flag2);
if(flag2 == -2)
{
response.getWriter().write("数据库操作结果: 该用户不存在");
}
else
{
try {
flag = DBUtil.insertUpdateDelete(sql2);
} catch (ClassNotFoundException | SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
//response.getWriter().write(flag+"");
if(flag==1)
{
response.getWriter().write("数据库操作结果: " + "成功从users表中删除 " + uname2);
}
/*else if(flag == 0)
{
//response.getWriter().write("数据库操作结果: " + "删除失败");
response.getWriter().write("数据库操作结果: 该用户不存在");
}*/
else
{
//response.getWriter().write("数据库操作结果: " + "删除失败");
response.getWriter().write("数据库操作结果: " + "成功从users表中删除 " + uname2);
String Default2 = "delete from person where username = " + "'"+uname2+ "'";
try {
DBUtil.insertUpdateDelete(Default2);
} catch (ClassNotFoundException | SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
try {
flag = DBUtil.insertUpdateDelete(sql2);
} catch (ClassNotFoundException | SQLException e) {
e.printStackTrace();
}
}
}
response.getWriter().write("<br>"+"<a href='/JDBC_JSP_MVC/Queryallservlet'>查看数据库数据</a>");
break;
}
}
}
Queryallservlet.java
package Myservlet;
import java.io.IOException;
import java.util.List;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import entity.Person;
import entity.Users;
import util.DBUtil;
@WebServlet("/Queryallservlet")
public class Queryallservlet extends HttpServlet {
private static final long serialVersionUID = 1L;
public Queryallservlet() {
super();
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
request.setCharacterEncoding("utf-8");
String sql1 = "select * from users";
List<Object> usersList = DBUtil.select(sql1, Users.class,
null);
String sql2 = "select * from person";
List<Object> personList = DBUtil.select(sql2, Person.class,
null);
request.setAttribute("usersList", usersList);
request.setAttribute("personList", personList);
request.getRequestDispatcher("DB_operate_result.jsp").forward(request, response);
}
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doGet(request, response);
}
}
三、JSP部分
DB_operate_result.jsp
<%@ page language="java" contentType="text/html; charset=utf-8"
pageEncoding="utf-8"%>
<%@page import="java.util.List"%>
<%@ page import = "util.DBUtil" %>
<%@ page import = "entity.Users" %>
<%@ page import = "entity.Person" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<title>数据库操作结果:</title>
<link href="style.css" type="text/css" rel="stylesheet" />
</head>
<body>
<h1>数据表user信息</h1>
<table>
<tr>
<th>username</th>
<th>password</th>
</tr>
<%
List<Object> usersList = (List<Object>)request.getAttribute("usersList");
for(int i = 0; i < usersList.size(); i++)
{
Users user = (Users) usersList.get(i);
%>
<tr>
<td><%= user.getUsername()%></td>
<td><%= user.getPass()%></td>
</tr>
<%
}
%>
</table>
<h1>数据表person信息</h1>
<table>
<tr>
<th>username</th>
<th>name</th>
<th>age</th>
<th>teleno</th>
</tr>
<%
List<Object> personList = (List<Object>)request.getAttribute("personList");
for(int i = 0; i < personList.size(); i++)
{
Person p = (Person) personList.get(i);
%>
<tr>
<td><%= p.getUsername()%></td>
<td><%= p.getName()%></td>
<td><%= p.getAge()%></td>
<td><%= p.getTeleno()%></td>
</tr>
<%
}
%>
</table>
<p><a href="insert_delete.jsp">返回数据库操作</a></p>
</body>
</html>
insert_delete.jsp
<%@ page language="java" contentType="text/html; charset=utf-8"
pageEncoding="utf-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html;charset=utf-8">
<title>数据库操作页面</title>
<link href="style.css" type="text/css" rel="stylesheet" />
</head>
<body>
<%!
String blanknull(String s)
{
return (s == null) ? "" : s;
}
%>
<form action="MyController" method = "POST">
<input type = "hidden" name = "requestCode" value = "1"/><br>
<table>
<tr><th colspan="8">数据表person插入信息:</th></tr>
<tr>
<td>username</td>
<td width="500px"><input type="text" name="username" onkeyup="this.value=this.value.replace(/\s+/g,'')"/></td>
</tr>
<tr>
<td>name</td>
<td><input type="text" name="name" onkeyup="this.value=this.value.replace(/\s+/g,'')"/></td>
</tr>
<tr>
<td>age</td>
<td><input type="text" name="age" /></td>
</tr>
<tr>
<td>teleno</td>
<td><input type="text" name="teleno"/></td>
</tr>
<tr><td colspan="8"><input type="submit" value="插入"></td></tr>
</table>
<br>
</form>
<form action="MyController" method = "POST">
<input type = "hidden" name = "requestCode" value = "2"/><br>
<table>
<tr><th colspan="8">数据表user删除信息:</th></tr>
<tr>
<td>username</td>
<td width="500px"><input type="text" name="username" onkeyup="this.value=this.value.replace(/\s+/g,'')"/></td>
</tr>
<tr>
<td colspan="8"><input type="submit" value="删除" /></td>
</tr>
</table>
</form>
</body>
</html>
style.css
@charset "UTF-8";
body
{
width: 50%;
margin: 0 auto;
text-align: center;
}
table {
margin: 0 auto;
border-collapse:collapse;
}
table, th, td{
border: 1px solid black;
}
th, td{
padding: 5px 10px;
}
关于这部分其实我还有很多的疑问,来日方长,慢慢解决,总有一天我会明白的。
JSP表单传值:reference4
Web.xml文件配置:reference5
项目的github地址:https://github.com/grace55555/my_first_repository.git
有什么错误的地方或是什么有帮助的指点请留言。感谢。