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