一、Mybatis学习

1、Mybatis简介

简介:Mybatis开源免费框架.原名叫iBatis,2010在googlecode,2013年迁移到github2
作用:数据访问层框架、底层是对JDBC的封装
优点:使用mybatis时不需要编写实现类,只需要写需要执行的sql命令

2、环境搭建

导入jar

在src下新建全局配置文件(编写JDBC四个变量)没有名称和地址要求、在全局配置文件中引入DTD或schema如果导入dtd后没有提示Window-->preference-->XML-->XMlcatalog-->add按钮
全局配置文件内容:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE configurationPUBLIC "-//mybatis.org//DTD Config 3.0//EN""http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration><!-- default引用environment的id,当前所使用的环境 --><environments default="default"><!-- 声明可以使用的环境 --><environment id="default"><!-- 使用原生JDBC事务 --><transactionManager type="JDBC"></transactionManager><dataSource type="POOLED"><property name="driver" value="com.mysql.jdbc.Driver"/><property name="url" value="jdbc:mysql://localhost:3306/ssm"/><property name="username" value="root"/><property name="password" value="123456"/></dataSource></environment></environments><mappers><mapper resource="cn/lqq/mapper/FlowerMapper.xml"/></mappers>
</configuration>
新建以mapper结尾的包,在包下新建:实体类名+Mapper.xml文件作用:编写需要执行的SQL命令、把xml文件理解成实现类Mapper.xml文件内容:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapperPUBLIC "-//mybatis.org//DTD Mapper 3.0//EN""http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<!-- namesapce:理解成实现类的全路径(包名+类名) -->
<mapper namespace="a.b" ><!-- id:方法名 parameterType:定义参数类型resultType:返回值类型.如果方法返回值是list,在resultType中写List的泛型,因为mybatis对jdbc封装,一行一行读取数据--><select id="selAll" resultType="cn.lqq.pojo.Flower">select * from flower</select>
</mapper>
测试结果(只有在单独使用mybatis时使用,最后ssm整合时下面代码不需要编写)
     InputStream is = Resources.getResourceAsStream("myabtis.xml");//使用工厂设计模式SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(is);//生产SqlSessionSqlSession session=factory.openSession();   List<Flower> list = session.selectList("a.b.selAll");session.close();}

3、环境搭建详解

全局配置文件中内容:<transactionManager/>type属性可取值JDBC,事务管理使用JDBC原生事务管理方式MANAGED把事务管理转交给其他容器.原生JDBC事务setAutoMapping(false)<dataSouce/>type属性POOLED使用数据库连接池UNPOOLED不实用数据库连接池,和直接使用JDBC一样JNDI:java命名目录接口技术

4、数据库连接池

在内存中开辟一块空间,存放多个数据库连接对象
JDBCTomcatPool,直接由tomcat产生数据库连接池.active状态:当前连接对象被应用程序使用中Idle空闲状态:等待应用程序使用
使用数据库连接池的目的在高频率访问数据库时,使用数据库连接池可以降低服务器系统压力,提升程序运行效率小型项目不适用数据库连接池.
实现JDBCtomcatPool的步骤在web项目的META-INF中存放context.xml,在context.xml编写数据库连接池相关属性
<?xml version="1.0" encoding="UTF-8"?>
<Context><ResourcedriverClassName="com.mysql.jdbc.Driver"url="jdbc:mysql://localhost:3306/ssm"username="root"password="123456"maxActive="50"maxIdle="20"name="test"auth="Container"maxWait="10000"type="javax.sql.DataSource" />
</Context>
把项目发布到tomcat中,数据库连接池产生了
可以在java中使用jndi获取数据库连接池中对象Context:上下文接口.context.xml文件对象类型
当关闭连接对象时,把连接对象归还给数据库连接池,把状态改变成Idle

5、三种查询方式

selectList()返回值为List<resultType属性控制>、适用于查询结果都需要遍历的需求
 List<Flower> list = session.selectList("a.b.selAll");
selectOne()返回值Object、适用于返回结果只是变量或一行数据时
 int count = session.selectOne("a.b.selById");
