使用注解配置mybatis

使用注解配置mybatis

注解VS XML

XML:

​ 优点:入门容易;可以实现非常复杂的配置;避免硬编码;可以配置第三方的类;

​ 缺点:编码效率比较低

注解:

​ 优点:开发效率高

​ 缺点:不好理解(记);复杂功能实现不了或者非常麻烦;存在硬编码;不可以在第三方的代码(class)中使用注解;

mybatis的常用注解

@Select@Insert@Update@Delete

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-uj3qbbWm-1591238555856)(随堂笔记.assets/1575853903937.png)]

@Results@Result

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-usCecBMb-1591238555858)(随堂笔记.assets/1575854248391.png)]

@Many@One

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-SuMtDdFt-1591238555859)(随堂笔记.assets/1575854653083.png)]

综合案例(javaweb)

员工信息的增删改查

step1、准备数据

use ee121;
create table emp (
	id int (11) primary key AUTO_INCREMENT,
	ename varchar (150),
	joindate date ,
	salary Decimal (9),
	bonus Decimal (9),
	dept_id int (11)
);
insert into emp (id, ename, joindate, salary, bonus, dept_id) values('1001','张德华','2000-12-17','8000.00',NULL,'20');
insert into emp (id, ename, joindate, salary, bonus, dept_id) values('1002','传园慧','2001-02-20','16000.00','3000.00','30');
insert into emp (id, ename, joindate, salary, bonus, dept_id) values('1003','向雯娜','2001-02-22','12500.00','5000.00','30');
insert into emp (id, ename, joindate, salary, bonus, dept_id) values('1004','双超','2001-04-02','29750.00',NULL,'20');
insert into emp (id, ename, joindate, salary, bonus, dept_id) values('1005','孔俪','2001-09-28','12500.00','14000.00','30');
insert into emp (id, ename, joindate, salary, bonus, dept_id) values('1006','木子晨','2001-05-01','28500.00',NULL,'30');
insert into emp (id, ename, joindate, salary, bonus, dept_id) values('1007','双紫棋','2001-09-01','24500.00',NULL,'10');
insert into emp (id, ename, joindate, salary, bonus, dept_id) values('1008','茳冰冰','2007-04-19','30000.00',NULL,'20');
insert into emp (id, ename, joindate, salary, bonus, dept_id) values('1009','王祖红','2001-11-17','50000.00',NULL,'10');
insert into emp (id, ename, joindate, salary, bonus, dept_id) values('1010','染静如','2001-09-08','15000.00','0.00','30');

step2、建立模块并搭建开发环境

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-TRx2rqLx-1591238555862)(随堂笔记.assets/1575856035483.png)]

step3、拷贝jar包

数据库驱动

mybatis

log4j

beanutils.jar logging.jar

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ivWllhPT-1591238555863)(随堂笔记.assets/1575856159019.png)]

step4、建立实体类

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Px6pW9u4-1591238555864)(随堂笔记.assets/1575856308279.png)]

step5、建立mybatis的配置文件

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Eg7nHhMa-1591238555865)(随堂笔记.assets/1575856370808.png)]

查看所有员工

step1、流程图

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-xu24Otwj-1591238555865)(随堂笔记.assets/1575856817905.png)]

step2、编写Servlet

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-HrqMRomc-1591238555866)(随堂笔记.assets/1575856808938.png)]

step3、编写Service接口和实现类

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-qDepiQE0-1591238555867)(随堂笔记.assets/1575856877137.png)]

可以直接拷贝mybatis的工具类

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Tut8FtyG-1591238555868)(随堂笔记.assets/1575857190184.png)]

step4、dao接口和映射文件

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-LCQnKYS1-1591238555868)(随堂笔记.assets/1575857239749.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-PchxVu4S-1591238555869)(随堂笔记.assets/1575857342855.png)]

step5、单元测试

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-nWoNNRpT-1591238555870)(随堂笔记.assets/1575857509435.png)]

step6、编写页面即可

a、导入jstl的标签库

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-2spwGhhG-1591238555871)(随堂笔记.assets/1575857648304.png)]

b、编写页面

<%@ page contentType="text/html;charset=UTF-8" %>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<html>
<head>
    <title>员工列表</title>
</head>
<body>
<h2>员工列表</h2>
<table border="1" width="78%">
    <tr>
        <th>序号</th>
        <th>姓名</th>
        <th>入职日期</th>
        <th>月薪</th>
        <th>奖金</th>
        <th>部门编号</th>
        <th>操作</th>
    </tr>
    <c:forEach items="${emps}" var="emp" varStatus="vs">
        <tr style="background-color: ${vs.index%2==0?'#c3f3c3':'#f3c3f3'}">
            <td>${vs.count}</td>
            <td>${emp.ename}</td>
            <td>${emp.joindate}</td>
            <td>${emp.salary}</td>
            <td>${emp.bonus}</td>
            <td>${emp.deptId}</td>
            <td>
                <a href="">修改</a>
                <a href="">删除</a>
            </td>
        </tr>
    </c:forEach>
