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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
MyBatis是一个持久层框架,可以帮助你轻松地与关系型数据库进行交互。下面是搭建MyBatis框架的一般步骤: 1. 引入依赖:在你的项目中,首先需要引入MyBatis的依赖。你可以在项目的构建工具(比如Maven或Gradle)中添加MyBatis的依赖项。 2. 配置数据源:在你的项目中,需要配置一个数据源来连接数据库。这通常包括数据库的URL、用户名、密码等信息。你可以将这些配置放在一个配置文件中(比如XML文件),并在应用程序启动时加载。 3. 创建映射文件:MyBatis使用映射文件来定义数据库表与Java对象之间的映射关系。在映射文件中,你可以定义SQL语句,以及如何将结果映射到Java对象上。 4. 配置映射文件:在你的配置文件中,需要告诉MyBatis去哪里找到你的映射文件,并且给每个映射文件指定一个唯一的标识符。这样MyBatis才能正确地加载和使用这些映射文件。 5. 编写DAO接口:在你的应用程序中,需要编写DAO接口来定义操作数据库的方法。这些方法将会被MyBatis自动实现。 6. 使用MyBatis:在你的应用程序中,你可以使用MyBatis提供的API来调用已定义的DAO方法,并且执行与数据库相关的操作。 以上是一般的MyBatis框架搭建过程,当然在实际项目中可能还会有一些额外的配置和调整。希望对你有所帮助!如果还有其他问题,请继续提问。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小谭同学ha

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值