selectMap()返回值Map、适用于需要在查询结果中通过某列的值取到这行数据的需求
 Map<Object, Object> map = session.selectMap("a.b.c", "name");// Map<key,resultType控制>

6、注解和路径

注解存在的意义:简化 xml 文件的开发、注解在 servlet 3.0 规范之后大力推广的
注解前面的@XXX,表示引用一个@interface
使用:@interface 表示注解声明、注解可以有属性,因为注解其实就是一个接口(类)每次使用注解都需要导包
注解语法: @XXXX(属性名= 值)值的分类:如果只有一个值可以省略大括号值:基本数据类型或字符串: 属性名=值值:数组类型: 属性名={值,值}值:类类型:属性名=@名称
注意:如果注解只需要给一个属性赋值,且这个属性是默认属性,可以省略属性名
路径目的:编写路径为了告诉编译器如何找到其他资源
路径分类:相对路径: 从当前资源出发找到其他资源的过程绝对路径: 从根目录(服务器根目录或项目根目录)出发找到其他资源的过程
标志: 只要以/开头的都是绝对路径绝对路径:如果是请求转发 / 表示项目根目录(WebContent)其他和重定向路径:<img/> <script/>,<style/>,location.href 等,/都表示服务器根目录(tomcat/webapps 文件夹)
注意:如果客户端请求的控制器,控制器转发到JSP后,jsp中如果使用相对路径,需要按照控制器的路径去找其他资源。保险办法:使用绝对路径,可以防止上面的问题

7、Log4J

简介:log4j由 apache 推出的开源免费日志处理的类库
目的:在项目中编写 System.out.println()语句输出到控制台,当项目发布到 tomcat 后,没有控制台(在命令行界面能看见.),不容易观察一些输出结果
log4j 作用,不仅能把内容输出到控制台,还能把内容输出到文件中,便于观察结果
使用步骤:导入 log4j-xxx.jar在 src 下新建 log4j.properties(路径和名称都不允许改变)ConversionPattern :写表达式log4j.appender.LOGFILE.File 文件位置及名称(日志文件扩展名.log)
 log4j.rootCategory=ERROR, CONSOLE ,LOGFILElog4j.appender.CONSOLE=org.apache.log4j.ConsoleAppenderlog4j.appender.CONSOLE.layout=org.apache.log4j.PatternLayoutlog4j.appender.CONSOLE.layout.ConversionPattern=%C %p  %m %nlog4j.appender.LOGFILE=org.apache.log4j.FileAppenderlog4j.appender.LOGFILE.File=E:/my.loglog4j.appender.LOGFILE.Append=truelog4j.appender.LOGFILE.layout=org.apache.log4j.PatternLayoutlog4j.appender.LOGFILE.layout.ConversionPattern=%C %m %L %n
log4j 输出级别:fatal(致命错误)-->error(错误)-->warn(警告)-->info(普通信息)-->debug(调试信息)
在 log4j.properties 的第一行中控制输出级别pattern 中常用几个表达式:%C 包名+类名             %d{YYYY-MM-dd HH:mm:ss} 时间%L 行号                 %m 输出的信息                    %n 换行
开启Mybatis的日志功能:使用<settings>标签在 mybatis 全局配置文件中通过<settings>标签控制 mybatis 全局开关在 mybatis.xml 中开启 log4j必须保证有 log4j.jar、在 src 下有 log4j.properties
 <settings><setting name="logImpl" value="LOG4J"/></settings>
log4j 中可以输出指定内容的日志(控制某个局部内容的日志级别) 命名级别(包级别): <mapper>namespace 属性中除了最后一个类名例如 namespace=”cn.lqq.mapper.PeopleMapper” 其中包级别为 cn.lqq.mapper,同时需要在 log4j.propeties 中:先在总体级别调成 Error 不输出无用信息再设置某个指定位置级别为 DEBUG
类级别:namespace 属性值 ,namespace 类名
方法级别:使用 namespace 属性值+标签 id 属性值

8、parameterType属性