</table>
</body>
</html>

step7、改进一下默认主页

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-OErimugd-1591238555872)(随堂笔记.assets/1575858170635.png)]

step8、展现效果

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-kMXG0tUs-1591238555873)(随堂笔记.assets/1575858229830.png)]

添加员工信息

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-JXi8Rrzk-1591238555875)(随堂笔记.assets/1575859584873.png)]

step1、编写一个post请求参数中文过滤器

package com.itheima.web.filter;


import javax.servlet.*;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
//编码参数可配置的
public class CharacterEncodingFilter implements Filter {
    private String encoding = "GBK";//默认编码
    public void init(FilterConfig filterConfig) throws ServletException {
        //读取参数encoding,如果有值,覆盖默认编码
        String encoding = filterConfig.getInitParameter("encoding");
        if(encoding!=null)
            this.encoding = encoding;
    }

    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
        HttpServletRequest request;
        HttpServletResponse response;
        try{
            request = (HttpServletRequest)servletRequest;
            response = (HttpServletResponse)servletResponse;
        }catch (Exception e){
            throw new ServletException("non-http request or response");
        }
        //获取请求方式
        String method = request.getMethod();
        if("post".equalsIgnoreCase(method)) {
            //设置请求的编码
            request.setCharacterEncoding(encoding);
        }
        //放行
        filterChain.doFilter(request,response);
    }

    public void destroy() {

    }
}

step2、配置过滤器

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd"
         version="3.1">
    <filter>
        <filter-name>characterEncodingFilter</filter-name>
        <filter-class>com.itheima.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>characterEncodingFilter</filter-name>
        <url-pattern>/*</url-pattern>
    </filter-mapping>
</web-app>

step3、修改listEmps.jsp

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-v4W39N8d-1591238555876)(随堂笔记.assets/1575860195544.png)]

step4、添加页面

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-NYR6m1u8-1591238555877)(随堂笔记.assets/1575860454504.png)]

step5、servlet

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-gVIjazRT-1591238555877)(随堂笔记.assets/1575860648683.png)]

step6、编写业务代码

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-7C3jFY4h-1591238555878)(随堂笔记.assets/1575860744731.png)]

step7、dao和映射文件

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-TUml9Sdl-1591238555879)(随堂笔记.assets/1575860787868.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-W4MERdWl-1591238555880)(随堂笔记.assets/1575860881352.png)]

step8、测试

修改员工信息

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-12DkUx8H-1591238555881)(随堂笔记.assets/1575861183584.png)]

step1、修改列表页面

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-PBAhqBjx-1591238555882)(随堂笔记.assets/1575861236781.png)]

step2、Servlet

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-TrREuCoZ-1591238555882)(随堂笔记.assets/1575861394284.png)]

step3、业务层代码

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-wTjBOf5g-1591238555884)(随堂笔记.assets/1575861434606.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ew7tmjO1-1591238555885)(随堂笔记.assets/1575861499583.png)]

step4、dao和映射文件

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-508nLJcL-1591238555885)(随堂笔记.assets/1575861560930.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-skFhOMnd-1591238555886)(随堂笔记.assets/1575861550269.png)]

step5、editEmp.jsp

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-FvTPk95Z-1591238555887)(随堂笔记.assets/1575861668631.png)]

step6、编写EditEmpServlet

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-K036hcvg-1591238555888)(随堂笔记.assets/1575861779915.png)]

step7、业务层代码

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-wPDwT63o-1591238555888)(随堂笔记.assets/1575861879232.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-TFBDRkAr-1591238555890)(随堂笔记.assets/1575861979370.png)]

step8、dao接口和映射文件

在这里插入图片描述

删除员工信息:删除1个,批量删除

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ZPfPTFPH-1591238555893)(随堂笔记.assets/1575873183478.png)]

删除1个

step1、修改listEmps。jsp

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ZbqTWlP7-1591238555895)(随堂笔记.assets/1575873398873.png)]

step2、编写Servlet

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-RECmUQka-1591238555896)(随堂笔记.assets/1575873757732.png)]

step3、业务层

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-4Jeu9Zhw-1591238555897)(随堂笔记.assets/1575873578382.png)]

step4、持久层

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-DS86sB2A-1591238555898)(随堂笔记.assets/1575873619851.png)]

step5、测试即可

删除多个

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-5wIznR75-1591238555899)(随堂笔记.assets/1575873924958.png)]

step1、修改页面listEmps.jsp

<%@ page contentType="text/html;charset=UTF-8" %>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<html>
<head>
    <title>员工列表</title>
    <script type="text/javascript" src="${pageContext.request.contextPath}/js/jquery-3.4.1.min.js"></script>
</head>
<body>
<h2>员工列表</h2>
<a href="${pageContext.request.contextPath}/addEmp.jsp">添加</a>
<a href="javascript:toDelMore()">删除</a>
<hr/>
<form id="f1" method="post" action="${pageContext.request.contextPath}/delMoreServlet">
    <table border="1" width="78%">
        <tr>
            <th>选择</th>
            <th>序号</th>
            <th>姓名</th>
            <th>入职日期</th>
            <th>月薪</th>
            <th>奖金</th>
            <th>部门编号</th>
            <th>操作</th>
        </tr>
        <c:forEach items="${emps}" var="emp" varStatus="vs">
            <tr style="background-color: ${vs.index%2==0?'#c3f3c3':'#f3c3f3'}">
                <td><input type="checkbox" name="ids" value="${emp.id}"> </td>
                <td>${vs.count}</td>
                <td>${emp.ename}</td>
                <td>${emp.joindate}</td>
                <td>${emp.salary}</td>
                <td>${emp.bonus}</td>
                <td>${emp.deptId}</td>
                <td>
                    <a href="${pageContext.request.contextPath}/editEmpUIServlet?eid=${emp.id}">修改</a>
                    <a href="javascript:toDelOne(${emp.id})">删除</a>
                </td>
            </tr>
        </c:forEach>
    </table>
</form>
<script type="text/javascript">
    function toDelMore() {
        //是否选择了
        var selectedIdsLength = $("#f1 input[name='ids']:checked").length;
        if(selectedIdsLength==0){
            alert("请先选择要删除的记录");
            return;
        }
        var sure = confirm("确定要删除吗");
        if(sure)
            $("#f1").submit();
    }
    
    /*function toDelMore() {//原始的JS代码
        //是否选择了
        var ids = document.getElementsByName("ids");
        var selected = false;//选择标志
        //没有选择:提示
        for(var i=0;i<ids.length;i++){
            if(ids[i].checked){
                selected = true;
                break;//跳出循环
            }
        }
        if(!selected){
            alert("请先选择要删除的记录");
            return;
        }
        //选择了:提示确定是否删除
        var sure = confirm("确定要删除吗");
        if(sure)
            document.getElementById("f1").submit();
        //确定:提交表单
    }*/
    
    function toDelOne(empId){
        var sure = confirm("确定要删除吗");
        if(sure)
            location.href="${pageContext.request.contextPath}/delOneServlet?empid="+empId;
    }
