SSM框架之Mybatis

news2024/9/24 17:19:59

前言

什么是框架?

框架就是对技术的封装,将基础的技术进行封装,便于程序员使用,提高开发效率

ssm框架是什么?

ssm包括spring、springMvc、Mybatis,是后端企业级开发时会使用到的框架组合,在开发时经常会搭配在一起使用,共同构建企业级web应用程序

ssm框架用在哪些方面?

1.业务逻辑层:使用spring管理业务逻辑层的Bean,比如复杂的验证,逻辑代码

2.控制层:使用 Spring MVC 作为控制层,处理 HTTP 请求和响应,将请求转发给相应的业务逻辑层处理,并将处理结果返回给客户端。

3.数据访问层:使用Mybatis作为数据访问层对数据进行操作,与数据库进行交互

Mybatis

mybatis原来是Apache下的一个开源项目,2010年开发团队转移到谷歌旗下,改名为mybatis

什么是Mybatis框架?

        Mybatis是一款优秀的数据持久层框架,避免了jdbc几乎所有的手动设置参数,手动映射结果等,它将JDBC进行封装,与数据库进行交互,通常作为数据访问层。

Mybatis框架的作用?

        Mybatis将基本的jdbc常用接口封装,对外提供操作即可,可以使用xml配置或注解的方法.将数据库中记录自动映射到java对象中,是一种orm实现(对象关系映射),将可以自动将数据库记录映射到对象中的这种框架也称为orm框架。

        Mybatis支持动态sql(sql语句中可以加入if判断等)和数据缓存

如何使用Mybatis框架?

1.创建Maven项目

2.导入Mybatis的jar包,使用maven刷新

3.在resources下创建mybatis.xml全局配置文件,配置数据库连接参数

4.创建测试所用的数据库和表

5.创建接口,写事物的行为方法

6.在resources下新建一个directory目录记为mappers,在mappers下写接口对应的映射文件,实现方法sql

7.创建测试类进行测试

测试

    public static void main(String[] args) throws IOException {
        //测试mybatis

        //1.mybatis读取配置文件
        Reader reader = Resources.getResourceAsReader("mybatis.xml");
        //2.创建SqlSessionFactory--负责创建SqlSession对象(连接数据库的回话对象,类似connection)
        //SqlSessionFactory对象也只需要创建一个,创建后不需要销毁
        SqlSessionFactory sessionFactory = new SqlSessionFactoryBuilder().build(reader);
        
        //3.创建SqlSession对象
        SqlSession sqlSession = sessionFactory.openSession();
        //4.获得接口代理对象
        //创建接口的代理对象(接口是不能new对象的)
        AdminDao adminDao = sqlSession.getMapper(AdminDao.class);
      //5.调用
       Admin admin = adminDao.findAdminById(1);//让代理对象帮我们调用映射文件中与此接口中相同名称的方法

        System.out.println(admin);

        //6.关闭会话对象
        sqlSession .close();//关闭与数据库的链接对象
        
        
    }

为了方便程序员测试代码,安装一个叫mybatisX的插件方便测试

成功安装插件后,使用如下图左边边框的绿色按钮进行测试方法

事务的概念很重要(ACID特性),

注意!除去查询操作,其余操作都需要调用commit方法才能对数据库进行操作(保证事务的一致性和原子性)

数据库连接池

        每对数据库进行一次访问就需要创建数据库连接对象,访问完毕close。在实际企业级开发中这样会大大的增加系统开销,所以就提出了数据库连接池的概念。使用数据库连接池,在池(集合)中事先创建一些连接对象,用户访问时,就直接从池中获取一个连接对象,用完不销毁。还回到池中,这样就减少了频繁创建销毁连接对象。