在 XXXMapper.xml 中<select><delete>等标签的 parameterType 可以控制参数类型
SqlSession的selectList()和 selectOne()的第二个参数和 selectMap()的第三个参数都表示方法的参数
在 Mapper.xml中可以通过#{}获取参数、parameterType 控制参数类型、#{}获取参数内容使用索引,从 0 开始 #{0}表示第一个参数、也可以使用#{param1}第一个参数如果只有一个参数(基本数据类型或 String),mybatis对#{}里面内容没有要求只要写内容即可如果参数是对象#{属性名}、如果参数是 map 写成#{key}
 <select id="selById" resultType="cn.lqq.pojo.People" parameterType="int">select * from people where id=#{0}</select>
#{} 和 ${} 的区别:#{} 获取参数的内容支持索引获取,param1 获取指定位置参数,并且 SQL 使用?占位符${} 字符串拼接不使用?,默认找${内容}内容的 get/set 方法,如果写数字,就是一个数字
如果在 xml 文件中出现 “<” , “>” ,双引号等特殊字符时可以使用XML文件转义标签(XML 自身的)

9、typeAliases别名

系统内置别名: 把类型全小写
给某个类起别名:alias=”自定义”mybatis.xml文件中配置
 <typeAliases><typeAlias type="cn.lqq.pojo.People" alias="peo"/></typeAliases>
 mapper.xml 中 peo 引用 People 类
 <select id="page" resultType="peo" parameterType="map"> select * from people limit #{pageStart},#{pageSize}</select>
直接给某个包下所有类起别名,别名为类名,不区分大小写mybatis.xml文件中配置
 <typeAliases><package name="com.lqq.pojo" /></typeAliases>
 mapper.xml 中通过类名引用
 <select id="page" resultType="People" parameterType="map"> select * from people limit #{pageStart},#{pageSize}</select>

10、Mybatis实现新增、修改和删除