</script>
</body>
</html>

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

step2、编写Servlet

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-sOITnA40-1591238555903)(随堂笔记.assets/1575874986617.png)]

step3、业务层

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-0eMNFqPj-1591238555904)(随堂笔记.assets/1575875024822.png)]

step4、持久层

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ipRNpzUD-1591238555905)(随堂笔记.assets/1575875096073.png)]

分页查询:(难点)

在这里插入图片描述
在这里插入图片描述

step1、编写一个封装了所有分页信息的类

package com.itheima.commons;

import java.util.List;

//封装所有与分页有关的数据
public class PageBean {
    private List records;//显式的分页记录
    private int pageNum;//当前页码
    private int totalRecords;//总记录条数
    private int totalPageNum;//总页数
    private int pageSize = 5;//每页显式的记录条数
    private int prePageNum;//上一页
    private int nextPageNum;//下一页
    private int startIndex;//每页开始记录的索引

    private int startPageNum;
    private int endPageNum;

    public PageBean(int pageNum,int totalRecords){
        this.pageNum = pageNum;
        this.totalRecords = totalRecords;
        //总页数
        totalPageNum = totalRecords%pageSize==0?totalRecords/pageSize:totalRecords/pageSize+1;
        //上一页
        prePageNum = pageNum-1<1?1:pageNum-1;
        //下一页
        nextPageNum = pageNum+1>totalPageNum?totalPageNum:pageNum+1;
        //每页开始记录的索引
        startIndex = (pageNum-1)*pageSize;
        //计算开始和结束页码
        if(totalPageNum<=10){
            startPageNum = 1;
            endPageNum = totalPageNum;
        }else{
            startPageNum = pageNum-5;
            endPageNum = pageNum+4;
            if(startPageNum<1){
                startPageNum = 1;
                endPageNum = 10;
            }
            if(endPageNum>=totalPageNum){
                endPageNum = totalPageNum;
                startPageNum = endPageNum-9;
            }
        }
    }

    public int getStartPageNum() {
        return startPageNum;
    }

