前言:在mybatis的使用中,我们会习惯采用XXMapper.java+XXMapper.xml(两个文件的名字必须保持一致)的模式来开发dao层,那么问题来了,在XXMapper的文件里只有接口,里面只有方法体,在XXMapper.xml的文件里,里面只有sql,而在java中,方法调用必须通过对象,除非是静态方法,但是一般的接口里面的方法都不是静态的,那么mybatis的对象在哪里?是如何产生的,本篇博客我们就通过源码来解释一下这个问题。
本篇博客目录
一: Mapper的使用模式
二: MapperProxy代理原理
三:总结
一:Mapper模式
1.1:常见开发模式
在平时的开发中,我们一般都会遵从以下的开发模式:mapper接口+xml的方式,我举个例子,常见会这样:
[Java] 纯文本查看 复制代码
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
|
public interface SeckillDao
{
/**
* 减库存
* @param seckillId
* @param killTime
* @return 如果影响行数>1,表示更新库存的记录行数
*/
int reduceNumber( @Param ( "seckillId" ) long seckillId, @Param ( "killTime" ) Date killTime);
/**
* 根据id查询秒杀的商品信息
* @param seckillId
* @return
*/
Seckill queryById( long seckillId);
/**
* 根据偏移量查询秒杀商品列表
* @param offset
* @param limit
* @return
*/
List<Seckill> queryAll( @Param ( "offset" ) int offset, @Param ( "limit" ) int limit);
}
|
可以看到其中的方法都是非静态的,这是一个接口类,而我们还会有一个文件叫SecKillDao.xml,这个文件的主要作用是用来映射这个接口,这其中有两个注意点就是
1:xml中的nameSpace必须是接口的全类路径名
2: 每个标签的id必须和接口中的id保持一致
3:两个文件的名字必须保持一致
我们来看一下具体的SecKillmapper.xml文件的配置:
[Java] 纯文本查看 复制代码
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
|
<mapper namespace= "cn.codingxiaxw.dao.SeckillDao" >
<update id= "reduceNumber" >
UPDATE seckill SET number = number- 1 WHERE seckill_id=#{seckillId}
AND start_time <![CDATA[ <= ]]> #{killTime} AND end_time >= #{killTime}
AND number > 0 ;
</update>
<select id= "queryById" resultType= "Seckill" parameterType= "long" >
|