概念复习:功能:从应用程序角度出发,软件具有哪些功能.业务:完成功能时的逻辑.对应 Service 中一个方法事务:从数据库角度出发,完成业务时需要执行的 SQL 集合,统称一个事务事务回滚:如果在一个事务中某个 SQL 执行事务,希望回归到事务的原点,保证数据库数据的完整性提交:在 mybatis 中默认是关闭了 JDBC 的自动提交功能、每一个 SqlSession 默认都是不自动提交事务session.commit()提交事务、openSession(true);自动提交底层就是setAutoCommit(true)回滚操作:在 openSession()时 Mybatis 会创建 SqlSession 时同时创建一个Transaction(事务对象),同时 autoCommit 都为 false、如果出现异常,应该 session.rollback()回滚事务
mybatis 底层是对 JDBC 的封装JDBC中executeUpdate()执行新增,删除,修改的SQL,返回值int,表示受影响的行数mybatis中<insert> <delete> <update>标签没有 resultType 属性,认为返回值都是 int
实现新增的步骤:在 mapper.xml 中提供<insert>标签,标签没有返回值类型
 <insert id="ins" parameterType="People">insert into people values(default,#{name},#{age})</insert>
 通过 session.insert()调用新增方法
实现修改的步骤:在 mapper.xml 中提供<update>标签,标签没有返回值类型
 <update id="upd" parameterType="People"> update people set name = #{name} where id = #{id}</update>
实现删除的步骤:在 mapper.xml 提供<delete>标签,标签没有返回值类型
 <delete id="del" parameterType="int"> delete from people where id = #{0}</delete>

11、Mybatis接口绑定方案及多参数传递

作用:实现创建一个接口后把mapper.xml由mybatis生成接口的实现类,通过调用接口对象就可以获取 mapper.xml中编写的sql、后面mybatis和spring整合时使用的是这个方案
实现步骤:创建一个接口:接口包名和接口名与 mapper.xml 中<mapper>namespace相同接口中方法名和 mapper.xml 标签的 id 属性相同 在 mybatis.xml 中使用<package>进行扫描接口和 mapper.xml
实例:在 mybatis.xml 中<mappers>下使用<package>
 <mappers><package name="cn.lqq.mapper"/></mappers>
 在 cn.lqq.mapper 下新建接口
 public interface LogMapper {List<Log> selAll();     }
 在 cn.lqq.mapper 新建一个 LogMapper.xmlnamespace 必须和接口全限定路径(包名+类名)一致id 值必须和接口中方法名相同如果接口中方法为多个参数,可以省略 parameterType
 <mapper namespace="cn.lqq.mapper.LogMapper"><select id="selAll" resultType="log">select * from log</select></mapper>
多参数实现办法在接口中声明方法
 List<Log> selByAccInAccout(String accin, String accout);
 在 mapper.xml 中添加#{}中使用 0,1,2 或 param1,param2
 <mapper namespace="cn.lqq.mapper.LogMapper"><select id="selByAccInAccout" resultType="log" >select * from log where accin=#{0} and accout=#{1}</select></mapper>
也可以使用注解方式、在接口中声明方法mybatis把参数转换为map了,其中@Param("key") 参数内容就是map的value
 List<Log> selByAccInAccout(@Param("accin") String accin,@Param("accout") String accout);
 在 mapper.xml 中添加#{} 里面必须写@Param(“内容”)参数中内容
 <mapper namespace="cn.lqq.mapper.LogMapper"><select id="selByAccInAccout" resultType="log" >select * from log where accin=#{accin} and accout=#{accout}</select></mapper>

12、动态SQL

概念:根据不同的条件需要执行不同的 SQL 命令,称为动态 SQL
MyBatis中动态 SQL 在 mapper.xml 中添加逻辑判断等

12.1、If 使用

 <select id="selByAccinAccout" resultType="log">select * from log where 1=1<if test="accin!=null and accin!=''">and accin=#{accin}</if><if test="accout!=null and accout!=''">and accout=#{accout}</if></select>

12.2、where使用

当编写 where 标签时,如果内容中第一个是 and 去掉第一个and
如果<where>中有内容会生成 where 关键字,如果没有内容不生成 where 关键字比直接使用<if>少写 where 1=1
 <select id="selByAccinAccout" resultType="log">select * from log <where><if test="accin!=null and accin!=''">and accin=#{accin}</if><if test="accout!=null and accout!=''">and accout=#{accout}</if></where></select>

12.3、choose、when、otherwise使用

只有一个成立,其他都不执行
 <select id="selByAccinAccout" resultType="log">select * from log <where><choose><when test="accin!=null and accin!=''">and accin=#{accin}</when><when test="accout!=null and accout!=''">and accout=#{accout}</when></choose></where></select>

12.4、set用在修改SQL中set从句

作用:去掉最后一个逗号如果<set>里面有内容生成 set 关键字,没有就不生成
id=#{id}目的防止<set>中没有内容,mybatis不生成set关键字,如果修改中没有set从句SQL语法错误
 <update id="upd" parameterType="log" >update log <set>id=#{id},<if test="accIn!=null and accIn!=''">accin=#{accIn},</if><if test="accOut!=null and accOut!=''">accout=#{accOut},</if></set>where id=#{id}</update>

12.5、trim使用

prefix 在前面添加内容
prefixOverrides 去掉前面内容
suffix 在后面添加内容
suffixOverrieds 去掉后面内容
执行顺序去掉内容后添加内容
 <update id="upd" parameterType="log">update log<trim prefix="set" suffixOverrides=",">a=a,</trim>where id=100</update>

12.6、bind使用

作用:给参数重新赋值
场景:模糊查询、在原内容前或后添加内容
 <select id="selByLog" parameterType="log" resultType="log"><bind name="accin" value="'%'+accin+'%'"/>#{money}</select>

12.7、foreach使用

循环参数内容,还具备在内容的前后添加内容,还具备添加分隔符功能
适用场景:in 查询中.批量新增中(mybatis 中 foreach 效率比较低)
如果希望批量新增,SQL 命令insert into log VALUES (default,1,2,3),(default,2,3,4)
openSession()必须指定factory.openSession(ExecutorType.BATCH)
底层就是JDBC的PreparedStatement.addBatch()
参数:collectino=”” 要遍历的集合item 迭代变量, #{迭代变量名}获取内容open 循环后左侧添加的内容close 循环后右侧添加的内容separator 每次循环时,元素之间的分隔符
 <select id="selIn" parameterType="list" resultType="log">select * from log where id in<foreach collection="list" item="abc" open="(" close=")" separator=",">#{abc}</foreach></select>

12.8、sql和include使用

某些 SQL 片段如果希望复用,可以使用<sql>定义这个片段
 <sql id="mysql"> id,accin,accout,money  </sql>
在<select>或<delete>或<update>或<insert>中使用<include>引用
 <select id=""> select <include refid="mysql"></include> from log</select>

13、ThreadLocal

概念:线程容器,给线程绑定一个 Object内容,之后只要线程不变,可以随时取出,改变线程,无法取出内容
应用:factory实例化的过程是一个比较耗费性能的过程因此要保证在项目中有且只有一个factory。可以封装一个工具类使用ThreadLocal加载SqlSession工厂,并在过滤器Filter中进行session的创建、提交和回滚操作。
public class MyBatisUtil {private static SqlSessionFactory factory;private static ThreadLocal<SqlSession> tl = new ThreadLocal<>();static{//此处可捕获异常InputStream is = Resources.getResourceAsStream("mybatis.xml");factory = new SqlSessionFactoryBuilder().build(is);
}public static SqlSession getSession(){SqlSession session = tl.get();if(session==null)tl.set(factory.openSession());return tl.get();}public static void closeSession(){SqlSession session = tl.get();if(session!=null)session.close();tl.set(null);}
}
过滤器中的代码:
 public void doFilter(ServletRequest servletrequest, ServletResponse servletresponse, FilterChain filterchain) throws IOException, ServletException {    SqlSession session = MyBatisUtil.getSession();try {filterchain.doFilter(servletrequest, servletresponse);session.commit();} catch (Exception e) {session.rollback();}finally{MyBatisUtil.closeSession();}}

14、缓存

问题:应用程序和数据库交互的过程是一个相对比较耗时的过程
缓存存在的意义:让应用程序减少对数据库的访问,提升程序运行效率
MyBatis中默认SqlSession缓存开启,同一个 SqlSession 对象调用同一个<select>时,只有第一次访问数据库,第一次之后把查询结果缓存到 SqlSession 缓存区(内存)中,缓存的是 statement 对象
在 myabtis 时一个<select>对应一个 statement 对象,有效范围必须是同一个 SqlSession 对象
缓存流程步骤一: 先去缓存区中找是否存在 statement                      步骤二:返回结果步骤三:如果没有缓存 statement 对象,去数据库获取数据        步骤四:数据库返回查询结果步骤五:把查询结果放到对应的缓存区中
SqlSessionFactory 缓存、又叫:二级缓存有效范围:同一个 factory 内哪个 SqlSession 都可以获取什么时候使用二级缓存:当数据频繁被使用,很少被修改使用二级缓存步骤:在 mapper.xml 中添加chche标签, 如果不写 readOnly=”true”需要把实体类序列化<chche  readOnly=”true”></cache>当 SqlSession 对象 close()时或 commit()时会把 SqlSession 缓存的数据刷(flush)到 SqlSessionFactory 缓存区中

15、Mybatis实现多表查询

15.1、Mybatis 实现多表查询方式

业务装配.对两个表编写单表查询语句,在业务(Service)把查询的两个结果进行关联
使用 Auto Mapping 特性,在实现两表联合查询时通过别名完成映射
使用 MyBatis 的<resultMap>标签进行实现
多表查询时,类中包含另一个类的对象的分类单个对象、集合对象

15.2、N+1 方式和联合查询方式对比

N+1:需求不确定时
联合查询:需求中确定查询时两个表一定都查询
N+1 名称由来举例:学生中有 3 条数据需求:查询所有学生信息级授课老师信息、需要执行的 SQL 命令查询全部学生信息:select * from 学生执行 3 遍 select * from 老师 where id=学生的外键使用多条 SQl 命令查询两表数据时,如果希望把需要的数据都查询出来,需要执行 N+1 条 SQl 才能把所有数据库查询出来缺点:效率低优点:如果有的时候不需要查询学生是同时查询老师.只需要执行一个select * from student适用场景: 有的时候需要查询学生同时查询老师,有的时候只需要查询学生解决 N+1 查询带来的效率低的问题:默认带的前提,每次都是两个都查询、使用两表联合查询
resultMap 标签<resultMap>标签写在 mapper.xml 中,由程序员控制 SQL 查询结果与实体类的映射关系默认 MyBatis 使用 Auto Mapping 特性使用resultMap标签时,select标签不写resultType属性,而是使用resultMap属性引用resultMap标签

15.3、使用 resultMap 实现单表映射关系

mapper.xml 代码、实体类属性名和数据库类名不一致
<resultMap type="teacher" id="mymap"><id column="id" property="id1" />   <!--主键使用id标签配置映射关系--><result column="name" property="name1"/> <!-- 其他列使用result标签配置映射关系 -->
</resultMap>
<select id="selAll" resultMap="mymap"> select * from teacher
</select>

15.4、使用 resultMap 实现关联单个对象(N+1 方式)

N+1 查询方式,先查询出某个表的全部信息,根据这个表的信息查询另一个表的信息
与业务装配的区别:在 service 里面写的代码,由 mybatis 完成装配
实现步骤:在 Student 实现类中包含了一个 Teacher 对象在 TeacherMapper.xml中提供一个查询
<select id="selById" resultType="teacher" parameterType="int">select * from teacher where id=#{0}
</select>
在 StudentMapper.xml中<association> 装配一个对象时使用property: 对象在类中的属性名select:通过哪个查询查询出这个对象的信息column: 把当前表的哪个列的值做为参数传递给另一个查询大前提使用 N+1 方式.时如果列名和属性名相同可以不配置,使用 Auto mapping 特性.但是 mybatis 默认只会给列专配一次
<resultMap type="student" id="stuMap"><result property="tid" column="tid"/><association property="teacher" select="cn.lqq.mapper.TeacherMapper.selById" column="tid"></association>
</resultMap>
<select id="selAll" resultMap="stuMap"> select * from student
</select>

15.5、使用 resultMap 实现关联单个对象(联合查询方式)

只需要编写一个 SQL,在 StudentMapper.xml中添加下面效果<association/>:只要装配一个对象就用这个标签此时把<association/>小的<resultMap>看待
javaType属性:<association/>专配完后返回一个什么类型的对象.取值是一个类(或类的别名)
<resultMap type="Student" id="stuMap"><id column="sid" property="id"/><result column="sname" property="name"/><result column="age" property="age"/><result column="tid" property="tid"/><association property="teacher" javaType="Teacher" ><id column="tid" property="id"/><result column="tname" property="name"/></association>
</resultMap>
<select id="selAll" resultMap="stuMap"> select s.id sid,s.name sname,age age,t.id tid,t.name tname FROM student s left outer join teacher t on s.tid=t.id
</select>

15.6、使用resultMap查询关联集合对象(N+1)

在 Teacher 中添加 List<Student>
在 StudentMapper.xml 中添加通过 tid 查询
<select id="selByTid" parameterType="int" resultType="student"> select * from student where tid=#{0}
</select>
在 TeacherMapper.xml 中添加查询全部<collection/> 当属性是集合类型时使用的标签
<resultMap type="teacher" id="mymap"><id column="id" property="id"/><result column="name" property="name"/><collection property="list" select="cn.lqq.mapper.StudentMapper.selByTid" column="id"></collection>
</resultMap>
<select id="selAll" resultMap="mymap"> select * from teacher
</select>

15.7、使用resultMap实现加载集合数据(联合查询方式)

mybatis可以通过主键判断对象是否被加载过,不需要担心创建重复Teacher
在 teacherMapper.xml中
<resultMap type="teacher" id="mymap1"><id column="tid" property="id"/><result column="tname" property="name"/><collection property="list" ofType="student" ><id column="sid" property="id"/><result column="sname" property="name"/><result column="age" property="age"/><result column="tid" property="tid"/></collection>
</resultMap>
<select id="selAll1" resultMap="mymap1">  select t.id tid,t.name tname,s.id sid,s.name sname,age,tid from teacher t LEFT JOIN student s on t.id=s.tid;
</select>

15.8、使用 Auto Mapping 结合别名实现多表查询

要求:查询出的列别和属性名相同、只能使用多表联合查询方式
在 SQL 是关键字符,两侧添加反单引号
<select   id="selAll" resultType="student">      select t.id `teacher.id`,t.name `teacher.name`,s.id id,s.name name,age,tid from student s LEFT JOIN teacher t on t.id=s.tid
</select>

16、Mybatis注解

注解:为了简化配置文件
优点:Mybatis的注解简化 mapper.xml文件、如果涉及动态 SQL 依然使用 mapper.xmlmapper.xml 和注解可以共存、使用注解时 mybatis.xml 中<mappers>使用
使用步骤:在mybatis.xml的mappers标签中中配置,获取接口<package/>写到包名<mapper class=””/>写包名+类名在接口文件中:
 //实现查询@Select("select * from teacher")List<Teacher> selAll();//实现新增@Insert("insert into teacher values(default,#{name})") int insTeacher(Teacher teacher);//实现修改@Update("update teacher set name=#{name} where id=#{id}") int updTeacher(Teacher teacher);//实现删除@Delete("delete from teacher where id=#{0}")int delById(int id);
使用注解实现<resultMap>功能、以 N+1 举例在 StudentMapper 接口添加查询
 @Select("select * from student where tid=#{0}")List<Student> selByTid(int tid);
 在 TeacherMapper接口添加
 @Results() //相当于<resultMap>@Result() //相当于<id/>或<result/>@Result(id=true) //相当与<id/>@Many() //相当于<collection/>@One() //相当于<association/>@Results(value={@Result(id=true,property="id",column="id"),@Result(property="name",column="name"),@Result(property="list",column="id",many=@Many(sele
ct="cn.lqq.mapper.StudentMapper.selByTid"))})@Select("select * from teacher")List<Teacher> selTeacher();