Mybatis全局配置文件示例
<?xml version="1.0" encoding="UTF-8"?>
        <!DOCTYPE configuration PUBLIC "-//mybatis.org//DTDConfig3.0//EN"
                "http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>


  <!--mybatis核心全局配置文件-->

    <!--日志信息-->
    <settings>
        <setting name="logImpl" value="STDOUT_LOGGING"/>
        <!--如果表中的类名与类中的属性名完全相同,mybatis会自动将查询结果封装到POJO对象中.
        如果java中使用标准驼峰命名,数据库中使用下划线连接命名,可以开始全局设置实现自动转换
        单表查询时,mybatis可以自定义的将一条记录响应到model对象
        数据库为下划线链接,java为驼峰命名,就可以给model对象赋值-->
        <setting name="mapUnderscoreToCamelCase" value="true"/>

        <!---->
        <setting name="cacheEnabled" value="true"/>
    </settings>


    <!--为类配置别名-->
    <typeAliases>
        <package name="com.ffyc.mybatis.model"/>
    </typeAliases>

    <!--配置数据库连接相关信息-->
    <environments default="development">
    <environment id="development">

        <!---->
        <transactionManager type="JDBC"/>

        <!--type="POOLED" 使用数据库连接池功能,默认创建是个连接对象-->
        <dataSource type="POOLED">
        <!--数据库连接配置-->
            <property name="driver" value="com.mysql.cj.jdbc.Driver"/>
            <property name="url" value="jdbc:mysql://127.0.0.1:3306/ssmdb?serverTimezone=Asia/Shanghai"/>
            <property name="username" value="root"/>
            <property name="password" value="root"/>
</dataSource>
        </environment>
        </environments>

    <!--注册映射文件-->
    <mappers>
        <mapper resource="mappers/AdminMapper.xml"></mapper>
        <mapper resource="mappers/StudentMapper.xml"></mapper>
        <mapper resource="mappers/MajorMapper.xml"></mapper>
        <mapper resource="mappers/TeacherMapper.xml"></mapper>
    </mappers>

</configuration>

mappers目录下映射文件示例
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTDMapper3.0//EN"
        "http://mybatis.org/dtd/mybatis-3-mapper.dtd">

<!--sql映射文件  主要写sql实现-->

<!--名字必须和接口处名字一至-->
<mapper namespace="com.ffyc.mybatis.dao.TeacherDao">
<cache flushInterval="6000">

</cache>

    <!--update之trim标签-->
    <!--<update id="updateTeacher" parameterType="Teacher">
        update teacher
        <trim prefix="set" suffixOverrides=",">
                <if test="num!=null">
                    num = #{num},
                </if>
                <if test="name!=null">
                     name=#{name},
                </if>
                <if test="gender!=null">
                     gender=#{gender}
                </if>
        </trim>
            where id = #{id}


    </update>-->


    <!--update之set标签-->
    <update id="updateTeacher" parameterType="Teacher">
            update teacher
    <set>
        <if test="num!=null">
            num = #{num},
        </if>
        <if test="name!=null">
            name=#{name},
        </if>
        <if test="gender!=null">
            gender=#{gender}
        </if>
    </set>
    where id = #{id}

