1.ssm整合的原理
2.创建maven工程并配置
1)web更换为4.0,之前版本过低会出严重bug
2)引入所需依赖
引入依赖
<dependencies>
<!--引入pageHeler-->
<dependency>
<groupId>com.github.pagehelper</groupId>
<artifactId>pagehelper</artifactId>
<version>5.3.0</version>
</dependency>
<!--spring-webmvc依赖-->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>5.2.15.RELEASE</version>
</dependency>
<!--mybatis依赖-->
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.5.6</version>
</dependency>
<!--mybatis和spring整合的依赖-->
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis-spring</artifactId>
<version>2.0.6</version>
</dependency>
<!--mysql驱动-->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.28</version>
</dependency>
<!--druid连接池依赖-->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid</artifactId>
<version>1.2.4</version>
</dependency>
<!--lombok依赖-->
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.18.24</version>
</dependency>
<!--jackson java对象转换为json对象 @ResponseBody-->
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>2.13.2.2</version>
</dependency>
<!--servlet-api依赖-->
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>javax.servlet-api</artifactId>
<version>4.0.1</version>
</dependency>
<!--spring-jdbc依赖-->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-jdbc</artifactId>
<version>5.2.15.RELEASE</version>
</dependency>
<!--generator依赖-->
<dependency>
<groupId>org.mybatis.generator</groupId>
<artifactId>mybatis-generator-core</artifactId>
<version>1.4.0</version>
</dependency>
<!--junit单元测试依赖-->
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
<scope>compile</scope>
</dependency>
</dependencies>
3)spring配置文件
<!--包扫描-->
<context:component-scan base-package="com.zsy"/>
<!--开启注解驱动-->
<mvc:annotation-driven/>
<!--放行静态资源-->
<mvc:default-servlet-handler/>
<!--配置数据源-->
<bean id="ds" class="com.alibaba.druid.pool.DruidDataSource">
<property name="driverClassName" value="com.mysql.cj.jdbc.Driver"/>
<property name="url" value="jdbc:mysql://localhost:3306/mydb?serverTimezone=Asia/Shanghai"/>
<property name="username" value="root"/>
<property name="password" value="1234"/>
<property name="maxActive" value="20"/>
<property name="minIdle" value="5"/>
<property name="initialSize" value="5"/>
<!--maxWait 最大等待时间 单位 毫秒-->
<property name="maxWait" value="3000"/>
</bean>
<!--SqlSessionFactory 整合mybatis-->
<bean id="sessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
<property name="dataSource" ref="ds"/>
<!--设置mybatis映射文件的路径-->
<property name="mapperLocations" value="classpath:"/>
<property name="plugins">
<array>
<bean class="com.github.pagehelper.PageInterceptor"></bean>
</array>
</property>
</bean>
<!--生成dao接口的代理实现类-->
<bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
<!--为com.zsy.dao包下的接口生成代理实现类-->
<property name="basePackage" value="com.zsy.dao"/>
</bean>
4)web配置文件
<servlet>
<servlet-name>dispatcherServlet</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:appliction.xml</param-value>
</init-param>
<!--tomcat启动时创建DipatcherServlet 默认当访问controller路径时创建-->
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>dispatcherServlet</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
<filter>
<filter-name>encodingFilter</filter-name>
<filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
<init-param>
<param-name>encoding</param-name>
<param-value>utf-8</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>encodingFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
5)使用generator快速生成代码
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE generatorConfiguration
PUBLIC "-//mybatis.org//DTD MyBatis Generator Configuration 1.0//EN"
"http://mybatis.org/dtd/mybatis-generator-config_1_0.dtd">
<generatorConfiguration>
<!--使用的mysql的jar包路径-->
<classPathEntry location="E:\repMaven\mysql\mysql-connector-java\8.0.28\mysql-connector-java-8.0.28.jar" />
<context id="DB2Tables" targetRuntime="MyBatis3">
<!--抑制注释 suppressAllComments:抑制全部注释-->
<commentGenerator>
<property name="suppressAllComments" value="true" />
</commentGenerator>
<!--数据源(库)的配置信息-->
<jdbcConnection driverClass="com.mysql.cj.jdbc.Driver"
connectionURL="jdbc:mysql://localhost:3306/mydb?serverTimezone=Asia/Shanghai"
userId="root"
password="1234">
<property name="nullCatalogMeansCurrent" value="true" />
</jdbcConnection>
<javaTypeResolver >
<property name="forceBigDecimals" value="false" />
</javaTypeResolver>
<!--java实体类的配置-->
<javaModelGenerator targetPackage="com.zsy.entity" targetProject=".\src\main\java">
<property name="enableSubPackages" value="true" />
<property name="trimStrings" value="true" />
</javaModelGenerator>
<!--映射文件的配置-->
<sqlMapGenerator targetPackage="mapper" targetProject=".\src\main\resources">
<property name="enableSubPackages" value="true" />
</sqlMapGenerator>
<!--dao数据访问层的配置-->
<javaClientGenerator type="XMLMAPPER" targetPackage="com.zsy.dao" targetProject=".\src\main\java">
<property name="enableSubPackages" value="true" />
</javaClientGenerator>
<!--数据库表和实体的映射关系
schema:数据库名称
tableName: 表名
domainObjectName:实体类名
enableCountByExample:是否生成复杂的添加操作
enableUpdateByExample:是否生成复杂的修改操作
enableSelectByExample:是否生成复杂的查询操作
enableDeleteByExample:是否生成复杂的删除操作
-->
<table schema="mydb" tableName="tb_student" domainObjectName="Student"
enableUpdateByExample="false" enableSelectByExample="false" enableDeleteByExample="false" enableCountByExample="false">
</table>
<!--<table schema="mydb" tableName="tbl_user" domainObjectName="User"
enableUpdateByExample="false" enableSelectByExample="false" enableDeleteByExample="false" enableCountByExample="false">
</table>-->
</context>
</generatorConfiguration>
测试代码:
public class TestGenerator {
@Test
public void test02() throws Exception{
List<String> warnings = new ArrayList<String>();
boolean overwrite = true;
File configFile = new File("generator.xml");
ConfigurationParser cp = new ConfigurationParser(warnings);
Configuration config = cp.parseConfiguration(configFile);
DefaultShellCallback callback = new DefaultShellCallback(overwrite);
MyBatisGenerator myBatisGenerator = new MyBatisGenerator(config, callback, warnings);
myBatisGenerator.generate(null);
}
}
使用 generator生成了dao、entity、mapper文件
3.实现主页面(查询)
service实体类层代码:
@Service
public class StudentServiceImpl implements StudentService {
//交予spring管理
@Autowired
private StudentMapper sm;
public PageInfo<Student> find(Integer currentPage, Integer pageSize,Map map) {
PageHelper.startPage(currentPage,pageSize);
List<Student> l = sm.findAll(map);
PageInfo<Student> pageInfo = new PageInfo<Student>(l);
return pageInfo;
}
}
controller操作层代码:
@RestController
@RequestMapping("student")
public class StudentController {
@Autowired
private StudentService ss;
//查询
@RequestMapping("select")
public CommonResult select(Integer currentPage, Integer pageSize, @RequestBody Map map){
PageInfo<Student> lsit = ss.find(currentPage, pageSize,map);
return new CommonResult(2000,"查询成功",lsit);
}
}
前端界面代码:
<%--
Created by IntelliJ IDEA.
User: Z
Date: 2022/6/15
Time: 15:23
To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>Title</title>
<!--引入element得css样式-->
<link rel="stylesheet" href="css/index.css" target="_blank" rel="external nofollow" >
<!--引入vue得js文件 这个必须在element之前引入-->
<script type="text/javascript" src="js/vue.js"></script>
<script type="text/javascript" src="js/axios.min.js"></script>
<script type="text/javascript" src="js/qs.min.js"></script>
<!--element得js文件-->
<script type="text/javascript" src="js/index.js"></script>
</head>
<body >
<!--创建一个标签使vue挂载到该标签上-->
<div id="app">
<el-button type="primary" @click="addDialogVisible = true">添加</el-button>
<el-button type="primary" @click="quit">退出</el-button>
<%--搜索框--%>
<el-form :inline="true" :model="searchForm" class="demo-form-inline">
<el-form-item label="姓名">
<el-input v-model="searchForm.name" placeholder="姓名"></el-input>
</el-form-item>
<el-form-item label="地址">
<el-input v-model="searchForm.address" placeholder="地址"></el-input>
</el-form-item>
<el-form-item>
<el-button type="primary" @click="onSearch">查询</el-button>
</el-form-item>
</el-form>
<el-dialog
title="添加学生信息"
:visible.sync="addDialogVisible"
width="30%">
<!--:model==绑定表单数据-->
<el-form :model="addform" :rules="addRules" ref="addRuleForm">
<el-form-item label="姓名" label-width="80px" prop="name">
<el-input v-model="addform.name" autocomplete="off"></el-input>
</el-form-item>
<el-form-item label="地址" label-width="80px" prop="address">
<el-input v-model="addform.address" autocomplete="off"></el-input>
</el-form-item>
</el-form>
<span slot="footer" class="dialog-footer">
<el-button @click="addDialogVisible = false">取 消</el-button>
<el-button type="primary" @click="addStu">确 定</el-button>
</span>
</el-dialog>
<el-dialog
title="修改学生信息"
:visible.sync="editDialogVisible"
width="30%">
<!--:model==绑定表单数据-->
<el-form :model="editform" :rules="addRules" ref="editRuleForm">
<el-form-item label="姓名" label-width="80px" prop="name">
<el-input v-model="editform.name" autocomplete="off"></el-input>
</el-form-item>
<el-form-item label="地址" label-width="80px" prop="address">
<el-input v-model="editform.address" autocomplete="off"></el-input>
</el-form-item>
</el-form>
<span slot="footer" class="dialog-footer">
<el-button @click="editDialogVisible = false">取 消</el-button>
<el-button type="primary" @click="editStu">确 定</el-button>
</span>
</el-dialog>
<el-table
:data="tableData"
border
style="width: 100%">
<el-table-column
prop="id"
label="学生编号"
>
</el-table-column>
<el-table-column
prop="name"
label="学生姓名"
>
</el-table-column>
<el-table-column
prop="address"
label="学生住址">
</el-table-column>
<el-table-column
fixed="right"
label="操作"
>
<template slot-scope="scope">
<el-button @click="edit(scope.row)" type="success" size="small" icon="el-icon-edit" plain>编辑</el-button>
<el-button type="danger" size="small" icon="el-icon-delete" @click="del(scope.row.id)" plain>删除</el-button>
</template>
</el-table-column>
</el-table>
<%--
分页组件
size-change:页面显示条数改变时触发的事件
current-change:页码改变时触发的事件
current-page:当前的页面
page-sizes:接受一个整型数组,数组元素为展示的选择每页显示个数的选项
page-size:每页显示的条数
--%>
<el-pagination
@size-change="handleSizeChange"
@current-change="handleCurrentChange"
:current-page="currentPage"
:page-sizes=pageSizes
:page-size=pageSize
layout="total, sizes, prev, pager, next, jumper"
:total="total">
</el-pagination>
</div>
</body>
<script>
var app = new Vue({
el: "#app",
data: {
//搜索表单
searchForm:{},
//当前显示的页面变量
currentPage:1,
pageSizes:[5,10,15,20],
pageSize:5,
//总条数
total:0,
tableData: [],
//对话框的显示和隐藏 如果为false则隐藏 如果为true则显示
addDialogVisible: false,
//添加表单的数据
addform: {},
//对话框的显示和隐藏 如果为false则隐藏 如果为true则显示
editDialogVisible:false,
//修改表单的数据
editform:{},
//定义添加表单数据的校验
addRules: {
name: [
{required: true, message: '姓名不能为空', trigger: 'blur'}
],
age: [
{required: true, message: '年龄不能为空'},
{type: 'number', message: '年龄必须为数字'}
],
address:[
{required: true, message: '地址不能为空'}
]
}
},
//页面加载后执行
created() {
this.initTable();
},
methods: {
//搜索按钮事件
onSearch(){
this.currentPage = 1;
this.initTable()
},
//每页显示的条数大小改变时触发的方法
handleSizeChange(val) {
this.pageSize = val;
this.initTable();
},
//页码改变时触发的方法
handleCurrentChange(val) {
this.currentPage = val;
this.initTable();
},
//初始化表格数据
initTable() {
var that = this;
axios.post("/student/select?currentPage="+
this.currentPage+"&pageSize="+
this.pageSize,this.searchForm).then(function (result) {
if (result.data.code === 2000) {
that.tableData = result.data.data.list;
that.total = result.data.data.total;
}
})
},
del(id) {
var that = this;
var qs = Qs;
axios.post("/Student/delete", qs.stringify({"method": "delete", "id": id})).then(function (result) {
if (result.data.code === 2000) {
that.tableData = result.data.data;
that.initTable();
}
})
},
//添加的点击事件
addStu(){
this.$refs['addRuleForm'].validate((valid) => {
if (valid) { //表单校验通过
var qs=Qs;
var that=this;
axios.post("/Student/insert",qs.stringify(this.addform)).then(function(result){
if(result.data.code===2000){
that.$message.success(result.data.msg);
that.initTable();//重新加载表格
that.addform = {};//重置添加表单
that.addDialogVisible=false; //隐藏弹出层
}
})
}
});
},
//修改按钮点击事件
edit(row){
//显示修改弹出层
this.editDialogVisible=true;
//回显数据
this.editform=row;
},
//确认修改
editStu(){
var that=this;
var qs=Qs;
this.$refs['editRuleForm'].validate((valid) => {
if (valid) { //表单校验通过
axios.post("/Student/update",qs.stringify(this.editform)).then(function(result){
if(result.data.code===2000){
that.$message.success(result.data.msg);//弹出成功的消息
that.editDialogVisible=false; //隐藏修改对话框
that.initTable(); //重新加载表格数据
}
})
}
});
},
//退出
quit(){
axios.post("/user/quit").then(function (result){
location.href = "login.jsp"
})
}
}
})
</script>
</html>
4.添加
service层
//添加
public CommonResult add(Student s) {
int i = sm.insert(s);
return new CommonResult(2000,"添加成功",null);
}
controller操作层:
//添加
@RequestMapping("insert")
public CommonResult insert(Student s){
CommonResult add = ss.add(s);
return add;
}
5.修改
service层
//修改
public CommonResult upd(Student s) {
int i = sm.updateByPrimaryKey(s);
return new CommonResult(2000,"修改成功",null);
}
controller操作层:
//修改
@RequestMapping("update")
public CommonResult update(Student s){
CommonResult upd = ss.upd(s);
return upd;
}
6.删除
service层
//删除
public CommonResult del(Integer id) {
int i = sm.deleteByPrimaryKey(id);
return new CommonResult(2000,"删除成功",null);
}
controller操作层:
//删除
@RequestMapping("delete")
public CommonResult delete(Integer id){
CommonResult del = ss.del(id);
return del;
}