Mybatis的简单总结

JDBC操作数据库:

  1. 首先需要操作mysql数据库的驱动jar包:mysql-connector-java-5.1.32.jar。
  2. 操作就是 : 加链预执释。
    a) 需要注意的是对结果集的处理和执行sql是调用的函数不同。
    在这里插入图片描述
    数据库连接池(druid):
    依赖druid的jar包: druid-1.0.9.jar
    连接池中维护有都个连接对象,我们可以直接从中取对象,用完之后放回。避免频繁创建对象所花费的时间,提高效率。
  3. 首先写druid的配置文件,key官方指定,不能改变。
    a) 在这里插入图片描述
  4. 加载配置文件,得到连接对象:
    在这里插入图片描述
    执行流程分析
    架构图:
    在这里插入图片描述
    执行原理图:
    在这里插入图片描述

Mybatis的基本使用:
在上述的jdbc和druid的使用中,我们发现,我们反复书写了很多的非核心的代码,并且对结果集的处理非常的麻烦。
Mybatis中体现的ORM(对象关系映射)思想:通过对象和数据库之间映射的数据结构关系,将java程序中的对象自动持久化到关系数据库中。解决对象和关系的映射。

基本的配置:
对于mybatis所需要的jar: mybatis-3.4.5.jar(核心包)还有一些:比如日志,数据库,druid
首先我们mybatis需要两个配置文件:

  1. Mybatis的主配置文件。一般为mybatis-config.xml.
    主配置文件一般配置数据库信息(连接池,事务,)和全局配置信息(关联映射文件,插件)等。
    在这里插入图片描述
    配置日志框架:
    依赖jar包: log4j-1.2.17.jar
    在全局配置文件中配置:
	<settings>
		<setting name="logImpl" value="LOG4J" />
	</settings>
  1. Mybatis的映射文件(重点),一般是xxxMapper.xml xxx表哦是模型对象。
    一般配置包含该对象的CRUD操作的配置和sql.


    select * from student where id=#{id}


    其中,我们需要配置一个namespace(命名空间)。以便找到对应的sql。
    Mapper标签下有多个子标签
    Insert delete update select对应增删改查。唯一的id名。
    parameterType表示你的参数的类型的全限定名,一般不用配置,mybatis会根据参数自己找,
    resultType表示你查询结果集的每一行封装成什么数据类型(全限定名)可以配置别名。
    当我们查询多行数据的时候,记得使用list接收,调用selectList方法。单个调用selectOne方法。
    基本的使用:
    在test代码中:
    在这里插入图片描述
    上面就完成了最基本的使用。我们会发现最简单的很多的代码都是重复的,我们可以抽取工具类,我们创建sqlsession时调用的无参构造函数,所以我们在执行增删改的时候,我们需要手动提交事务,session.commit()。
    在insert和update中,我们保存了数据,通常需要返回主键。
	insert into student (name,age) values(#{name},#{age})
</insert>

将主键注入到id属性,执行之后,我们打印对象的id属性就可以看到了。
进阶操作:

  1. 配置别名(不区分大小写)
<typeAliases>
	<package name="Hello"/><!-- 自动配置别名,默认是类名首字母小写 -->
</typeAliases>

还可以使用@Alias(“xxx”)贴在类上。用注解的方式自己配置别名为xxx。一般避免使用。
常见的数据类型(int double,String等)系统内建了有相应的别名。
2. 查询结果映射resultMap 。一般在开发中都避免这种情况
a) 当我们的结果集中的列名和对象名不对应的时候。我们需要处理结果集,使之匹配。

<resultMap type="stu" id="baseMap">
	<result column="uid" property="id"/>
	<result column="uname" property="name"/>
	<result column="uage" property="age"/>
cloumn对应数据库中的列名。Property对应我们对象属性名。 在查询时 写上resultMap="baseMap"就ok了。 select * from student
  1. 我们可以采用更加简单的mapper接口的方式来执行sql.(在开发中用的更多)
    a) 在mapper接口中定义每一个操作方式,直接调用mapper的方法,就相当于执行了相关联的xml中的sql语句。方便。
    b) 一般我们把mapper接口和mapper.xml文件都放在一个包中,合起来叫mapper组件
    c) Mapper.xml文件的namespace就是对应mapper接口的全限定名称。Mapper接口中的方法名称就对应mapper.xml中的元素的id。(相当于关联起来了)
    步骤:
    在这里插入图片描述
    Mapper组件的实现原理是动态代理:
    生成一个代理对象。来执行操作。
  2. 参数处理。我们在Sqlsession中的增删改查都只能传入一个参数。多个参数时,此时我们就可以将参数进行封装。
    a) 我们将多个参数封装成一个pojo对象或者Map中。我们在mapper.xml文件中使用#{}引用的就是对象的属性或者map里面的key。
    b) 使用@Param注解。在mapper接口的方法中使用多个参数,每个参数都使用@Param注解,底层的原理其实就是使用map封装。
    c) 例如:在mapper方法中定义。
    void save2(@Param(“name”)String name,@Param(“password”)String password);
    使用:
    loginMapper.save2(“曾伟2”, “123”);
  3. #和KaTeX parse error: Expected 'EOF', got '#' at position 21: …可以获取对象中的信息。 a) #̲传递的参数会先转化成?,再通过….例如:我们在select中有一个ORDER BY 分组或者排序等后面设置一个数据。直接是sql的一部分,就是$
    动态sql(拼接sql):
  4. if,choose(类似于switch),when,otherwise:
  5. where,set,trim
  6. foreach:批量操作
    a) foreach元素用于迭代一个集合/数组,通常构建在IN运算符条件中。
    例如:删除id为1,2,3 的数据。
    Sql:delete from student where id in (1,2,3)
    现在在mapper接口中定义方法:ids={10,20,30}
    void batchDelete(@Param(“ids”) long[] ids); delete from student where id in

