JDBC
首先通过jdbc连接数据库
public static <T> T select(String sql,Class<T> c,Object ...params){
//注册驱动
try {
Class.forName("com.mysql.cj.jdbc.Driver");
//获取连接
Connection con = DriverManager.getConnection("jdbc:mysql://localhost:3307/summercamp2023?characterEncoding=utf8&useSSL=false&serverTimezone=Asia/Shanghai&allowPublicKeyRetrieval=true", "root", "123456");
//statement执行sql
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();//结果集rs得到的结果集元数据
int columCount=md.getColumnCount();//获取结果集的总列数
T t = null;
//解析
if (rs.next()) {
t=c.newInstance();
for (int i = 1; i <= columCount; i++){
Object value=rs.getObject(i);
if (value!=null){
String colunmName =md.getColumnName(i);
Field f = c.getDeclaredField(colunmName);
f.setAccessible(true);
f.set(t,value);
}
}
return t;
}
preState.close();
con.close();
} catch (Exception e) {
e.printStackTrace();
}
return null;
}
图中使用的是prepareStatement方法提前获取sql语句可以防止SQL注入,
上图写的是一个查询方法,只返回一行结果,要返回多行就需要用列表去接受
下图是写入增删改
PreparedStatement preState = con.prepareStatement(sql);
for (int i = 0; i < params.length; i++) {
preState.setObject(i+1,params[i]);
}
ResultSet rs = preState.executeQuery();
int i = preState.executeUpdate();
preState.close();
con.close();
return i;
然后就是java部分,这时就不能像以前一样所有的东西写在一个类中,
要采用架构的方式。
DAO层——对数据库的操作
DAO层:持久层,与数据库进行交互。
DAO层首先会创建DAO接口,然后在配置文件中定义该接口的具体实现类,接着就可以在模块中调用DAO的接口并进行相应数据业务的处理,不需要去关注该接口的具体实现类是什么。
Service层
service层:业务层,用来控制业务。
Service层主要负责业务模块的逻辑应用设计,先创建接口,再创建相应的实现类。
Controller层
Controller层:控制层,控制业务逻辑流程。
Controller层负责具体的业务模块流程的控制,主要调用Service层里面的接口去控制具体的业务流程,控制的配置也需要在配置文件中进行配置。
pojo层
pojo层:实体层,用于存放实体类,与数据库中的属性值基本保持一致,包含有该实体类的属性和对应属性的get、set方法。
utils是工具类用于存放各种工具和需要重复利用的封装好的方法
然后是web层用来存放前端的数据
然后需要配置Tomcat服务器
在服务器配置中找到你本地的tomcat目录并添加进去
需要注意的是在javaweb的结构下导入的jar包必须放在web目录下
最后通过serverlet打通前后端
在controller类中运用serverlet把数据传到页面中
@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("测试访问doget...");
List<Dept> list = deptService.list();
System.out.println(list);
JsonUtil.transJson(list,resp);
}
}
图中JsonUtil是工具类中封装好的查询方法
前端通过vue把传来的数据显示出来
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
<script src="/vue/vue.min.js"></script>
<script src="/vue/axios.min.js"></script>
<style>
th{
border: 1px solid black;
width: 150px;
height: 50px;
}
td{
border: 1px solid black;
width: 150px;
height: 50px;
}
</style>
</head>
<body>
<div id="app">
<button @click="showDept">点击显示数据</button>
<table style="border: 1px solid black;">
<tr>
<th>序号</th>
<th>部门名称</th>
<th>部门位置</th>
<th>部门领导</th>
<th>操作 | <button @click="add">新增</button></th>
</tr>
<tr v-for="dept in deptList">
<td>{{dept.did}}</td>
<td>{{dept.dname}}</td>
<td>{{dept.dlocation}}</td>
<td>{{dept.leader}}</td>
<td></td>
</tr>
</table>
<div v-show="isInputShow">
<input type="text" v-model="dept.did" placeholder="请输入序号"><br>
<input type="text" v-model="dept.dname" placeholder="请输入部门名称"><br>
<input type="text" v-model="dept.dlocation" placeholder="请输入部门位置"><br>
<input type="text" v-model="dept.leader" placeholder="请输入部门领导"><br>
<input type="submit" @click="insert"><br>
</div>
</div>
</body>
<script>
new Vue({
el:'#app',
data:{
deptList:[],
dept:{did:'',dname:'',dlocation:'',leader:''},
isInputShow:false
},
methods:{
showDept(){
axios.get('http://localhost:8080/deptC').then((resp)=>{
console.log(resp,resp.data)
this.deptList=resp.data
})
},
add(){
this.isInputShow=!this.isInputShow
},
insert(){
this.deptList.push(this.dept)
}
}
})
</script>
</html>