本篇讲述的内容有:
mybatis输入输出类型
bean属性和表字段不一致问题
mybatis参数传递问题
mybatis常用的标签
mybatis返回主键id
mybatis逆向工程
输入/输出类型(传入参数和返回值问题)
1、输入类型 parameterType
表示mapper接口中的方法入参类型为int(等同于java.lang.Integer),当方法入参包含多种类型时,可以使用Map映射(个人建议,也可以参照下面的参数传递问题解决方案),例如存在这样的SQL
select id,user_name,age,address,classes,status,is_vip,register_time from vip_user where name like '%'+?+'%' and is_vip=? and register_time>?
name是String类型,is_vip是int类型,register_time是String类型,此时就需要使用parameterType="java.util.Map"来映射
select id,user_name,age,address,classes,status,is_vip,register_time from vip_user where name like #{name} and is_vip = #{isVip} and register_time > #{registerTime}
其中的#{ }里面值的name、isVIP、registerTime可以自定义,但必须和Map中的key一致,如果是单个入参,则可通过 @Param("name")注解 来约定。
对应的逻辑中(比如说service中)设值/调用
……
Map map = new HashMap<>();
map.put("name",userVip.getName());
map.put("isVip",userVip.getIsVip);
map.put("registerTime",userVip.getRegisterTIme());
List userVipList = userVipMapper.getUserVipInfo(map);
java.lang.Integer就等用于int,mybatis会自动匹配,下同。
2、输出类型 resultType和resultMap
resultType可接受的值为String、int、bean、Map等,resultMap主要是用于高级映射,例如联合查询或者需要使用自定义的结果集时,bean的字段属性和表的列名称不一致时,例如上述sql中使用到的 resultMap="BaseResultMap"
bean字段和表字段不一致问题
解决方案:
1、查询时设置别名
select id,user_name as username,age,address,classes,status,is_vip as isvip,register_time as registertime from vip_user where ……
2、自定义结果集来映射字段和属性
参数传递问题
方式一:#{N},N表示第几个,从0开始
select id,user_name,age,address,classes,status,is_vip,register_time from vip_user where id = #{0} and is_vip = #{1}
方式二: 固定参数的方式
select id,user_name,age,address,classes,status,is_vip,register_time from vip_user where id = #{id} and is_vip = #{isVip}
如上两种方式,必须是当parameterType都是统一类型时才行。
方式三: map的形式传递,
形如上面 输入/输出类型里提到的,最常用,不赘述
mybatis常用标签
1、resultMap标签
用来映射自定义查询结果集,例如查询结果是VO之类的
2、sql标签
用来定义表中出现的所有字段,方便其它地方调用
id, order_id, phone, item_id, status, register_time, is_vip, create_time, update_time
3、include标签
引用公用代码,例如上面的SQL标签
select
from user_vip
where id = #{id,jdbcType=BIGINT}
4、select、insert、delete、update标签
相对应增删改查操作,不赘述
5、where标签
(经常使用,避免使用where 1=1),如果某一个条件符合,会动态拼接where ,如下示例,当定第一个条件order_id为空,phone不为空,则where标签会智能的去除and连接符
SELECT COUNT(*) FROM vip_user
order_id=#{orderId}
and phone=#{phone}
6、if标签
用来动态判断属性,和el表达式有点类似
select
from user_vip
order_id=#{orderId}
7、foreach标签
常用来批量操作时拼接条件,其中item表示循环体的别名,collection可以为list、Map、array
update points_mall_virtual_code_info set notice_status=1,status=1 where order_id in
#{item}
新增返回主键id
keyProperty表示pojo的属性,keyColumn表示表的主键名称,useGeneratedKeys="true"表示要使用自增主键
逆向工程插件-生成pojo和xml
这个比较简单,直接移步至我的博客资源 click here 下载这个资源后直接用idea或eclipse打开并修改数据库连接信息、表名、targetPackage目录即可,运行MyBatisGeneratorMain类的main方法即可生成pojo和xml,拷贝至你的项目即可,解耦于项目,非常方便。