其中collection表示需要遍历的集合或数组
Key就是在collection=“key“。
参数是数组类型,map的key为array.
参数是List类型,map的key为list
我们可以在参数上使用@param注解。可以直接规定key是什么。
open表示在遍历开始加什么,close在之后加什么,
Separator表示用什么分割,item就是后面遍历的标识符。
Index是迭代的索引。
缓存机制:
原理就是一个map(存在内存中):我们在查询的时候会从先缓存中查询。没有命中才操作数据库,并且更新缓存。

  1. Mybatis的一级缓存(本地缓存,):默认开启,不能关闭,性能不行。
    在同一个sqlsession中存在一个map,用来缓存查询的对象。因为其实我们基本每一次操作都是新的sqlsession对象,sqlsession之间不能共享一级缓存,
    Cachekey是否相同的因素有:statementId,offset,limit,sql语句,参数。
    如果我们在会话中有任何修改数据库的操作,那么缓存失效。
    在这里插入图片描述
  2. Mybatis的二级缓存(查询缓存,mapper级别的):手动开启和配置。
    a) 在全局配置文件中启动二级缓存。默认开启。
    b) 在mapper文件中使用cache元素把namespace和缓存绑定。
    可以在cache中进行缓存配置。
    c) 并且我们的要缓存的java对象要实现Serializable接口。
    二级缓存也是把换粗放在内存里面。当内存用完了,就会放在硬盘里面(序列化),所以缓存的对象要实现Serializable接口。
    d) 一般列表查询(多条数据)不使用缓存,不容易命中。可以在select中的userCache设置为false。不使用缓存。
    e) 所有的select的默认都会使用缓存
    f) 默认情况增删改都会刷新缓存。可以设置insert,update,delete中的flush设置为false,不刷新缓存。
    我们还可以自定义缓存。
    Mybatis的逆向工程:
    我们可以在网上找到mybatis的逆向工程,然后自动生成mapper组件(mapper文件和pojo)。对于基本的单表查询,基本可以满足。对于逆向工程代码的具体使用如下:
    一般是使用QBC风格的方式来执行。也就是criteria和example来设置条件。
    在这里插入图片描述
    忘记了可以查看项目中的代码。

Mybatis-pageHelper(Mybatis的分页插件):
在maven创建项目的pom文件中添加依赖:

com.github.pagehelper
pagehelper
3.4.2

这里使用的是3.4.2版本
实现原理:
在mysql中,分页的原理就是在sql中使用limit来限制结果数,那么我们只需要在我们执行的sql中编写相应的sql语句就可以实现分页了。但是我们一般都是使用mybatis的逆向工程来生成pojo和mapper文件。所以我们这里使用PageHelper插件来完成.(原理就是主要作用在Executor执行器与mappedeStatement之间,也就是说mybatis可以在插件中获得要执行的sql语句,在sql语句中添加limit语句,然后再去对sql进行封装,从而可以实现分页处理。)

Mybatis的执行流程图:
在这里插入图片描述
导入了jar之后。我们需要在mybatis的全局配置SqlMapperConfig.xml文件中配置插件。









我们在service编写代码使用。
//初始化spring容器
ApplicationContext applicationContext=new ClassPathXmlApplicationContext(“classpath*:/spring/applicationContext-dao.xml”);
//获得mapper代理对象
TbItemMapper itemMapper = applicationContext.getBean(TbItemMapper.class);
//执行sql之前设置分页信息使用pageHelper中的startPage方法
PageHelper.startPage(1, 10);
//执行sql
TbItemExample example=new TbItemExample();
List list = itemMapper.selectByExample(example);//返回一个list
//取分页信息。pageInfo
PageInfo pageInfo=new PageInfo<>(list);
System.out.println(pageInfo.getTotal());//全部记录数
System.out.println(pageInfo.getPages());//页数
System.out.println(pageInfo.getSize());

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值