mybatis ——xml方式与动态sql

mybatis的真正强大之处在于它的映射语句,所以映射器的xml方式就显得相对简单

为啥子Mapper接口没有实现类,却可以被调用那?

mybatis使用java动态代理可以直接调用接口来调用相应的方法,不需要提供接口的实现类。当调用一个接口的方法时,会调用接口的全限定名称和当前调用方法的名称组成一个方法id,这个id就是xml映射文件中的namespace和具体方法的id,这样接口和xml就关联了。当调用mapper接口,通过代理转化成对xml里对应方法的调用。

mybatis使用预编译参数的一种方式。

select用法注意

resultMap标签用于配置java对象属性和查询结果列的对应关系,通过property和column来进行映射。

接口中定义方法的返回值必须和xml中resultType的类型一致。

数据库中,下划线命名很常见。java中,一般使用驼峰命名。可以通过设置全局属性mapUnderscoreToCamelCase为true可以自动将下划线方式的数据库列映射到驼峰命名的属性中。

多表进行关联查询时,若返回的结果不止一个表的信息咋办?例如:用户表和角色表关联查询,返回的既要role,还要user的一些,返回类型为role

1.可以在role实体类增加用户表要返回列对应的属性

2.若返回角色表中的信息多了,那1的就显得麻烦了。我们可以在role定义user类的属性。修改xml中的方法

<select   id=""  resultType="role">
select
...
u.user_name as "user.userName",
u.user_email  as "user.userEmail"
from sys_user u
...
</select>

  通过user.属性名来设置别名,user是在role里增加的属性,属性名是user的,这样就可以将值赋给user的属性

3.还可以通过在role实体类里定义user,修改xml,使用resultMap来进行映射

insert注意:

如何获取主键自增的值?

1.使用jdbc方式(支持主键自增的数据库):通过在insert标签设置userGeneratedKeys="true"   keyProperty="id"  ,mybatis会根据jdbc的getGeneratedKeys的方法来取出数据库内部生成的主键,将主键赋给keyProperty配置的id属性。多个属性,使用逗号隔开,这时还需设置keyColumn属性按顺序指定列,和设置的属性一一对应。

2.使用selectKey返回主键的值(主键自增不自增都适合):

mysql:
<insert id="">
...
<!--因为主键值是在insert执行成功后获得,所以order为after-->
<selectKey keyColumn="" resultType=""  keyProperty="" order="AFTER">
select LAST_INSERT_ID()
</selectKey>
</insert>

  

oracle
<insert id="">
<!--从序列获取值作为主键插入数据库中,所以order为before-->
<selectKey keyColumn="" resultType=""  keyProperty=""  order="BEFORE">
select SEQ_ID.nextval  from dual
</selectKey>
...
</insert>

update注意:

批量更新:结合foreach实现,在下方动态sql那块  

delete注意:

批量删除(侯的博客:)https://blog.csdn.net/benxiaohai888/article/details/78564751

多个接口参数的用法:

基本参数,javaBean,Map类型,@param

注解方式:通过注解将sql语句直接写在接口上

优点:需求简单的系统,效率高。

缺点:sql变化时,需要重新编译代码,不方便维护。不推荐使用.

动态sql

if标签:通过判断参数值来决定是否使用某个查询条件

与where标签配合:where标签:该标签包含的元素内有返回值,就插入一个where。如果where后面的字符串是以and和or开头,就将他们剔除

与set标签配合使用:set标签:该标签内有返回值,就插入一个set,如果set后面的字符串是以逗号结尾,就剔除

trim标签:替换where和set的功能

<trim  prefix="where" prefixOverrides="AND | OR">
...
</trim>

or

<trim  prefix="set" suffixOverrides=",">
...
</trim>

  choose  when otherwise 标签:if ..else..    if..else

foreach:主要用在构建in条件中.

入参为数组类型的foreach迭代:
<select  id=""   resultType="">
select * from . where . in
<foreach collection="array" item="item"
   open="("  separator=","  close=")">
    #{item}
</foreach>
</select>

  collection取值决定于接口中方法的参数类型:入参为List类型:取值为list。为Map类型:取值为map的key

foreach实现批量插入:

<insert id="">
insert into sys_user(

user_name)
values<!--入参为list-->
<foreach collection="list"  item="it" separator=",">
(#{it.userName})
</foreach>
</insert>

  

foreach实现批量更新

<update id="">
update sys_user
set
<!--item为从迭代取出的值。index为索引的属性名当迭代对象为map,则该值是map的key,key写表的字段名-->
<foreach  collection="_parameter" item="it" index="key"  separator=",">
${key}=#{it},
</foreach>
</update>

  

原文地址:https://www.cnblogs.com/lslshuo/p/9121295.html

时间: 2024-11-05 22:54:39

mybatis ——xml方式与动态sql的相关文章

MyBatis学习总结(六)——动态SQL

MyBatis的动态SQL是基于OGNL表达式的,它可以帮助我们方便的在SQL语句中实现某些逻辑. MyBatis中用于实现动态SQL的元素主要有: if choose(when,otherwise) foreach where set trim 下面我们主要说 where set trim 这三个标签 1,where标签 <!-- 查询学生list,like姓名,=性别 --> <select id="getStudentListWhere" parameterTy

MyBatis学习总结_11_MyBatis动态Sql语句

MyBatis中对数据库的操作,有时要带一些条件,因此动态SQL语句非常有必要,下面就主要来讲讲几个常用的动态SQL语句的语法 MyBatis中用于实现动态SQL的元素主要有: if choose(when,otherwise) trim where set foreach 1.if 对属性进行判断,如果不为空则执行判断条件 [html] view plaincopy <select id="selectByCriteria" parameterType="com.mu

Mybatis映射原理,动态SQL,log4j

1.理清mybatis中的#和$之间的区别? #{ }:表示一个预处理参数,参数类型不定,是根据传入的参数类型来设定的. 类似于JDBC中的? 特例使用,模糊查询:(针对oracle): and username like concat(concat('%',#{username}),'%') 采取的$的方式传入参数,所有采取$的方式传入的参数都只是字符串(无论传入的是什么,都会当成字符串处理),潜在的危险就是SQL注入的问题. and username like '%${value}%' 注意

【MyBatis学习07】动态sql

1. 动态sql 动态sql是mybatis中的一个核心,什么是动态sql?动态sql即对sql语句进行灵活操作,通过表达式进行判断,对sql进行灵活拼接.组装.就拿上一篇博文中对用户的综合查询一例来说: select * from user where user.sex = #{user.sex} and user.username like '%${user.username}%' 假如这个user是null咋整?或者user.sex或者user.username为null呢?所以更严谨的做

Mybatis特性值缓存和动态SQL

缓存 MyBatis包含一个非常强大的查询缓存特性,它可以非常方便地配置和定制.MyBatis 3中的缓存实现的很多改进都已经实现了,使得它更加强大而且易于配置. 默认情况下是没有开启缓存的,除了局部的session缓存,可以增强变现而且处理循环依赖也是必须的.要开启二级缓存,你需要在你的SQL映射文件中添加一行: <cache/> 字面上看就是这样.这个简单语句的效果如下: ? 映射语句文件中的所有select语句将会被缓存. ? 映射语句文件中的所有insert,update和delete

MyBatis 源码分析——动态SQL语句

有几年开发经验的程序员应该都有暗骂过原生的SQL语句吧.因为他们不能一句就搞定一个业务,往往还要通过代码来拼接相关的SQL语句.相信大家会理解SQL里面的永真(1=1),永假(1=2)的意义吧.所以mybatis动态SQL功能在笔者看来是最引吸人的.为了更好的区别XML映射文件上的SQL语句.mybatis把SQL语句分为四类.那么这个笔者已经在前面的章节里面讲过了.但是我们在开发过程中常常用到的也就俩种:静态和动态. 关于静态和动态的定义,笔者是这样子理解的--静态SQL语句显示就是里面没有相

(转)Mybatis高级映射、动态SQL及获得自增主键

原文:http://www.cnblogs.com/edwinchen/p/4105278.html?utm_source=tuicool&utm_medium=referral 一.动态SQL 相信大家在用mybatis操作数据库时时都会碰到一个问题,假如现在我们有一个关于作者的list authorList,需要根据authorList里已有的作者信息在数据库中查询相应作者的博客信息.那么最容易想到的做法就是遍历authorList,获取相应的信息查询数据库. for(int i=0;I &l

Mybatis高级映射、动态SQL及获得自增主键

一.动态SQL 相信大家在用mybatis操作数据库时时都会碰到一个问题,假如现在我们有一个关于作者的list authorList,需要根据authorList里已有的作者信息在数据库中查询相应作者的博客信息.那么最容易想到的做法就是遍历authorList,获取相应的信息查询数据库. for(int i=0;I < authorList.size();i++) { …… //查询数据库代码 //select * from blog where author=#{author,jdbcType

mybatis入门基础(五)----动态SQL

一:动态SQL 1.1.定义 mybatis核心对sql语句进行灵活操作,通过表达式进行判断,对sql进行灵活拼接.组装. 1.2.案例需求 用户信息综合查询列表这个statement的定义使用动态sql,对查询条件进行判断,如果输入参数不为空才进行查询拼接. 1.3.UserMapper.xml 1 <!-- 用户信息综合查询 2 #{userCustom.sex}:取出pojo包装对象中性别值 3 ${userCustom.username}:取出pojo对象中用户名称 4 --> 5 &