17、Mybatis运行原理

运行过程中涉及到的类Resources  MyBatis中IO流的工具类、加载配置文件SqlSessionFactoryBuilder() 构建器,作用:创建 SqlSessionFactory 接口的实现类 XMLConfigBuilder MyBatis全局配置文件内容构建器类、作用负责读取流内容并转换为 JAVA 代码Configuration 封装了全局配置文件所有配置信息、全局配置文件内容存放在 Configuration 中DefaultSqlSessionFactory 是SqlSessionFactory接口的实现类Transaction 事务类  每一个 SqlSession 会带有一个 Transaction 对象.TransactionFactory 事务工厂、负责生产 TransactionExecutor    MyBatis执行器、作用:负责执行 SQL 命令、默认的执行器 SimpleExcutor相当于 JDBC 中 statement 对象(或 PreparedStatement或 CallableStatement)批量操作 BatchExcutor、通过 openSession(参数控制)DefaultSqlSession  是SqlSession 接口的实现类ExceptionFactory  MyBatis中异常工厂
流程图:

文字解释:在MyBatis 运行开始时需要先通过Resources加载全局配置文件。下面需要实例SqlSessionFactoryBuilder构建器,帮助SqlSessionFactory接口实现类DefaultSqlSessionFactory。在实例化 DefaultSqlSessionFactory之前需要先创建 XmlConfigBuilder解析全局配置文件流,并把解析结果存放在 Configuration中,之后把Configuratin传递给DefaultSqlSessionFactory.到此SqlSessionFactory 工厂创建成功。由 SqlSessionFactory 工厂创建 SqlSession。每次创建 SqlSession 时,都需要TransactionFactory 创建 Transaction对象, 同时还需要创建 SqlSession 的执行器 Excutor,最后实例化DefaultSqlSession,传递给 SqlSession 接口。根据项目需求使用 SqlSession 接口中的 API 完成具体的事务操作。如果事务执行失败,需要进行 rollback 回滚事务。如果事务执行成功提交给数据库。关闭 SqlSession 。到此就是 MyBatis 的运行原理

