mybatis概述及搭建

目录

1.概述

2.mybatis搭建

1.创建一个maven项目,添加mybatis、mysql所依赖的jar

2.创建一个数据库表,及对应的java类

3.创建一个mybatis的核心配置文件,配置数据库连接信息,配置sql映射文件

4.创建sql映射文件,定义一个与接口方法名相同的查询语句

5.创建一个访问接口,定义一个方法

6.测试

API接口

SqlSessionFactory接口

SqlSession接口

嵌套查询

数据库连接池(缓冲池)

7.单元测试插件

8.参数传递

#{} 和${}区别

9.结果处理

1.简单类型输出映射

2.对象映射

3.特殊处理定义 resultMap

4.多表关联处理结果集

10.Mybatis 动态 SQL

if

where

trim

choose

set

foreach

11.特殊符号处理

12.mybatis一级缓存和二级缓存

一级缓存

二级缓存

1.概述

mybatis是一款优秀的持久层框架

mybatis是对jdbc功能进行轻量级的封装, 提供了统一的数据库信息配置,统一放在一个xml文件中,读取就行;

将sql提取到一个xml文件中, 提供了动态sql功能 提供了结果自动映射封装;

是一个orm(ORM Object Relational Mapping 对象关系映射)实现,orm指的是,将数居中的记录与java中的对象进行关系映, 对jdbc原生接口进行封装,提供了一些mybatis自己的接口和类来实现.

servlet(负责接收前端请求 调用其他的java程序处理 响应) web层

service(业务逻辑层) 验证数据 调用dao 结果 组装 服务层(逻辑处理,数据组装)

dao(data access Object) jdbc 数据持久层

2.mybatis搭建

1.创建一个maven项目,添加mybatis、mysql所依赖的jar

2.创建一个数据库表,及对应的java类
3.创建一个mybatis的核心配置文件,配置数据库连接信息,配置sql映射文件
4.创建sql映射文件,定义一个与接口方法名相同的查询语句
5.创建一个访问接口,定义一个方法
6.测试

读取配置

Reader reader = Resources.getResourceAsReader("mybatis-config.xml");

创建SqlSessionFactory

SqlSessionFactory sessionFactory = new SqlSessionFactoryBuilder(

).build(reader);

创建SqlSession

SqlSession sqlSession = sessionFactory.openSession();

创建接口代理对象

sqlSession.getMapper(接口.class); sqlSession .close();

调用接口中的方法 执行对应的sql

API接口

SqlSessionFactory接口

SqlSessionFactory 用来创建SqlSession,只创建一次,一旦创建 ,SqlSessionFactory就在整个应用过程中存在。

SqlSession接口

SqlSession代表和数据库连接会话,此接口封装了对数据库的操作方法,完成后关闭会话

嵌套查询

将一个多表关联查询拆分为多次查询,先查询主表数据,然后查询关联表数据.

<resultMap id="studentMap" type="Student">
        <id column="id" property="id"></id>
        <result column="num" property="num"></result>
        <result column="name" property="name"></result>
        <result column="gender" property="gender"></result>
        <!--将学生关系和操作人信息分别封装到宿舍对象和管理员对象中去  属于嵌套-->
        <association property="dorm" javaType="Dorm">
            <result column="dnum" property="num"></result>
        </association>
        <association property="admin" javaType="Admin">
            <result column="account" property="account"></result>
        </association>
</resultMap>
<resultMap id="dormMap" type="Dorm">
        <id column="id" property="id"></id>
        <result column="num" property="num"></result>
        <collection property="students" javaType="list" ofType="Student">
            <result column="name" property="name"></result>
            <result column="snum" property="num"></result>
        </collection>
</resultMap>

数据库连接池(缓冲池)

现在每与数据库交互一次,创建一个数据库连接对象(Connection,Sql),用完就关闭销毁。下次需要,就重复此过程。问题:频繁创建销毁对象,开销大

思想:可以在启动时设置一个容器,在里面初始化好一些数据库连接对象,有请求到来时,可不用每次创建销毁,可重复使用,减少了频繁创建销毁链接对象的开销。

7.单元测试插件

使某一方法可以独立运行

 @Test
    public void update() {
        SqlSession sqlSession= MybatisUtil.getSqlSession();
        StudentDao studentDao=sqlSession.getMapper(StudentDao.class);
        Student student=new Student();
        student.setId(1);
        student.setNum(107);
        student.setName("qq");
        studentDao.updateStudent(student);
        sqlSession.commit();
        sqlSession.close();

    }

8.参数传递

  • 单参数直接传递,基本类型不需做任何处理

    Admin findAdminById(int id);

  • 多参数处理方式

    Admin login(@Param("acc") String account,@Param("pwd") String password);

  • 多参数封装到一个对象中

    Admin login1(Admin admin);

