Mybaits学习

		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进行分页
        插件进行分页

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值