Java框架学习笔记--Mybatis学习相关推荐

  1. 拉勾教育Java训练营学习感受/学习笔记--MyBatis

    拉勾教育Java训练营学习感受/学习笔记–MyBatis 文章目录 拉勾教育Java训练营学习感受/学习笔记--MyBatis 1.普通jdbc操作流程以及问题 1.1 流程 1.2 问题 2.自定义 ...

  2. SilverLight学习笔记--进一步学习Isolated Storage独立存储一(理论篇)

    在"silverlight如何在客户端读取文件"以及"silverlight如何在客户端写入文件"两篇文章中我们初步接触了Isolated Storage概念. ...

  3. Python3学习笔记之-学习基础(第三篇)

    Python3学习笔记之-学习基础(第三篇) 文章目录 目录 Python3学习笔记之-学习基础(第三篇) 文章目录 一.循环 1.for循环 2.while循环 3.break,continue 二 ...

  4. 强化学习笔记-强化学习概述

    强化学习笔记-强化学习概述 机器学习分类 强化学习与监督学习的异同点 强化学习基本原理 强化学习解决的是什么样的问题 强化学习分类 请分别解释随机性策略和确定性策略 回报.值函数.行为值函数三个指标的 ...

  5. 【java学习之路】(java框架)004.Mybatis SQL映射文件详解

    02Mybatis SQL映射文件详解 ​ 在之前我们学习了mybatis的全局配置文件,下面我们开始学习mybatis的映射文件,在映射文件中,可以编写以下的顶级元素标签: cache – 该命名空 ...

  6. java resource放入的文件没有生成在classes中_JAVA程序员学习笔记----mybatis深入剖析...

    Java中提到持久层框架,相信没有人不知道mybatis的存在,相对于JDBC她多了一份干练(jdbc工作量大),相对于Hibernate她又多了一份灵动(HQL虽然方便,但太呆板).今天我们就一起走 ...

  7. 大数据业务学习笔记_学习业务成为一名出色的数据科学家

    大数据业务学习笔记 意见 (Opinion) A lot of aspiring Data Scientists think what they need to become a Data Scien ...

  8. oracle goldengate学习笔记,【学习笔记】Oracle goldengate monitor使用笔记

    天萃荷净 Oracle研究中心学习笔记:分享一篇关于Oracle数据库goldengate monitor的使用笔记. 本站文章除注明转载外,均为本站原创: 转载自love wife & lo ...

  9. 【原创】强化学习笔记|从零开始学习PPO算法编程(pytorch版本)

    从零开始学习PPO算法编程(pytorch版本)_melody_cjw的博客-CSDN博客_ppo算法 pytorch 从零开始学习PPO算法编程(pytorch版本)(二)_melody_cjw的博 ...