#{} 和${}区别

  • #{参数名}

    传值是预编译方式,更安全,主要用于向sql中传值

  • ${参数名}

    主要用来动态的向sql中传列名 传值时是直接将参数拼接到sql中(不建议) 排序 order by ${column} 动态传列名进来

9.结果处理

1.简单类型输出映射

返回简单基本类型
<select id="adminCount" resultType="int">
    SELECT COUNT(*) FROM admin
</select>

2.对象映射

mybatis会将查询到的结构自动封装到一个对象中,会自己创建给定类型的对象
自动封装结果有条件:
    1.开启了全局的自动结果映射  PARTIAL  默认是单张表开启的
    2.数据库列名和属性名一样 如果名字不一致,不能映射,
      两种解决方法:
          (1)可设置别名使其映射
          (2)<setting name="mapUnderscoreToCamelCase"  value="true"/>

3.特殊处理定义 resultMap

1.resultMap 的 id 是resultMap 的唯一标识

2.column 是映射查询结果的列名称

   property 是类中的属性名称     

<resultMap id="adminMap" type="Admin">
     <id column="id" property="id"></id><!--封装映射主键列-->
     <result column="admin_gender" property="gender"></result>
</resultMap>
<select id="findAdmins1" resultMap="adminMap">
     select id,account,password,admin_gender from admin
</select>

4.多表关联处理结果集

注解标签

@Insert : 插入 sql 

@Select :查询 sql

@Update :更新 sql

@Delete :删除 sql

@Results :设置结果集合

@Result : 结果

比如:

    @Delete("delete from student where id=#{id}")
    void deleteStudent(int id);

    @Insert("insert into student(num,name,gender)value (#{num},#{name},#{gender})")
    void saveStudent(Student student);


    @Select("select * from student where id=#{id}")
    @Results(id="stumap",value={
            @Result(id = true,column = "id",property = "id"),
            @Result(column = "num",property = "num")
    })
    @ResultMap(value = "stumap")
    Student findStudent(int id);

10.Mybatis 动态 SQL

MyBatis 中用于实现动态 SQL 的元素主要有:

If、 where、 trim、 set、 choose (when, otherwise)、 foreach

if

对传入的条件进行判断

where

where 动态根据where标签内的if是否有成立,动态添加where关键宁,还可以去除条件前面的关键宁(anc/ or)

当查询条件的个数不确定时,使用where标签,当标签中有返回值时,就会插入一个我where;

若标签返回的内容以and/or开头,where标签自动剔除and/or。

trim

当 WHERE 后紧随 AND 或则 OR 的 时候,就去除 AND 或者 OR。prefix 前缀,prefixOverrides 覆盖首部指定 内容

choose

choose\when\otherwise
多个条件选择一个,可有多个when
select id,num,name,gender from student
        <trim prefix="where" prefixOverrides="and">
            <choose>
                <when test="num!=0">
                    num=#{num}
                </when>
                <when test="name!=null">
                    and name=#{name}
                </when>
                <otherwise>
                    and gender=#{gender}
                </otherwise>
            </choose>
        </trim>

set

set可取去除最后一个逗号

foreach

open 表示该语句以什么开始(仅执行一次)

separator 表示在每次进行迭代之间以什么符号作为分隔符;

close 表示以什么结束(仅执行一次)

item 表示集合中每一个元素进行迭代时的别名;

index 表一个名字,表示在迭代过程中,每次迭代到的位置

collection

        如果传入的是单参数且参数类型是一个 List 时,collection 属性值为 list

        如果传入的是单参数且参数类型是一个 array 数组时,collection 的属性值为 array

<delete id="deleteStudent">
     delete from student where id in
         <foreach collection="list" item="item" open="(" separator="," close =")" >
             #{item}
         </foreach>
</delete>

11.特殊符号处理

xml属于标记语言,类似<、>、& 不能再sql中使用,mybatis会报错

解决办法
1.转义符号代替

特殊字符   转义字符

      <             &It

      >             &gt

      "              &quot

      '               &apos

      &             &amp

<delete id="deleteStudent">

    delete from student where id &lt; 10

    <if test="id!=@ &amp; id>10"></if>
</delete>


2.使用 <![CDATA[ < ]]> 进行处理,尽量只将特殊符号写在里面

<delete id="deleteStudent">
     delete from student where id <![CDATA[<]]> 10
</delete>

12.mybatis一级缓存和二级缓存

缓存(cache)的作用是为了减去数据库的压力,提高查询效率。缓存实现的原理是从数据库中查询出来的对象在使用完后不要销毁,而是存储在内存(缓存)中, 当再次需要获取该对象时,直接从内存(缓存)中直接获取,不再向数据库执行 select 语句,从而减少了对数据库的查询次数,因此提高了数据库的性能。

