mybatis课程笔记

mybatis课程笔记

1.单独配置mybatis时,需要 mybatis-config.xml 和XXMapper.xml,大致的 xml 文件如下:
mybatis-config.xml

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configuration
 PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
 "http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
	<environments default="development">
	<!--配置环境,包括连接数据库的信息 -->
		<environment id="development">
			<transactionManager type="JDBC" />
			<dataSource type="POOLED">
				<property name="driver" value="com.mysql.jdbc.Driver" />
				<property name="url" value="jdbc:mysql://localhost:3306/mybatis" />
				<property name="username" value="root" />
				<property name="password" value="LOVE" />
			</dataSource>
		</environment>
	</environments>
	<!-- 将我们写好的sql映射文件(EmployeeMapper.xml)一定要注册到全局配置文件(mybatis-config.xml)中 ,如果用注解来配置的话,此处应该使用 class 属性指定被注解的 dao 的全限定类名-->
	<mappers>
		<mapper resource="EmployeeMapper.xml" />
	</mappers>
</configuration>

XXMapper.xml

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
 PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
 "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="beans.EmployeeMapper">
<!-- 
namespace:名称空间;指定为接口的全类名
id:唯一标识
resultType:返回值类型
#{id}:从传递过来的参数中取出id值

public Employee getEmpById(Integer id);
 -->
	<select id="getEmpById" resultType="beans.Employee">
		select * from tbl_employee where id = #{id}
	</select>
</mapper>

使用时,按照如下步骤:

ublic void test() throws Exception
    {
    	//1.读取配置文件
        String resource = "mybatis-config.xml";
        InputStream inputStream = Resources.getResourceAsStream(resource);
        //2.创建SqlSessionFactory对象
        SqlSessionFactory sqlSessionFactory =
                new SqlSessionFactoryBuilder().build(inputStream);
		//3.使用工厂生产SqlSession对象
		SqlSession session = sqlSessionFactory.openSession();
		//4.a)使用SqlSession创建 dao 接口的代理对象,使用代理对象执行方法
		EmployeeMapper employeeMapper = session.getMapper(EmployeeMapper.class);
		Employee employee = employeeMapper.getEmpById(1);
		//4.b)自己写代理类,一个类继承 dao 接口,直接使用已有接口,调用 dao 接口方法
        Employee employee = session.selectOne("beans.EmployeeMapper.getEmpById",1);

        System.out.println(employee);

        session.close();
        inputStream.close();
    }

在这里插入图片描述
mybatis 在使用代理 dao 的方式实现 crud 时做了什么事?1.创建代理对象 2.在代理对象中调用 selectOne

2.事务相关必须要知道的概念
1)什么是事务?
事务是数据库操作的最小工作单元,是作为单个逻辑工作单元执行的一系列操作;这些操作作为一个整体一起向系统提交,要么都执行、要么都不执行;事务是一组不可再分割的操作集合(工作逻辑单元)
2)事务的四大特性ACID
原子性(Atomicty):在一个事务中,一组DML语句操作要么全部成功,要么全部失败,不会出现部分成功部分失败的现象。
一致性(Consistency):一致性指的是数据库的数据在事务操作前后都必须满足业务约束条件。当事务执行失败时,所有被该事务影响的数据都应该恢复到事务执行前的状态。
隔离性(Isolation):隔离性是指数据库允许多个并发事务同时对数据库进行读写和修改的能力,隔离性可以防止多个并发事务并发执行时由于交叉执行而导致的数据不一致。
持久性(Durability):事务结束后对数据的修改是永久的,即使系统发生故障也不会丢失。
3)不考虑隔离性会产生的3个问题?
脏读、不可重复读、幻读

脏读:脏读是在RU级别中发生的现象,指 的是一个事务读取到了其他事务未提交的数据。
不可重复读:指的是在一个事务中读取到了其他事务针对旧数据的修改记录(常见的操作是update或者delete语句)。一个事务两次读取同一行的数据,结果得到不同状态的结果,中间正好另一个事务更新了该数据,两次结果相异,不可被信任。
幻读:指的是在一个事务中读取到了其他事务新增的数据,仿佛出现了幻影现象(常见的操作就是insert语句)。这种话现象允许出现在RC的事务隔离级别中。一个事务执行两次查询,第二次结果集包含第一次中没有或某些行已经被删除的数据,造成两次结果不一致,只是另一个事务在这两次查询中间插入或删除了数据造成的。

可重复读:假设在事务A中一开始读取到三行数据,在事务A还未结束时,事务B在满足事务A查询条件的情形下向数据库中添加了新的数据并做了提交,此时事务A以相同的条件再次查询,得到的数据还是事务A开始时得到的数据,并没有读到事务B新增的数据。可重复读是MySQL默认的事务隔离级别,他消除了脏读、不可重复读、幻读现象。很好的保证了事务的一致性。
4)解决办法,四种隔离级别?
读未提交(Read uncommitted),简称RU,在其中一个事务中,可以读取到其他事务未提交的数据变化。这种读取到其他事务还未提交的事务,叫做脏读现象。
读已提交(read commted),简称RC,在其中一个事务中,可以读取到其他事务已经提交的数据变化。这种读取也叫作不可重复读,允许幻读现象,是Oracle数据库的默认隔离级别。
可重复读(repetable read),简称RR,是MySQL默认的事务隔离级别,在其中一个事务中,直到事务结束前,都可以反复读取到事务刚开始时读到的数据,并一直不会发生变化,避免了脏读,不可重复读,幻读现象的发生。重复读,就是在开始读取数据(事务开启)时,不再允许修改操作。重复读可以解决不可重复读问题。应该明白的一点就是,不可重复读对应的是修改,即UPDATE操作。但是可能还会有幻读问题。因为幻读问题对应的是插入INSERT操作,而不是UPDATE操作。采用Serializable可以解决幻读问题
串行化(serializable),在每个读取的数据行上都需要加上表级共享锁,在每次写操作时都需要加上表级排它锁。这会造成Innodb的并发能力下降,大量的超时和锁竞争的发生。

mysql遇到的一个小问题:
当设置的外键对应的另一个表的主键值时,插入的数据该字段的值在另一个表中不存在时,会报错:annot add or update a child row: a foreign key constraint fails。解决方法:找出不匹配的值修改。或者清空两表数据。

总结必须掌握的:
1.mybatis环境搭建,mybatis-config.xml 是必须的,mapper.xml和注解二选一,一旦选注解就不能使用xml方式
2.单标crud,参数和返回值的封装(resultMap),dao的编写,配置的细节(别名,引入db.properties文件等)
3.多表查询(一对一、一对多),事务控制。
4.延迟加载和即时加载,一级缓存和二级缓存。一级缓存默认开启,二级需手动开启。一级缓存作用域是一个sqlsession内,二级缓存作用域是针对mapper进行缓存。一级缓存是在参数和sql一样的情况下,同一个sqlsession。增删改操作后执行commit,关闭sqlsession,调用clearCache方法或查询语句中有flush,会清空一级缓存。二级缓存是多个sqlsession共享的缓存。开启二级缓存后查找顺序是先二级,再一级,再数据库。

注:mybatis不需要dao的实现类,会自动为接口创建代理类与数据库交互

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值