最新文章

  1. Python处理时间日期模块
  2. HTTP over QUIC重命名为“HTTP / 3”协议
  3. SEM竞价员怎么分析竞争对手,需要分析哪些?
  4. 4.4 一个完整的Google Maps应用
  5. Leetcode——连续子数组的最大和(剑指offer 42)
  6. shiro ajax请求拦截器,shiro 拦截器实现session过期拦截ajax请求的处理
  7. Android实战技巧:用TextView实现Rich Text---在同一个TextView中设置不同的字体风格...
  8. 【scrapy】scrapy按分类爬取豆瓣电影基础信息
  9. mpu6050 motion_driver_6.12官方驱动下载
  10. asp.net通用Web2.0仿淘宝脚本验证组件
  11. 硬盘分区被格式化了如何恢复
  12. STM32CubeIDE XiP 和 BootROM介绍, XiP外部内存QSPI FLASH执行用户代码
  13. 第六十六章 Caché 函数大全 $TRANSLATE 函数
  14. Android 蓝牙 ble 随机地址深层次分析
  15. Java程序设计 多线程 基础知识题
  16. 练习:JSP相关试题
  17. 关于MPU6050学习的一些总结之三MPU6050程序解读
  18. 厦门明发家乐福免费班车行车线路和时间表
  19. 缩略图thumbnail
  20. 大学三年如何使用计算机论文,大学计算机导论论文3000字.docx

热门文章

  1. unity 游戏内实现3连击动画(状态机)
  2. Merkle Tree(默克尔树)原理解析
  3. unity3d技术摄像头跟随_unity 3d 中摄像头跟随人物移动总结
  4. 数据报表常用excel公式
  5. android导出微信朋友圈怎么发文字,微信朋友圈怎么发纯文字?看完这篇文章,你就知道该怎么操作了...
  6. sigma-delta_Delta调试-简化失败的测试用例
  7. 忘记了PPT文件打开密码怎么办?
  8. unittest跳过用例方式
  9. Rabbitmq 安全账号管理方案
  10. python 马赛克拼图_使用 python 做到马赛克拼图