一级缓存

一级缓存的作用域是同一个 SqlSession, 在同一个 sqlSession 中两次执行相同的 sql 语句,第一次执行完毕会将数据库中查询的数据写到缓存(内存),第二次会从缓存中获取数据,不再从数据库查询,提高查询效率。当一个 sqlSession结束后该 sqlSession 中的一级缓存就销毁了。

Mybatis 默认开启一级缓存。

一级缓存失效(生命周期):

1. sqlsession.close(); 销毁sqlsession对象
2. sqlsession.clearCache(); 清楚缓存数据
3. 执行有关增删改操作会清除缓存数据

二级缓存

二级缓存是SqlSessionFactory级别(一个),若将查询到的数据放到二级缓存中,可实现多个 SqlSession 共享;

当第一次查询到数据后并且关闭Sqlsession时数据被存入到二级缓存中,

Mybatis 默认没有开启二级缓存需要配置开启:

1.在SqlMapperConfig.xml中启用:

        <setting name="cacheEnabled" value="true"/>

2.在Mapper映射文件中启用:

        <cache flushInterval="1000”></cache>

3.实现序列化接口:

        将所有的 POJO 类实现序列化接口 Java.io. Serializable

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

四川玖璨电商:2023怎样运营短视频?

​短视频的兴起和流行让越来越多的人关注和运营短视频号。如何运营短视频号&#xff0c;吸引更多的观众和粉丝&#xff1f;下面四川玖璨电商小编将介绍几个关键点。 首先&#xff0c;确定短视频的定位和主题非常重要。根据自己的兴趣和特长&#xff0c;确定一个独特的主题&…

R语言lasso惩罚稀疏加法(相加)模型SPAM拟合非线性数据和可视化

全文链接&#xff1a;https://tecdat.cn/?p33462 本文将关注R语言中的LASSO&#xff08;Least Absolute Shrinkage and Selection Operator&#xff09;惩罚稀疏加法模型&#xff08;Sparse Additive Model&#xff0c;简称SPAM&#xff09;。SPAM是一种用于拟合非线性数据的强…

idea新建Java-maven项目时,出现Dependency ‘ xxx(jar包名)‘ not found的解决方案

项目场景&#xff1a; 项目场景&#xff1a;使用idea创建maven项目时&#xff0c;导入简单依赖时&#xff08;本文以mysql-connector-java为例&#xff09;。 问题描述 问题&#xff1a; 首先&#xff0c;在创建新的maven项目中&#xff0c;出现下列两种情况&#xff1a; &am…

rabbitmq卸载重新安装3.8版本

卸载之前的版本的rabbitmq 卸载rabbitmq 卸载前先停止rabbitmq服务 /usr/lib/rabbitmq/bin/rabbitmqctl stop查看rabbitmq安装的相关列表 yum list | grep rabbitmq卸载rabbitmq相关内容 yum -y remove rabbitmq-server.noarch 卸载erlang 查看erlang安装的相关列表 …

java:Tomcat

文章目录 背景服务器web 服务器服务资源的分类服务器软件的分类nginx 和 tomact总结 安装Tomcatbrew安装官网压缩包安装IDEA集成IDEA插件 说明 背景 在讲 Tomcat 是啥之前&#xff0c;我们先来了解一些概念。 服务器 可以理解为一个高性能的电脑&#xff0c;但是这个电脑现在…

Linux:ansible自动化运维工具

环境介绍 当前所有执行权限我是在root下执行的&#xff0c;如果提示权限之类的&#xff0c;可以在每句命令前 加上 sudo ansible主服务器 192.168.0.194 另外两个客户端分别为 192.168.0.193 192.168.0.192 软件只需要在主服务器上安装&#xff0c;客户端不需…

Bootstrap的类container与类container-fluid有什么区别?

阅读本文前建议先阅读下面两篇博文&#xff1a; 怎么样通过Bootstrap已经编译好(压缩好)的源码去查看符合阅读习惯的源码【通过Source Map(源映射)文件实现】 在CSS中&#xff0c;盒模型中的padding、border、margin是什么意思&#xff1f; 以下是Bootstrap的类 container 的盒…

spring boot 3使用 elasticsearch 提供搜索建议

业务场景 用户输入内容&#xff0c;快速返回建议&#xff0c;示例效果如下 技术选型 spring boot 3elasticsearch server 7.17.4spring data elasticsearch 5.0.1elasticsearch-java-api 8.5.3 pom.xml <dependency><groupId>org.springframework.boot</gr…

牛客OJ 把字符串转换成整数

