Mybatis学习笔记

mybatis概述

  • 什么是框架
    软件开发中的一套解决方案,不同的框架解决不同的问题。框架封装了许多的细节,使开发者可以使用极简的方式实现功能,大大提高开发效率。简言之,框架就是某种应用的半成品,就是一组组件,供你选用完成你自己的系统。使用别人搭建好的舞台,你来作表演。
  • 三层架构
    架构作用
    表现层用于展示数据
    业务层用于处理业务需求
    持久层和数据库交互的
  • 持久层技术解决方案
    Jdbc技术:Connection PreparedStatement ResultSet
    Spring中的JdbcTemplate:对Jdbc的简单封装(工具类)
    Apache的DBUtils:对Jdbc的简单封装(工具类)
  • mybatis是一个持久层框架,用Java编写的。它封装了jdbc操作的许多细节,使开发者只需关注sql语句本身,而无需关注注册驱动,创建链接等繁杂过程。它使用ORM思想实现对结果集的封装。
  • ORM(object relation mapping):对象关系映射,即把数据库和实体类及实体类的属性对应起来,让我们可以操作实体类就实现操作数据库。

mybatis环境搭建

  • 创建maven工程并导入坐标
  • 创建实体类和dao的接口
  • 创建mybatis的主配置文件(SqlMapConfig.xml)
  • 创建映射配置文件(IUserDao.xml)
    注意事项:
  • 包在创建com.itheima.dao时为三级结构,而目录在创建com.itheima.dao时为一级结构,用/分隔开才是三级结构
  • mybatis的映射配置文件位置必须的dao接口的包结构相同
  • 映射配置文件的mapper标签namespace属性的取值必须为dao接口的全限定类名
  • 映射配置文件的操作配置,id属性的取值必须时dao接口的方法名

mybatis入门案列

  1. 读取配置文件
InputStream in = Resources.getResourceAsStream("SqlMapConfig.xml");
  1. 创建SqlSessionFactory工厂
SqlSessionFactoryBuilder builder = new SqlSessionFactoryBuilder();
SqlSessionFactory factory = builder.build(in);
  1. 使用工厂生产SqlSession对象
SqlSession session = factory.openSession();
  1. 使用SqlSession创建Dao接口的代理对象
IUserDao userDao = session.getMapper(IUserDao.class);
  1. 使用代理对象执行方法
List<User> users = userDao.findAll();
  for(User user : users){
    System.out.println(user);
}
  1. 释放资源
session.close();
in.close();

注意事项:不要忘记在映射配置文件中告知mybatis要封装到哪个类中,配置时使用全限定类名。

Mybatis的CRUD操作

IUserDao.xml文件的配置:

<mapper namespace="com.itheima.dao.IUserDao">

    <!--当实体类成员变量名和数据库列名不一致时需要如下配置-->
    <!-- 配置 查询结果的列名和实体类的属性名的对应关系 -->
    <!--在有返回值的查询中,resultType="com.itheima.domain.User"要替换为resultMap="userMap"-->
    <resultMap id="userMap" type="uSeR">
        <!-- 主键字段的对应 -->
        <id property="userId" column="id"></id>
        <!--非主键字段的对应-->
        <result property="userName" column="username"></result>
        <result property="userAddress" column="address"></result>
        <result property="userSex" column="sex"></result>
        <result property="userBirthday" column="birthday"></result>
    </resultMap>

    <select id="findAll" resultType="com.itheima.domain.User">
        select * from user
    </select>

    <insert id="saveUser" parameterType="com.itheima.domain.User">
        <selectKey resultType="Integer" keyProperty="id" keyColumn="id" order="AFTER">
            select last_insert_id();
        </selectKey>
        insert into user(username, address, sex, birthday)values(#{username}, #{address}, #{sex}, #{birthday});
    </insert>

    <update id="updateUser" parameterType="com.itheima.domain.User">
        update user set username=#{username}, address=#{address}, sex=#{sex}, birthday=#{birthday} where id=#{id}
    </update>

    <delete id="deleteUser" parameterType="Integer">
        delete from user where id=#{user}
    </delete>

    <select id="findById" parameterType="Integer" resultType="com.itheima.domain.User">
        select * from user where id = #{uid}
    </select>

    <select id="findByName" parameterType="String" resultType="com.itheima.domain.User">
        select * from user where username like #{uname}
    </select>

    <select id="findTotal" resultType="Integer">
        select count(id) from user
    </select>

    <!--根据QueryVo查询用户-->
    <select id="findUserByVo" parameterType="com.itheima.domain.QueryVo" resultType="com.itheima.domain.User">
        select * from user where username like #{user.username}
    </select>
</mapper> 

typeAliases和package

  • typeAliases配置别名,只能配置domain中类的别名。
    • typeAlias用于配置别名,type属性用于指定实体类全限定类名,alias属性用于指定别名,当指定了别名后就不区分大小写。
  • package用于指定配置别名的包,当指定之后,该包下的实体类都会注册别名,并且类名就是别名,不再区分大小写。
    • name属性用于指定配置别名的包。
<typeAliases>
        <!-- <typeAlias type="com.itheima.domain.User" alias="user"></typeAlias> -->
        <package name="com.itheima.domain"/>
    </typeAliases>

连接池

连接池可以减少我们获取连接所消耗的时间。

mybatis中连接池的三种配置方式:

配置位置:主配置文件SqlMapConfig.xml中的dataSource标签,type属性表示采用何种连接池方式。

type的属性:

  • POLLED:采用传统的javax.sql.DataSource规范中的连接池
  • UNPOOLED:采用传统的获取连接的方式
  • JNDI:采用服务器提供的JNDI技术实现

mybatis中的延迟加载

什么是延迟加载

在真正需要使用数据时才发起查询,不用的时候不查询。按需加载(懒加载)

什么是立即加载

不管用不用,只要一调用方法,马上发起查询。
一对多,多对多:延迟加载
多对一,一对一:立即加载

mybatis中的缓存

什么是缓存

存在内存中的临时数据

为什么使用缓存

减少和数据库的交互次数,提高执行效率

什么样的数据能使用缓存,什么样的数据不能使用缓存

适用于:经常查询且不经常改变的。数据的正确与否对最终结果影响不大。

不适用于:经常改变的数据。数据的正确与否对最终结果影响很大。

mybatis中的一级缓存和二级缓存

  • 一级缓存:指mybatis中SqlSession对象的缓存。当我们执行查询后,查询的结果会同时存入到SqlSession为我们提供的一块区域中,该区域是一个map。当我们再次查询同样的数据时,mybatis会先去SqlSession中查询是否有。有的话直接拿出来用。当SqlSession对象消失后,mybatis一级缓存也就消失了。
  • 二级缓存:指mybatis中SqlSessionFactory对象缓存。由同一个SqlSessionFactory对象创建的SqlSession共享缓存。

    二级缓存使用步骤:
    • 让mybatis框架支持二级缓存(在SqlMapConfig.xml中配置)
    • 让当前映射文件支持二级缓存(在IUserDao.xml中配置)
    • 让当前操作支持二级缓存(在select标签中配置)
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值