目录
前言
昨天给大家分享了IDEA与Mysql5.7的安装与使用方法,以及jdbc的简单连接方法,这样简单的连接依旧无法实现更高端的效果,今天给大家分享进阶的学习,昨天分享的jdbc工具类还可优化,减小内存,优化后的方法可直接调用
jdbc工具类
//查询多行多列
public static <T> List<T> list(String sql, Class<T> c,Object ... params) {
List<T> tList = new ArrayList<>();
try {
//1.注册驱动-反射去加载jar包中的com.mysql.jdbc.Driver这个类中的DriverManager.registerDriver(new Driver());
Class.forName("com.mysql.jdbc.Driver");
//2.获取连接对象
Connection con = DriverManager.getConnection("jdbc:mysql://localhost:3306/summer-camp2023?characterEncoding=utf-8", "root", "123456");
System.out.println(con);
//3.定义sql
//4.需要创建statement
PreparedStatement preState = con.prepareStatement(sql);
for (int i = 0; i < params.length; i++) {
preState.setObject(i+1,params[i]);
}
// 执行查询语句,返回结果集
ResultSet rs = preState.executeQuery();
//结果集rs得到结果集元数据
ResultSetMetaData md = rs.getMetaData();
//获取结果集的总列数
int columnCount = md.getColumnCount();
//6.解析rs
while (rs.next()) {
T t = c.newInstance();
//1.取出某一行的每个数据,封装到对象t的属性中
for (int i = 1; i <=columnCount; i++) {
//通过列序号,获取每一列值
Object value = rs.getObject(i);
if (value != null) {
//通过列序号获取每一列名
String columnName = md.getColumnName(i);
Field f = c.getDeclaredField(columnName);
//赋予私有属性赋值权限
f.setAccessible(true);
//使用反射,把value给到对象t的属性中
f.set(t, value);
}
}
//存入集合
tList.add(t);
}
//7.关闭资源
preState.close();
con.close();
}catch(Exception e){
e.printStackTrace();
}
return tList;
}
//查询一行
public static <T> T selectRow(String sql, Class<T> c,Object ... params) {
try {
// 注册驱动
Class.forName("com.mysql.jdbc.Driver");
// 获取连接对象
Connection con = DriverManager.getConnection("jdbc:mysql://localhost:3306/summer-camp2023?characterEncoding=utf-8", "root", "123456");
// 创建Statement
PreparedStatement preState = con.prepareStatement(sql);
for (int i = 0; i < params.length; i++) {
preState.setObject(i+1,params[i]);
}
// 执行查询语句,返回结果集
ResultSet rs = preState.executeQuery();
// 获取结果集元数据
ResultSetMetaData md = rs.getMetaData();
// 获取结果集的总列数
int columnCount = md.getColumnCount();
// 解析结果集
T t=null;
if (rs.next()) {
t = c.newInstance();
// 将每一列的数据封装到对象result的属性中
for (int i = 1; i <= columnCount; i++) {
// 获取每一列的值
Object value = rs.getObject(i);
if (value != null) {
// 获取每一列的列名
String columnName = md.getColumnName(i);
Field f = c.getDeclaredField(columnName);
// 赋予私有属性赋值权限
f.setAccessible(true);
// 使用反射,将value赋值给对象result的属性
f.set(t, value);
}
}
return t;
}
// 关闭资源
preState.close();
con.close();
} catch (Exception e) {
e.printStackTrace();
}
return null;
}
//查询一列
public static <T> List<T> selectColumn(String sql,Class<T> c,Object ... params) {
List<T> tList = new ArrayList<>();
try {
//1.注册驱动-反射去加载jar包中的com.mysql.jdbc.Driver这个类中的DriverManager.registerDriver(new Driver());
Class.forName("com.mysql.jdbc.Driver");
//2.获取连接对象
Connection con = DriverManager.getConnection("jdbc:mysql://localhost:3306/summer-camp2023?characterEncoding=utf-8", "root", "123456");
// 创建Statement
PreparedStatement preState = con.prepareStatement(sql);
for (int i = 0; i < params.length; i++) {
preState.setObject(i+1,params[i]);
}
// 执行查询语句,返回结果集
ResultSet rs = preState.executeQuery();
//结果集rs得到结果集元数据
ResultSetMetaData md = rs.getMetaData();
//获取结果集的总列数
int columnCount = md.getColumnCount();
//6.解析rs
while (rs.next()) {
//通过列序号,获取每一列值
T t = (T) rs.getObject(1);
//存入集合
tList.add(t);
}
//7.关闭资源
preState.close();
con.close();
}catch(Exception e){
e.printStackTrace();
}
return tList;
}
//查询单个
public static <T> T selectOne(String sql,Class<T> c,Object ... params) {
try {
//1.注册驱动-反射去加载jar包中的com.mysql.jdbc.Driver这个类中的DriverManager.registerDriver(new Driver());
Class.forName("com.mysql.jdbc.Driver");
//2.获取连接对象
Connection con = DriverManager.getConnection("jdbc:mysql://localhost:3306/summer-camp2023?characterEncoding=utf-8", "root", "123456");
System.out.println(con);
//3.定义sql
PreparedStatement preState = con.prepareStatement(sql);
for (int i = 0; i < params.length; i++) {
preState.setObject(i+1,params[i]);
}
// 执行查询语句,返回结果集
ResultSet rs = preState.executeQuery();
//结果集rs得到结果集元数据
ResultSetMetaData md = rs.getMetaData();
//获取结果集的总列数
int columnCount = md.getColumnCount();
//6.解析rs
//1.取出某一行的每个数据,封装到对象t的属性中
//通过列序号,获取每一列值
T t=null;
if (rs.next()){
t = (T)rs.getObject(1);
}
//7.关闭资源
preState.close();
con.close();
return t;
}catch(Exception e){
e.printStackTrace();
}
return null;
}
//增删改
public static int update(String sql,Object ... params) {
try {
//1.注册驱动-反射去加载jar包中的com.mysql.jdbc.Driver这个类中的DriverManager.registerDriver(new Driver());
Class.forName("com.mysql.jdbc.Driver");
//2.获取连接对象
Connection con = DriverManager.getConnection("jdbc:mysql://localhost:3306/summer-camp2023?characterEncoding=utf-8", "root", "123456");
System.out.println(con);
//3.定义sql
//4.需要创建statement
PreparedStatement preState = con.prepareStatement(sql);
for (int i = 0; i < params.length; i++) {
preState.setObject(i+1,params[i]);
}
// 执行查询语句,返回结果集
int i = preState.executeUpdate();
//7.关闭资源
preState.close();
con.close();
return i;
}catch(Exception e){
e.printStackTrace();
}
return 0;
}
我们构建一个好的web应用,需要有层次结构,这样层次分明,检查错误时也更方便
三层架构
三层架构分为:数据(dao)层、 业务(service)层、控制(controller)层
代码顺序:
1.数据库表
2.实体层
3.dao层、daoimpl
4.service层、serviceimpl
5.controller层
web的搭建首先建好数据库与实体类,然后先从dao层开始调用jdbc工具类的方法,然后层层调用。要想数据库的数据显示在web页面上,首先需要前端html页面,在前端上可以写表单,提交给servlet,然后通过doget或dopost方法进行数据处理,而今天给大家分享可不一样。
今日重磅
JsonUtil工具类
有了这个工具类就无须表单和servlet了,在java代码上即可处理,受到中文字符集影响,需改成utf-8,以保证不出现乱码
package com.hp.utils;
import com.alibaba.fastjson.JSON;
import javax.servlet.http.HttpServletResponse;
public class JsonUtil {
public static void transJson(Object obj, HttpServletResponse resp){
try{//数据化转化成json,再响应给浏览器
String josn_string = JSON.toJSONString(obj);
resp.setContentType("application/json;charset=utf-8");
resp.getWriter().write(josn_string);
}catch (Exception e){
e.printStackTrace();
}
}
}
import com.hp.pojo.Dept; import com.hp.service.IDeptService; import com.hp.service.impl.DeptServiceImpl; import com.hp.utils.JsonUtil; 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 java.io.IOException; import java.util.List; @WebServlet("/deptC") public class DeptC extends HttpServlet { private IDeptService deptService =new DeptServiceImpl(); @Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { System.out.println("测试"); List<Dept> list = deptService.list(); System.out.println(list); //数据化转化成json,再响应给浏览器 JsonUtil.transJson(list,resp); } }
再由上面这段controller层调用service层并实例化,即可完成将数据转换响应给浏览器。
前端web页面搭建
做好了前面这些就可以开始图形化的设计了,制作自己喜欢的网页样式
我的页面中用到了JavaScript+vue 来搭建,大家可根据所思所想,去实践。