⭐️ 题目描述 &#x1f31f; O链接 https://www.nowcoder.com/practice/1277c681251b4372bdef344468e4f26e?tpId13&&tqId11202&rp6&ru/activity/oj&qru/ta/coding-interviews/question-ranking 思路&#xff1a; 首先需要检查第一位是否有符号位&#x…

用Idea把SpringBoot项目打包镜像上传至docker

1、设置docker把2375端口开起来 命令查看docker装在哪里 vim docker.service 新增 -H tcp://0.0.0.0:2375 -H unix://var/run/docker.sock 2、配置Dockerfile 我在跟pom同一层 3、配置docker-maven-plugin <plugin><groupId>com.spotify</groupId><arti…

Fegin异步情况丢失上下文问题

在微服务的开发中&#xff0c;我们经常需要服务之间的调用&#xff0c;并且为了提高效率使用异步的方式进行服务之间的调用&#xff0c;在这种异步的调用情况下会有一个严重的问题&#xff0c;丢失上文下 通过以上图片可以看出异步丢失上下文的原因是不在同一个线程&#xff0c…

Redis数据结构之Set

Set 类型是一个无序并唯一的键值集合&#xff0c;它的存储顺序不会按照插入的先后顺序进行存储。Redis 中集合是通过哈希表实现的&#xff0c;所以添加&#xff0c;删除&#xff0c;查找的复杂度都是 O(1)。相对于列表&#xff0c;集合也有两个特点&#xff1a;无序、不可重复 …

spring之Spring测试与集成

Spring测试与集成 摘要引言词汇解释详细介绍单元测试和集成测试单元测试和集成测试编写单元测试和集成测试代码单元测试示例集成测试示例 Spring Test和JUnit简介编写使用Spring Test和JUnit的测试代码UserService示例单元测试示例 使用Spring Test和JUnit 注意事项总结参考资料…

【WebSocket】前端使用WebSocket实时通信

目录 前言什么是WebSocketWebSocket的工作原理WebSocket与HTTP的关系HTTP建立持久化连接WebSocket类封装 前言 最近写项目&#xff0c;需要实现消息通知和实时聊天的功能&#xff0c;就去了解了一些关于websocket的知识&#xff0c;总结如下。 什么是WebSocket WebSocket 是一…

5.8.webrtc事件处理基础知识

在之前的课程中呢&#xff0c;我向你介绍了大量web rtc线程相关内容&#xff0c;今天呢&#xff0c;我们来看一下线程事件处理的基本知识。首先&#xff0c;我们要清楚啊&#xff0c;不同的平台处理事件的API是不一样的&#xff0c;这就如同我们当时创建线程是类似的&#xff0…

第12步---MySQL的JDBC操作

第12步---MySQL的JDBC操作 1.概述 采用Java API 的方式实现数据之间的操作。 根据不同的数据库采用了不同的驱动&#xff0c;接口是一致的。 下载的地址 MySQL :: Download MySQL Connector/J (Archived Versions) 2.执行流程 注册驱动 创建连接 执行sql语句的对象 结果…

Kaggle回归问题Mercedes——Benz Greener Manufacturing

目录 前言1 题目介绍2 数据清洗3 数据可视化分析4 模型训练5 源码 前言 这是我在大三选修课的课程设计&#xff0c;内容参考了Kaggle上高赞的代码&#xff0c;有详细批注&#xff0c;整体比较基础&#xff0c;结构相对完整&#xff0c;便于初学者学习。这个是一个回归问题&…

MAC电脑外放没有声音解决方案

烦人呐&#xff0c;我的mac外接显示屏幕&#xff0c;显示器没有音频输出&#xff0c;需要mac笔记本的音频输出&#xff0c;但是经常打开后&#xff0c;mac没有声音输出&#xff0c;需要重启电脑才能生效。亲测一下方法有效&#xff0c;请参考&#xff1a; 文章目录 一、短期方案…

17.4 【Linux】systemctl 针对 timer 的配置文件

有时候&#xff0c;某些服务你想要定期执行&#xff0c;或者是开机后执行&#xff0c;或者是什么服务启动多久后执行等等的。在过去&#xff0c;我们大概都是使用 crond 这个服务来定期处理&#xff0c; 不过&#xff0c;既然现在有一直常驻在内存当中的 systemd 这个好用的东西…

无涯教程-PHP - 常量数组

现在可以使用 define()函数定义数组常量。在PHP 5.6中&#xff0c;只能使用 const 关键字定义它们。 <?php//define a array using define functiondefine(animals, [dog,cat,bird]);print(animals[1]); ?> 它产生以下浏览器输出- cat PHP - 常量数组 - 无涯教程网无…
最新文章