</update>


    <!--批量删除  之  foreach-->
    <delete id="deleteTeacher">
        delete from teacher where id in
        <foreach  item="id" collection="array" open="(" separator="," close=")">
            #{id}
        </foreach>
    </delete>




    <!--useGeneratedKeys 返回自增主键
        keyProperty  定义接收属性
        keyColumn  定义主键列-->

    <!--
            动态sql :
                可以在sql中添加逻辑判断
               if  test(属性条件成立? 执行: 不执行


               where标签  当where标签  if语句有条件成立时,就会动态添加where关键字,还可以啥拿出where后面紧跟着的
                                关键字    例如 安and  or    -->
   <!-- <select id="TEACHERS" resultType="com.ffyc.mybatis.model.Teacher">
        select * from teacher
        <where>
          <if test="num!=null">
            num=#{num}
          </if>
        <if test="name!=null">
          and  name=#{name}
        </if>
        <if test="gender!=null">
          and  gender=#{gender}
        </if>
        </where>
    </select>-->



    <!--
        trim  当判断条件成立时,可以自定义前缀和后缀关键字
        prefix="where"
        prefixOverrides="and|or"
    -->
    <!--<select id="TEACHERS" resultType="com.ffyc.mybatis.model.Teacher">
        select * from teacher
        <trim prefix="where" prefixOverrides="and|or">
            <if test="num!=null">
                num=#{num}
            </if>
            <if test="name!=null">
                or  name=#{name}
            </if>
            <if test="gender!=null">
                and  gender=#{gender}
            </if>
        </trim>
    </select>-->


    <select id="TEACHERS" resultType="com.ffyc.mybatis.model.Teacher">
        select * from teacher
        <trim prefix="where" prefixOverrides="and|or">
            <choose>
                <when test="name!=null">
                    name = #{name}
                </when>
                <!--可以只有when而没有otherwise,但是不能只有otherwise-->
            <otherwise>
                name = '李老师'
            </otherwise>
            </choose>
        </trim>
    </select>


    <select id="findTeacher" resultType="com.ffyc.mybatis.model.Teacher">
        select
        <foreach  item="col" collection="list" separator=",">
            ${col}
        </foreach>
        from teacher
    </select>
</mapper>

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2084277.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

无人机搭载高压喷水清洗绝缘子技术详解

随着电力行业的快速发展&#xff0c;高压输电线路作为电力传输的“大动脉”&#xff0c;其安全稳定运行至关重要。绝缘子作为输电线路中的重要组件&#xff0c;长期暴露于自然环境中&#xff0c;易受尘埃、鸟粪、盐雾等污染物附着&#xff0c;导致绝缘性能下降&#xff0c;甚至…

Visual Basic 6.0教程/Visual Basic从入门到实践/Visual Basic学习视频教程

Visual Basic 6.0教程/Visual Basic从入门到实践/Visual Basic学习视频教程 李天生VB从入门到精通 第一章 VisualBasic6基本介绍 第二章 VisualBasic6的数据类型与运算符表达式 第三章 VisualBasic6的内部函数 第四章 VisualBasic6的基本语句 第五章 VisualBasic6的数组 第六章…

AMC8美国数学竞赛备考:吃透625道真题和知识点(持续)

距离接下来最近的2025年AMC8美国数学竞赛还有几个月的时间&#xff0c;实践证明&#xff0c;做真题&#xff0c;吃透真题和背后的知识点是备考AMC8有效的方法之一。 2000-2024年AMC8真题和解析&#xff1a;2023年第13题 这道题的考点是分数。 题意的重点是均匀分布&#xff0c…

OpenCV绘图函数(5)绘制标记函数drawMarker()的使用

操作系统&#xff1a;ubuntu22.04 OpenCV版本&#xff1a;OpenCV4.9 IDE:Visual Studio Code 编程语言&#xff1a;C11 算法描述 cv::drawMarker 函数在 OpenCV 中用于在一个给定的位置上绘制标记。目前支持几种不同的标记类型&#xff0c;具体信息可以参考 MarkerTypes 函数…

这样图解Transformer应该没人看不懂了吧——多头注意力机制详解

这是关于Transformer系列文章的第三篇部分&#xff0c;我们将用自上而下的方式深入探讨Transformer的功能。 在前两篇文章中&#xff0c;我们已经了解了Transformer是什么、它的架构以及工作原理。 没看过的同学可以点击图片进行查看 Transformer图解1—基础与架构 Transform…

ITopologicalOperator.Intersect 直接崩软件,也不报错的解决方案

1、问题描述&#xff1a; 说多崩溃就有多崩溃&#xff0c;执行到下面这个相交分析的时候&#xff0c;就一直崩软件&#xff0c;用catch也catch不到东西&#xff0c;相同的数据放到另外一个工程中的时候&#xff0c;又是正常的&#xff0c;一直找不到原因。 2、终级方案 最终…

LLM - 自定义图像数据集 使用 LoRA 微调 图像生成 Flux 模型

欢迎关注我的CSDN&#xff1a;https://spike.blog.csdn.net/ 本文地址&#xff1a;https://spike.blog.csdn.net/article/details/141638928 免责声明&#xff1a;本文来源于个人知识与公开资料&#xff0c;仅用于学术交流&#xff0c;欢迎讨论&#xff0c;不支持转载。 在 Dif…

假设以带头结点的循环链表表示队列,并且只设一个指针指向队尾元素结点(注意不设头指针),试编写相应的置空队列、判断队列是否为空、入队和出队等算法。

typedef int Datatype; typedef struct queue {Datatype data;struct queue* next; }queue; //队列 typedef struct {queue* rear; }LinkQueue; //初始化 void queueinit(LinkQueue* ps) {ps->rear (queue*)malloc(sizeof(queue));if (ps->rear NULL){perror("err…

家里养宠物空气净化器有用吗,应该怎么挑选宠物空气净化器

养猫&#xff0c;无疑给了我们很多陪伴和乐趣&#xff0c;为我们的生活添上了无数温馨的色彩。然而&#xff0c;在这份甜蜜的负担中&#xff0c;猫毛的问题确实成为了不少铲屎官们共同的“小烦恼”。这些浮毛总能在你最不经意的时候&#xff0c;悄悄占领家中的每一个角落。每天…

不仅仅是文化:解决常见安全问题根源

今年&#xff0c;GitLab对DevSecOps专业人士的年度调查发现了一些与组织文化相关的问题&#xff0c;这些问题可能会阻碍工程团队和安全团队之间的更深层次协调。 大多数(58%)的安全受访者表示&#xff0c;他们很难让开发部门优先修复漏洞&#xff0c;52%的人表示&#xff0c;繁…

Getting AttributeError when using openAI python library

题意&#xff1a;“使用 OpenAI Python 库时出现 AttributeError” 问题背景&#xff1a; Im building a new AI chatbot utilizing the openai library and I have a gradio UI set up in one file (app.py) and a predict() function in another (trainedBot.py) Every time…

【Threejs学习】材质灯光投影

一、光源分类 环境光(AmbientLight)&#xff1a;会均匀的照亮场景中的所有物体。无方向&#xff0c;不能投射阴影。平行光(DirectionalLight)&#xff1a;沿特定方向散发的光&#xff0c;发出的光线都是平行的。例如太阳光&#xff0c;可投射阴影。点光源(PointLight)&#xf…

2024年大学生适合入手的蓝牙耳机推荐?四款开放式耳机推荐

2024年大学生入手蓝牙耳机的话&#xff0c;我当然是比较推荐入手开放式蓝牙耳机的。 主要是因为开放式蓝牙耳机佩戴起来真的很舒适&#xff0c;它的开放式设计通常是轻巧且适配贴合不同耳型的&#xff0c;所以既不会对耳朵造成压迫感&#xff0c;也适合长时间佩戴使用。 不仅…

华为AC旁挂二层组网配置详解:从DHCP部署到无线业务配置,完成网络搭建

组网需求 AC组网方式&#xff1a;旁挂二层组网。 DHCP部署方式&#xff1a; AC作为DHCP服务器为AP分配IP地址。 防火墙作为DHCP服务器为STA分配IP地址。 业务数据转发方式&#xff1a;直接转发。 网络拓扑图 对于旁边路直接转发&#xff0c;优点就是数据流量不经过AC&…

ubuntu20.04(wsl2)测试 arcface 人脸识别(计算特征向量)

1. 参考博客和代码、模型仓库&#xff1a; 1.1. 【C随记】collect2: error: ld returned 1 exit status错误分析与解决 1.2. Visual Studio 2022新建 cmake 工程测试 tensorRT 自带样例 sampleOnnxMNIST 1.3.报错&#xff1a;ModuleNotFoundError: No module named ‘ten…

杭州城市开发者社区活动:《聚力AI,共创共荣》第二期线下AI论坛活动等你来!

由中也AI共荣社主办&#xff0c;COC杭州城市开发者社区等多家协办的《聚力AI&#xff0c;共创共荣》AI论坛活动来袭&#xff01; 活动围绕AI技术的创新应用&#xff0c;以及在实际应用落地的场景为主题展开&#xff0c;聚力AI&#xff0c;共同探讨。有机会与行业大咖进行面对面…

沙箱支付支付宝

沙箱支付支付宝 文章目录 沙箱支付支付宝一、进入沙箱应用-支付宝二、基本配置2.1 查看自己的基本信息2.2 生成自定义密钥&#xff0c;进行配置 三、springboot整合沙箱支付3.1 需要导入的两个相关依赖&#xff08;pom.xml&#xff09;3.2 需要加入的配置文件信息&#xff08;a…

网站建设完成后, 行业网站如何做seo

行业网站的SEO优化是一个系统工程&#xff0c;涉及多个方面以确保网站能够在搜索引擎中有良好的表现。以下是行业网站SEO的详细解析&#xff1a; 关键词研究与布局 目标受众分析&#xff1a;了解目标受众的搜索习惯和需求&#xff0c;确定适合的关键词。使用工具来发现相关关键…

启航未来,共绘科技蓝图,2024青岛软件博览会(青岛软博会)

在金秋送爽、硕果累累的十月&#xff0c;青岛&#xff0c;这座镶嵌于黄海之滨的璀璨明珠&#xff0c;以其独特的海滨风光与深厚的文化底蕴&#xff0c;即将迎来一场科技领域的璀璨盛宴——2024青岛国际软件融合创新博览会&#xff08;简称&#xff1a;青岛软博会&#xff09;。…

C++ | Leetcode C++题解之第378题有序矩阵中第K小的元素

题目&#xff1a; 题解&#xff1a; class Solution { public:bool check(vector<vector<int>>& matrix, int mid, int k, int n) {int i n - 1;int j 0;int num 0;while (i > 0 && j < n) {if (matrix[i][j] < mid) {num i 1;j;} else…