Mybatis入参处理
参数处理详解:
单参数Mybatis不做特殊处理,直接取出参数赋值给xml文件如:#{id}
多参数:1->JavaBean传递参数 2->Map接口 3-> 注解@param
默认情况下,当向Mybatis传递多个参数的时候,例如:
在mapper的映射配置文件中,需要传递两个参数的时候:
<select id = "getPeronByNameAndGneder" resultType = "Person">
SELECT * FROM person WHERE name = #{param1}, gender = #{param2}
</select>
//需要把参数写成arg0 arg1... 或者是 param1 , param2 ... 的形式(系统默认情况下)
多参数处理-封装POJO类
如果多个参数是我们业务逻辑的数据模型,我们就可以直接传入POJO
Xml文件中:#{属性名} 取出传入的pojo的属性值
在传递参数的时候将需要传递的参数封装到实体当中,然后进行值的传递
多参数处理-Map
如果参数个数比较少,而且没有对应的Javabean,可以封装成Map
例如:Map<String,Object> map = new HashMap();
map.put(“key_name1”,“value1”);
map.put(“key_name2”,“value2”);
xml文件中:#{key} 取出map中对应的值
(注意在对xml文件进行解析的时候,参数需要使用与map集合中相同的key值)
多参数处理-@param
由于以上两种方式需要动手创建Map以及对象,不简洁,可以使用@param注解
它可以明确指定封装参数时map的key
例如:
public Person getPersonByNameAndGneder(@Param(“name”), String name, @Param(“gender”)
String gender);
//在进行xml解析时
#{name} #{gender} 就可以正常的获取到参数的值
假如第一个参数使用了注解,而第二个参数没有使用注解的话,那么在xml部分没有
使用注解的参数可以接着它使用系统默认提供的参数
例如:(假设参数name使用的@Param("name")的注解方式,而gender没有使用注解)
name = #{name} gender = #{param2} //使用系统自动生成的参数也能正常查询出来
Collection、List 、Array作为参数,封装为Map,但是有一定的规则
集合类型参数处理:
1 当参数为Collection接口,(默认)转换为Map, Map的 key 为 collection
2 如果参数类型为List接口,除了Collection的值外,list作为key
3 当参数为数组的时候,也会转换为Map,Map的key为array
(如果不想使用关键字的时候,可以使用@Param来给集合取别名)
参数处理总结:
使用map传递参数,业务可读性差
@Param,受到参数个数(n)的影响,建议n<5时,为最佳的传参方式
以上参数的处理各有利弊,参数>5,建议用Javabean的方法
Mybatis动态SQL之foreach
foreach元素:
特点:循环遍历集合,支持数组和List、Set接口,对其提供遍历功能
应用:数据库种的数据字典的内容,经常使用foreach元素确定查找
常用属性:结合代码讲解
常用属性:collection : 是当前遍历集合或数组的名称
如果是数组,默认名称就是array
item : 当前从集合或数组种取出元素的项
index : 索引下标(如果是Map类型的,那么值就是key)
open和close : 整个循环的内容开头和结尾的字符串
sparator : 分隔符,每个元素之间使用什么作为间隔
例如:
//查询结果的返回值类型
SELECT * FROM person WHERE id IN
#{id}
Mybatis批量新增数据
重要知识点:
传统JDBC进行批量数据插入的回顾
Mybatis借助MySQL数据库对批量插入的支持
Mybatis基于SqlSession的ExecutorType进行批量添加
JDBC批量插入方法:
Java代码中使用For循环直接插入SQL数据
借助于Statement 、Prestatement对象的批处理方法addBatch
MyBatis对于批量插入的支持
方式:
1) 借助foreach标签使用insert into table values()
第一种形式是基于如下的sql插入语句实现的:
INSERT tal_name(field1,field2…) VALUES(val1,val2…),(val1,val2…)
在xml的配置文件如下:
<insert>
INSERT tal_name(field1,field2...) VALUES
<forEach collection="参数集合名称" item="item_name" sparator=",">
(#{item_name.filed1},#{item_name.filed1},#{item_name.filed1}...)
</forEach>
</insert>
2)借助MySQL数据库连接属性allowMutiQueries = true
第二种方式是基于如下数据库的查询操作进行的
INSERT tal_name(field1,field2,field3...) VALUE(val1,val2,val3...);
此时在xml文件的配置的forEach位置发生了变化
<insert>
<forEach collection="参数集合名称" item="item_name" sparator=";">
INSERT tal_name(field1,field2...) VALUES
(#{item_name.filed1},#{item_name.filed1},#{item_name.filed1}...)
</forEach>
</insert>
//最后有一点需要特别注意:若使用第二种方式,必须在JDBC的配置文件中加上
jdbc.url=jdbc:mysql://localhost:3306/mybatis?allowMultiQueries=true(allowMuliQueries=true)
否则回报错,插入失败!
//第二种方式不常用,只做了解即可
第三种进行批处理的方式:
由于前面两者方式只是在xml文件种配置了forEach标签,通过简单的字符串的拼接
实现了批量插入的操作,但是到数据量特别大的时候,字符串会被拼接的特别长
当数据量巨大的时候,进行这样的操作无疑会给服务器造成巨大的压力,所以最终
我们在进行批处理的时候会进行如下处理:
SqlSession sqlSession = getSqlSessionFactory().openSession(ExecutorType.BATCH);
//默认情况下openSession()方法没有参数,但是当我们需要进行批处理的时候
//就给它添加(ExecutorType.BATCH)的方法
PersonMapper personMapper = sqlSession.getMapper(PersonMapper.class);
for (int i = 0; i < 10000; i++) {
personMapper.addPerson(new Person("tom", "tom@imooc.com", "f"));
}
sqlSession.commit(); //事务提交
sqlSession.close();
什么情况下使用前两种情况呢?在数据量插入不大的时候,通常几十条数据时候可以
使用,但是在不知道到底有多少数据要进行插入的时候就需要SqlSession的批处理方式了。
MyBatis高级知识点-拦截器
本章节的重要知识点:
Mybatis的四大对象、插件原理及接口
Mybatis的插件开发过程
使用PageHelper插件实现分页功能
*****Mybatis四大核心对象
Mybatis四大核心对象
ParameterHandler:处理SQL的参数对象
ResultSetHanddler:处理SQL的返回结果集
StatementHandler:数据库的处理对象,用于执行SQL语句
Executor:Mybatis的执行器,用于执行增删改查操作
Mybatis插件原理及接口
Mybatis的插件借助于责任链的模式进行对拦截的处理
使用动态代理对目标对象进行包装,达到拦截目的
作用域Mybatis的作用域对象之上
Mybatis插件接口-Interceptor
Intercept方法,插件的核心方法
使plugin方法,生成target的代理对象
setProperties方法,配置所需参数
多插件开发过程
创建代理对象时,按照插件配置的顺序进行包装
执行目标方法后,是按照代理的你想进行执行
使用拦截器PageHelper进行分页
插件进行分页