• springboot+springm vc+mybatis实现增删改查案例!


    大家好,我是雄雄,欢迎关注微信公众号【雄雄的小课堂】。

    前言

    最近这几天都在看关于springboot的内容,每天新会获得点新收获,并且都总结发在公众号中;最后经过不懈努力,不断查找相关网页,解决各种各样的问题,终于搭建出来了个新版的“S(springboot)S(springmvc)M(mybatis)框架”,下面是搭建步骤。

    01

    在idea中创建springboot项目

    在idea编辑器中,点击File->New->Project->Spring Initializr->选择jdk版本为1.8,然后点击Next

    然后按照下图修改各个输入框的值,然后点击Next

    选择web,勾上spring web

    接下来选择sql,勾上对应的jdbc,mybaits和mysql driver,然后点击Next

    然后点击Finish,新建完的项目结构如下:

    到现在为止,一个崭新的springboot+Maven项目就搭建好了,接下来我们来配置一下pom.xml文件。

    02

    配置pom.xml文件

    由于我们前端需要使用jsp来展示数据,所以pom.xml文件里面需要配置一个编译解析jsp页面的依赖,代码如下:

    <!--用于解析jsp页面-->
            <dependency>
                <groupId>org.apache.tomcat.embed</groupId>
                <artifactId>tomcat-embed-jasper</artifactId>
            </dependency>
            <dependency>
                <groupId>org.apache.tomcat</groupId>
                <artifactId>tomcat-jsp-api</artifactId>
            </dependency>
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-tomcat</artifactId>
                <scope>provided</scope>
            </dependency>

    在首页我这边需要用到jstl来展示数据,所以还需要导入jstl的相关依赖,如下所示:

    <!--jstl相关依赖-->
            <dependency>
                <groupId>javax.servlet</groupId>
                <artifactId>javax.servlet-api</artifactId>
            </dependency>
            <dependency>
                <groupId>javax.servlet</groupId>
                <artifactId>jstl</artifactId>
            </dependency>

    03

    编写application.properties文件

    虽然springboot对配置文件简化了很多,但是必要的配置还是要有的, 那么这些配置就都放在了application.properties文件中,也有的项目中是application.yml文件,在这里我们以application.properties文件为例:

    首先需要配置一下服务器的端口号,默认为8080,也可以改,代码如下:

    #服务器端口号
    server.port=8080

    配置数据池:

    #配置数据池
    spring.datasource.url=jdbc:mysql://localhost:3306/schooldb
    spring.datasource.driver-class-name=com.mysql.jdbc.Driver
    spring.datasource.username=root
    spring.datasource.password=root

    配置mybatis的别名:

    #起别名
    mybatis.type-aliases-package=com.xiongxiong.entity

    配置日志信息:

    #配置日志
    logging.level.com.xiongxiong.dao = debug
    logging.file.path=log/
    logging.file.name=book.log

    配置springmvc的内容

    #配置springmvc的内容
    #页面默认前缀配置
    spring.mvc.view.prefix=/
    #页面默认后缀配置
    spring.mvc.view.suffix=.jsp

    这是些基础的配置,如果还有其他扩展,可以自行添加配置信息。

    04

    搭建底层的三层架构(数据库脚本和结构在文末)

    BookManage

    在com.xiongxiong下面新建包entity,存放实体类BookManage,按照数据库表中的字段,对应写实体类的属性,最后getter和setter,代码如下:

    package com.xiongxiong.entity;
    
    import org.springframework.format.annotation.DateTimeFormat;
    
    import java.util.Date;
    
    public class BookManage {
    
        private int bid;
        private String bname;
        private String bauthor;
    
        @DateTimeFormat(pattern = "yyyy-MM-dd")
        private Date btime;
        private int btype;
    
        public int getBid() {
            return bid;
        }
    
        public void setBid(int bid) {
            this.bid = bid;
        }
    
        public String getBname() {
            return bname;
        }
    
        public void setBname(String bname) {
            this.bname = bname;
        }
    
        public String getBauthor() {
            return bauthor;
        }
    
        public void setBauthor(String bauthor) {
            this.bauthor = bauthor;
        }
    
        public Date getBtime() {
            return btime;
        }
    
        public void setBtime(Date btime) {
            this.btime = btime;
        }
    
        public int getBtype() {
            return btype;
        }
    
        public void setBtype(int btype) {
            this.btype = btype;
        }
    }

    BookManageMapper

    在com.xiongxiong中新建包dao,在该包中创建接口BookManageMapper,分别编写增删改以及查询全部和根据编号查询的接口。

    package com.xiongxiong.dao;
    
    import com.xiongxiong.entity.BookManage;
    import org.apache.ibatis.annotations.*;
    import org.springframework.stereotype.Component;
    import org.springframework.stereotype.Repository;
    import org.springframework.web.bind.annotation.ResponseBody;
    
    import java.util.List;
    
    @Mapper //证明是mybatis的mapper文件
    @Repository     //证明这是dao层
    public interface BookManageMapper {
    
    
        @Select("select * from BookManage;")
        //查询全部
        List<BookManage> findBookAll();
    
        @Insert("insert into bookmanage (bname,bauthor,btime,btype) value(#{bname},#{bauthor},#{btime},#{btype});")
        //添加
        int addBook(BookManage bookManage);
    
        @Delete("delete from BookManage where bid = #{bid};")
        //删除
        int delBook(int bid);
    
        @Update("update bookmanage set bname=#{bname},bauthor=#{bauthor},btime=#{btime},btype=#{btype} where bid = #{bid}")
        //修改
        int updateBook(BookManage bookManage);
    
        @Select("select * from bookmanage where bid = #{bid}")
        //根据编号查询编号
        BookManage findBookById(int bid);
    }

    需要注意的是,由于我们统一都使用注解的方式,所以不用在编写SQL映射文件(mapper),所有的sql语句通过注解方式实现,详情请看代码,各个功能都有相应的注释。

    IBookManageService和BookManageServiceImpl

    同样,在com.xiongxiong包下面创建service包存放业务的接口,在service包下面新建impl包,存放的是业务接口的实现类,代码如下:

    IBookManageService

    package com.xiongxiong.service;
    
    import com.xiongxiong.entity.BookManage;
    import org.apache.ibatis.annotations.Delete;
    import org.apache.ibatis.annotations.Insert;
    import org.apache.ibatis.annotations.Select;
    import org.apache.ibatis.annotations.Update;
    
    import java.util.List;
    
    public interface IBookManageService {
        //查询全部
        List<BookManage> findBookAll();
    
        //添加
        int addBook(BookManage bookManage);
    
        //删除
        int delBook(int bid);
    
        //修改
        int updateBook(BookManage bookManage);
    
        //根据编号查询编号
        BookManage findBookById(int bid);
    
    }

    BookManageServiceImpl

    package com.xiongxiong.service.impl;
    
    import com.xiongxiong.dao.BookManageMapper;
    import com.xiongxiong.entity.BookManage;
    import com.xiongxiong.service.IBookManageService;
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.stereotype.Service;
    import org.springframework.transaction.annotation.EnableTransactionManagement;
    import org.springframework.transaction.annotation.Transactional;
    
    import java.util.List;
    
    @EnableTransactionManagement    //开启事务管理器
    @Transactional                  //配置事务
    @Service                        //证明这是一个service层
    public class BookManageServiceImpl implements IBookManageService {
    
        //Dao层的接口
        @Autowired
        BookManageMapper bookManageMapper;
    
    
        @Override
        public List<BookManage> findBookAll() {
            return bookManageMapper.findBookAll();
        }
    
        @Override
        public int addBook(BookManage bookManage) {
            return bookManageMapper.addBook(bookManage);
        }
    
        @Override
        public int delBook(int bid) {
            return bookManageMapper.delBook(bid);
        }
    
        @Override
        public int updateBook(BookManage bookManage) {
            return bookManageMapper.updateBook(bookManage);
        }
    
        @Override
        public BookManage findBookById(int bid) {
            return bookManageMapper.findBookById(bid);
        }
    
    
    
    }

    需要注意的是,在实现类中,需要添加开启事务@EnableTransactionManagement和配置事务@Transactional的注解。

    在com.xiongxiong下面创建包web,该包中放控制器,在控制器中实现增删改查的功能以及页面之间的跳转,代码如下:

    package com.xiongxiong.web;
    
    import com.xiongxiong.entity.BookManage;
    import com.xiongxiong.service.IBookManageService;
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.stereotype.Controller;
    import org.springframework.ui.Model;
    import org.springframework.web.bind.annotation.RequestMapping;
    
    import java.util.List;
    
    
    @Controller
    public class IndexController {
    
        //创建Service的对象
        @Autowired
        private IBookManageService bookManageService;
    
        //默认进入首页
        @RequestMapping("default")
        public String index(Model model) {
    
            List<BookManage> bookManageList =
                    bookManageService.findBookAll();
            model.addAttribute("bookManageList",bookManageList);
            return "index";
        }
    
        //删除
        @RequestMapping("delBook")
        public String delBook(Model model, int bid) {
            bookManageService.delBook(bid);
            index(model);
            return "index";
        }
    
        //添加
        @RequestMapping("addBook")
        public String addBook(BookManage bookManage, Model model) {
            bookManageService.addBook(bookManage);
            index(model);
            return "index";
        }
    
        //跳转到添加的页面
        @RequestMapping("add")
        public String add() {
            return "addBook";
        }
    
    }

    05

    创建jsp页面

    在main下面新建文件夹webapp,在该文件夹中新建jsp页面就可以,其中我还用到了jquery(下面有下载链接)的环境,放在js目录下面,目录结构如下所示:

    jquery-1.12.4.js:点此下载

    bootstrap.js:点此下载

    创建index.jsp,用来展示查询展示所有数据,查询的功能在控制器IndexController中实现的,下面是代码:

    <%--
      Created by IntelliJ IDEA.
      User: 24519
      Date: 2021/1/20
      Time: 10:38
      To change this template use File | Settings | File Templates.
    --%>
    <%@ page contentType="text/html;charset=UTF-8" language="java" %>
    <%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
    <%@taglib prefix="f" uri="http://java.sun.com/jsp/jstl/fmt" %>
    <html>
    <head>
        <title>首页</title>
    </head>
    <body>
    <h1>图书信息</h1>
    <table border="1">
        <tr>
            <td>图书名称</td>
            <td>图书作者</td>
            <td>购买时间</td>
            <td>图书分类</td>
            <td>操作</td>
        </tr>
        <c:forEach items="${bookManageList}" var="book">
            <tr>
                <td>${book.bname}</td>
                <td>${book.bauthor}</td>
                <td>
                    <f:formatDate value="${book.btime}" pattern="yyyy-MM-dd"></f:formatDate>
                </td>
                <td>
                    <c:if test="${book.btype==1}">
                        计算机/软件
                    </c:if>
                    <c:if test="${book.btype==2}">
                        小说/文摘
                    </c:if>
                    <c:if test="${book.btype==3}">
                        杂项
                    </c:if>
                </td>
                <td><a href="delBook?bid=${book.bid}">删除</a></td>
            </tr>
        </c:forEach>
    
    </table>
    <a href="addBook.jsp" style="color:red">新增图书信息</a>
    <script src="js/jquery-1.12.4.js" type="text/javascript"></script>
    <script type="text/javascript">
        $(function () {
            $("tr:even").css("background", "green");
            $("tr:first").css("background", "blue");
        });
    </script>
    </body>
    </html>

    创建添加信息的jsp页面addBook.jsp,主要用来添加信息,添加的功能在控制器IndexController中实现,还实现了必要的表单验证,下面是代码:

    <%--
      Created by IntelliJ IDEA.
      User: 24519
      Date: 2021/1/20
      Time: 11:35
      To change this template use File | Settings | File Templates.
    --%>
    <%@ page contentType="text/html;charset=UTF-8" language="java" %>
    <html>
    <head>
        <title>Title</title>
    </head>
    <body>
    <h1>新增图书信息</h1>
    <form action="addBook" method="post">
        图书名称:<input type="text" name="bname"/><br/>
        图书作者:<input type="text" name="bauthor"/><br/>
        购买日期:<input type="text" name="btime"/><br/>
        图书类别:
        <select name="btype">
            <option value="0">选择所属分类</option>
            <option value="1">计算机/软件</option>
            <option value="2">小说/文摘</option>
            <option value="3">杂项</option>
        </select><br/>
        <input type="submit" value="增加图书"/>
    </form>
    <script src="js/jquery-1.12.4.js" type="text/javascript"></script>
    <script type="text/javascript">
        $(function () {
            $("input[type='submit']").click(function () {
                var bname = $("input[name='bname']").val();
                var bauthor = $("input[name='bauthor']").val();
                var btime = $("input[name='btime']").val();
                var btype = $("input[name='btype']").val();
                if (bname == "") {
                    alert("图书名称不能为空");
                    return false;
                }
                if (bauthor == "") {
                    alert("图书作者不能为空");
                    return false;
                }
                var dateinfo = /^[0-9]{4}-[0-1]{1}[0-9]{1}-[0-3]{1}[0-9]{1}/;
                if (!dateinfo.test(btime)) {
                    alert("日期格式不正确");
                    return false;
                }
                if (btype == 0) {
                    alert("图书分类需要选择");
                    return false;
                }
            });
    
        });
    </script>
    </body>
    </html>

    然后启动,运行,运行结果如下:

    控制台日志如下:

    日志文件book.log:

    数据库脚本:

    /*
    SQLyog Professional v12.08 (32 bit)
    MySQL - 5.5.27 : Database - schooldb
    *********************************************************************
    */
    
    
    /*!40101 SET NAMES utf8 */;
    
    /*!40101 SET SQL_MODE=''*/;
    
    /*!40014 SET @OLD_UNIQUE_CHECKS=@@UNIQUE_CHECKS, UNIQUE_CHECKS=0 */;
    /*!40014 SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0 */;
    /*!40101 SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='NO_AUTO_VALUE_ON_ZERO' */;
    /*!40111 SET @OLD_SQL_NOTES=@@SQL_NOTES, SQL_NOTES=0 */;
    CREATE DATABASE /*!32312 IF NOT EXISTS*/`schooldb` /*!40100 DEFAULT CHARACTER SET utf8 */;
    
    USE `schooldb`;
    
    /*Table structure for table `bookmanage` */
    
    DROP TABLE IF EXISTS `bookmanage`;
    
    CREATE TABLE `bookmanage` (
      `bid` int(11) NOT NULL AUTO_INCREMENT,
      `bname` varchar(40) NOT NULL,
      `bauthor` varchar(40) NOT NULL,
      `btime` datetime NOT NULL,
      `btype` int(11) NOT NULL,
      PRIMARY KEY (`bid`)
    ) ENGINE=InnoDB AUTO_INCREMENT=7 DEFAULT CHARSET=utf8;
    
    /*Data for the table `bookmanage` */
    
    insert  into `bookmanage`(`bid`,`bname`,`bauthor`,`btime`,`btype`) values (1,'三国演义','罗贯中','2021-09-08 00:00:00',2),(2,'水浒传','施耐庵','2021-09-08 00:00:00',2),(3,'狂人日记','魯迅','2021-09-08 00:00:00',3),(5,'永乐大典','鲁迅','2020-09-08 00:00:00',2);
    
    /*Table structure for table `dept` */
    
    DROP TABLE IF EXISTS `dept`;
    
    CREATE TABLE `dept` (
      `did` int(11) NOT NULL AUTO_INCREMENT,
      `dname` varchar(50) DEFAULT NULL,
      PRIMARY KEY (`did`)
    ) ENGINE=InnoDB AUTO_INCREMENT=6 DEFAULT CHARSET=utf8;
    
    /*Data for the table `dept` */
    
    insert  into `dept`(`did`,`dname`) values (1,'测试部'),(2,'销售部'),(3,'服务部'),(4,'开发部'),(5,'运营部');
    
    /*Table structure for table `dog` */
    
    DROP TABLE IF EXISTS `dog`;
    
    CREATE TABLE `dog` (
      `did` int(11) NOT NULL AUTO_INCREMENT,
      `dname` varchar(50) DEFAULT NULL,
      `dpass` varchar(50) DEFAULT NULL,
      PRIMARY KEY (`did`)
    ) ENGINE=InnoDB AUTO_INCREMENT=1785770044 DEFAULT CHARSET=utf8;
    
    /*Data for the table `dog` */
    
    insert  into `dog`(`did`,`dname`,`dpass`) values (1,'111','111'),(2,'旺财','123'),(3,'幸福','111'),(4,'财旺','123'),(5,'进钱','111'),(6,'富贵','123'),(1785770043,'黑虎','123');
    
    /*Table structure for table `emp` */
    
    DROP TABLE IF EXISTS `emp`;
    
    CREATE TABLE `emp` (
      `eid` int(11) NOT NULL AUTO_INCREMENT COMMENT '编号',
      `ename` varchar(50) DEFAULT NULL COMMENT '姓名',
      `epass` varchar(50) DEFAULT NULL COMMENT '密码',
      `edid` int(11) DEFAULT NULL COMMENT '所在部门编号',
      PRIMARY KEY (`eid`),
      KEY `fk_deptid` (`edid`),
      CONSTRAINT `fk_deptid` FOREIGN KEY (`edid`) REFERENCES `dept` (`did`)
    ) ENGINE=InnoDB AUTO_INCREMENT=38 DEFAULT CHARSET=utf8;
    
    /*Data for the table `emp` */
    
    insert  into `emp`(`eid`,`ename`,`epass`,`edid`) values (1,'王伟','111',1),(2,'张王','111',1),(4,'张三','111',4),(6,'张方仪','111',1),(7,'张坤鹏','111',1),(9,'翟选浩','123',1),(10,'季淑琦','111',1),(11,'袁康凯','111',1),(12,'丁长琨','111',1),(33,'老赵','123',1),(34,'老王','123',1),(35,'老李','123',1),(36,'小贼','123',1),(37,'老8','123',1);
    
    /*Table structure for table `financingproduct` */
    
    DROP TABLE IF EXISTS `financingproduct`;
    
    CREATE TABLE `financingproduct` (
      `id` varchar(10) NOT NULL,
      `Risk` int(11) NOT NULL,
      `Income` varchar(10) NOT NULL,
      `SaleStarting` datetime NOT NULL,
      `SaleEnd` datetime DEFAULT NULL,
      `End` datetime DEFAULT NULL,
      PRIMARY KEY (`id`)
    ) ENGINE=InnoDB DEFAULT CHARSET=utf8;
    
    /*Data for the table `financingproduct` */
    
    insert  into `financingproduct`(`id`,`Risk`,`Income`,`SaleStarting`,`SaleEnd`,`End`) values ('1',1,'5.68%','2020-04-09 00:00:00','2021-05-09 00:00:00','2029-09-08 00:00:00'),('2',3,'5.68%','2020-04-09 00:00:00','2021-05-09 00:00:00','2029-09-08 00:00:00'),('3',2,'5.3%','2020-04-09 00:00:00','2021-05-09 00:00:00','2029-09-08 00:00:00'),('4',2,'6.8%','2020-04-09 00:00:00','2021-05-09 00:00:00','2029-09-08 00:00:00'),('5',1,'4.98%','2020-04-09 00:00:00','2021-05-09 00:00:00','2029-09-08 00:00:00');
    
    /*Table structure for table `student` */
    
    DROP TABLE IF EXISTS `student`;
    
    CREATE TABLE `student` (
      `sid` int(11) NOT NULL AUTO_INCREMENT,
      `sname` varchar(50) DEFAULT NULL,
      `sphone` varchar(50) DEFAULT NULL,
      `spass` varchar(50) DEFAULT NULL,
      `saddress` varchar(50) DEFAULT NULL,
      `sage` int(11) DEFAULT NULL,
      PRIMARY KEY (`sid`)
    ) ENGINE=InnoDB AUTO_INCREMENT=21 DEFAULT CHARSET=utf8;
    
    /*Data for the table `student` */
    
    insert  into `student`(`sid`,`sname`,`sphone`,`spass`,`saddress`,`sage`) values (1,'张三','15066675713','111','普通',11),(2,'李四','15066675713','222','普通',20),(3,'admin','15066675713','333','管理员',66),(4,'test','15066675713','111','普通',20),(5,'张先生','150','111','普通',12),(6,'张先生','150','111','普通',12),(7,'张先生','150','111','普通',12),(8,'张先生','150','111','普通',12),(9,'张先生','150','111','普通',12),(10,'张先生','150','111','普通',12),(11,'张先生','150','111','普通',12),(12,'张先生','150','111','普通',12),(13,'张先生','150','111','济南',12),(14,'张先生','150','111','普通',12),(15,'张先生','150','111','普通',12),(16,'张先生','150','111','普通',12),(17,'张先生','150','111','普通',12),(18,'张先生','150','111','普通',12),(19,'张先生','150','111','普通',12),(20,'李先生','160','111','普通',13);
    
    /*Table structure for table `teacher` */
    
    DROP TABLE IF EXISTS `teacher`;
    
    CREATE TABLE `teacher` (
      `tid` int(11) NOT NULL AUTO_INCREMENT,
      `tname` varchar(50) DEFAULT NULL,
      `tpass` varchar(50) DEFAULT NULL,
      `tage` int(11) DEFAULT NULL,
      `tjob` varchar(50) DEFAULT NULL,
      PRIMARY KEY (`tid`)
    ) ENGINE=InnoDB AUTO_INCREMENT=805760409 DEFAULT CHARSET=utf8;
    
    /*Data for the table `teacher` */
    
    insert  into `teacher`(`tid`,`tname`,`tpass`,`tage`,`tjob`) values (1,'张老师','123',25,'数学'),(2,'王老师','123',36,'语文'),(3,'马老师','123',90,'武术'),(4,'高老师','123',32,'外语'),(5,'赵老师','123',24,'体育'),(6,'钱老师','123',36,'未安排'),(7,'钱老师','123',36,'未安排'),(8,'钱老师','123',36,'未安排'),(9,'钱老师','123',36,'未安排'),(10,'钱老师','123',36,'未安排'),(11,'钱老师','123',36,'未安排'),(12,'钱老师','123',36,'未安排'),(13,'钱老师','123',36,'未安排'),(14,'钱老师','123',36,'未安排'),(15,'钱老师','123',36,'未安排'),(16,'钱老师','123',36,'未安排'),(17,'钱老师','123',36,'未安排'),(805760404,'路老师','123',56,'忽悠学'),(805760405,'路老师','123',56,'忽悠学'),(805760406,'翟老师','123456',56,'化学'),(805760407,'贾老师','123456',56,'物理'),(805760408,'潘老师','123456',56,'金融学');
    
    /*!40101 SET SQL_MODE=@OLD_SQL_MODE */;
    /*!40014 SET FOREIGN_KEY_CHECKS=@OLD_FOREIGN_KEY_CHECKS */;
    /*!40014 SET UNIQUE_CHECKS=@OLD_UNIQUE_CHECKS */;
    /*!40111 SET SQL_NOTES=@OLD_SQL_NOTES */;

    点分享

    点点赞

    点在看

  • 相关阅读:
    【平衡规划】JZOJ4616. 【NOI2016模拟7.12】二进制的世界
    函数中,如何修改形参的默认值
    默认形参在函数定义阶段就已经被赋值,在调用时就可以不用再次赋值了。
    在函数调用时:位置形参、位置实参、关键字实参的特点
    return之为什么能够终止函数,代码演练
    深度理解return具体用法
    函数基础重点掌握内容:创建函数、return返回单个值、return返回多个值、函数名加括号与不加括号的区别
    python之encode和decode编码
    python利用setsockopt获得端口重用
    python并发之多进程
  • 原文地址:https://www.cnblogs.com/a1111/p/14877304.html
Copyright © 2020-2023  润新知