    public void setStartPageNum(int startPageNum) {
        this.startPageNum = startPageNum;
    }

    public int getEndPageNum() {
        return endPageNum;
    }

    public void setEndPageNum(int endPageNum) {
        this.endPageNum = endPageNum;
    }

    public int getTotalRecords() {
        return totalRecords;
    }

    public void setTotalRecords(int totalRecords) {
        this.totalRecords = totalRecords;
    }

    public List getRecords() {
        return records;
    }

    public void setRecords(List records) {
        this.records = records;
    }

    public int getPageNum() {
        return pageNum;
    }

    public void setPageNum(int pageNum) {
        this.pageNum = pageNum;
    }

    public int getTotalPageNum() {
        return totalPageNum;
    }

    public void setTotalPageNum(int totalPageNum) {
        this.totalPageNum = totalPageNum;
    }

    public int getPageSize() {
        return pageSize;
    }

    public void setPageSize(int pageSize) {
        this.pageSize = pageSize;
    }

    public int getPrePageNum() {
        return prePageNum;
    }

    public void setPrePageNum(int prePageNum) {
        this.prePageNum = prePageNum;
    }

    public int getNextPageNum() {
        return nextPageNum;
    }

    public void setNextPageNum(int nextPageNum) {
        this.nextPageNum = nextPageNum;
    }

    public int getStartIndex() {
        return startIndex;
    }

    public void setStartIndex(int startIndex) {
        this.startIndex = startIndex;
    }
}

step2、编写持久层代码

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-b1aLHH9A-1591238555906)(随堂笔记.assets/1575877412816.png)]

step3、映射文件

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-pMrjIGxH-1591238555907)(随堂笔记.assets/1575877491158.png)]

step4、业务接口

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-OZQooa3c-1591238555907)(随堂笔记.assets/1575877581235.png)]

step5、业务实现

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-okijzJOH-1591238555908)(随堂笔记.assets/1575877794564.png)]

step6、修改Servlet

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Xx2cqZBZ-1591238555909)(随堂笔记.assets/1575877942235.png)]

step7、修改listEmp.jsp

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-05tMTkpO-1591238555909)(随堂笔记.assets/1575878384103.png)]

step8、进一步修改

insert into emp (ename) values('a');//多插入几条

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-TzxqzqvY-1591238555910)(随堂笔记.assets/1575878622316.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-deV60dfu-1591238555910)(随堂笔记.assets/1575878883470.png)]

step9、改造PageBean

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-gmAEkzaT-1591238555911)(随堂笔记.assets/1575879039354.png)]

step10、改造listEmps.jsp

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-yw2wAy24-1591238555911)(随堂笔记.assets/1575879084807.png)]

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
对于使用注解开发MyBatis的Spring Boot项目,你可以按以下步骤进行操作: 1. 首先,在Spring Boot项目中添加MyBatisMyBatis-Spring的依赖,可以在pom.xml文件中添加以下依赖: ```xml <dependency> <groupId>org.mybatis.spring.boot</groupId> <artifactId>mybatis-spring-boot-starter</artifactId> <version>2.2.0</version> </dependency> ``` 2. 创建一个数据源配置类,用于配置数据库连接信息,例如: ```java @Configuration @MapperScan(basePackages = "com.example.mapper") public class DataSourceConfig { @Value("${spring.datasource.url}") private String url; @Value("${spring.datasource.username}") private String username; @Value("${spring.datasource.password}") private String password; @Bean public DataSource dataSource() { DriverManagerDataSource dataSource = new DriverManagerDataSource(); dataSource.setDriverClassName("com.mysql.cj.jdbc.Driver"); dataSource.setUrl(url); dataSource.setUsername(username); dataSource.setPassword(password); return dataSource; } } ``` 3. 创建Mapper接口,并使用@Mapper注解标识该接口为MyBatis的Mapper接口,例如: ```java @Mapper public interface UserMapper { @Select("SELECT * FROM user") List<User> getAllUsers(); // 其他CRUD方法 } ``` 4. 在application.properties或application.yml文件中配置数据库连接信息,例如: ```yaml spring: datasource: url: jdbc:mysql://localhost:3306/mydb username: root password: password ``` 5. 在Spring Boot的启动类上添加@MapperScan注解,指定要扫描的Mapper接口所在的包,例如: ```java @SpringBootApplication @MapperScan("com.example.mapper") public class Application { public static void main(String[] args) { SpringApplication.run(Application.class, args); } } ``` 这样,你就可以在Spring Boot项目中使用注解开发MyBatis了。通过在Mapper接口的方法上使用注解来实现CRUD操作,Spring Boot会自动扫描并注册这些Mapper接口的实现,无需手动编写映射文件。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值