开发环境:springmvc+spring+mybatis
开发工具:idea
数据库:mysql
以下为mybaties在实际项目中运用总结,供参考
mysql数据库:插入数据id自动增长写法
<insert id="addSign" useGeneratedKeys="true" keyProperty="id" parameterType="com.suwei.sysMng.bean.YkatUserSign">
insert into ykat_user_sign(user_id,user_name,user_type,create_time,serial_days,update_time,is_del)
values(#{userId},#{userName},#{userType},#{createTime},#{serialDays},#{updateTime},1)
</insert>
使用like模糊查询,if条件判断:
根据关键字搜索最好不要用$会发生sql注入问题,可以用CONCAT语法
mybatis排序只能用$而不用用#,用#不能进行排序
<select id="expertQuery" parameterType="java.util.Map" resultType="java.util.Map">
select e.id,e.expert_name AS expertName,e.phone,e.longitude,e.latitude,
e.expert_address AS expertAddress,
vm.id AS expertGoodAtId,
GROUP_CONCAT(vm.models_name) AS expertGoodAt
from ykat_expert AS e
left join ykat_expert_models AS em on e.id = em.expert_id
left join ykat_vehicle_models AS vm on em.vehicle_models_id = vm.id
where 1=1 and e.is_del=1
<if test="expertName!=null and expertName!='' ">
and e.expert_name like CONCAT('%',#{expertName},'%')
</if>
<if test="expertGoodAt!=null and expertGoodAt!='' ">
and vm.id=#{expertGoodAt}
</if>
group by e.id
order by e.id desc
limit #{page} , #{pageSize}
</select>
传递多个参数:使用map形式
xml文件
<update id="storeStaffUpdate" parameterType="java.util.Map">
update ykat_store_satff
set integral=#{integral}
where user_id=#{userId}
</update>
dao层
int storeStaffUpdate(Map<String, Object> params);
service层
Map<String, Object> driverMap=new HashMap<String, Object>();
driverMap.put("integral", integral);
driverMap.put("userId", userId);
driverDao.updateDriverByUserId(driverMap);
总结:#{xxx}里面的值必须与map的key值一致,否则xml里面的变量值为空
传递多个参数:使用多个参数形式
xml文件:
<select id="getAddrInfo" resultMap="AddrInfo">
select * from addr_info where addr_id=#{addrId} and corp_id=#{corpId}
</select>
dao层:
AddrInfo getAddrInfo(@Param("corpId")int corpId,@Param("addrId") int addrId);
总结:当传递多个参数时一定能要用@Param("xxx")注解,否则区别不了属性名
传递参数类型为List,Array,Map等写法,foreach使用
foreach介绍:
foreach的主要用在构建in条件中,它可以在SQL语句中进行迭代一个集合。foreach元素的属性主要有item,index,collection,open,separator,close。item表示集合中每一个元素进行迭代时的别名,index指定一个名字,用于表示在迭代过程中,每次迭代到的位置,open表示该语句以什么开始,separator表示在每次进行迭代之间以什么符号作为分隔符,close表示以什么结束,在使用foreach的时候最关键的也是最容易出错的就是collection属性,该属性是必须指定的,在不同情况下,该属性的值是不一样的,主要有一下3种情况:
1.如果传入的是单参数且参数类型是一个List的时候,collection属性值为list
2.如果传入的是单参数且参数类型是一个Array数组的时候,collection的属性值为array
3.如果传入的参数是单参数切参数类型是一个Map的时候,map的key就是参数名,所以这个时候collection属性值就是传入的List或array对象在自己封装的map里面的key值名称
案例:
xml文件:
1.传递参数类型为List,foreache中的collection属性类型必须是List,item的值自定义,但是必须与#{xxx}里面的值一致,index的值任意
<select id="getEmployeesListParams" resultType="Employees">
select *
from EMPLOYEES e
where e.EMPLOYEE_ID in
<foreach collection="list" item="employeeId" index="index"
open="(" close=")" separator=",">
#{employeeId}
</foreach>
</select>
对应的mapper接口:
List<Employees> getEmployeesListParams(List<String> employeeIds);
2.传递参数类型为Array,foreach中的collection属性类型必须是Array,item的值自定义,但是必须与#{xxx}里面的值一致,index的值任意
<select id="getEmployeesArrayParams" resultType="Employees">
select *
from EMPLOYEES e
where e.EMPLOYEE_ID in
<foreach collection="array" item="employeeId" index="index"
open="(" close=")" separator=",">
#{employeeId}
</foreach>
</select>
对应的mapper接口:
List<Employees> getEmployeesArrayParams(String[] employeeIds);
3.传递的参数类型为Map,foreach中的collection属性值必须是map的key值,其他属性值必须都是map的key值
<select id="getEmployeesMapParams" resultType="Employees">
select *
from EMPLOYEES e
<where>
<if test="employeeIdsArray!=null and employeeIdsArray.length!=0">
e.EMPLOYEE_ID in
<foreach collection="employeeIdsArray" item="employeeId"
index="index" open="(" close=")" separator=",">
#{employeeId}
</foreach>
</if>
</where>
</select>
对应的mapper接口:
List<Employees> getEmployeesMapParams(Map<String,Object> params);
map存储数据格式:
Map<String, Object> params = new HashMap<>();
String[] array=new String[]{"1001","1002","1003","1004","1005"}
params.put("employeeIdsArray",array);
总结:
1.如果Map中value为数组或者链表,那么在foreach标签中的collection值必须与它的key值一样,否则会报错。当value为数组时,在if标签中判断时为taskIds.length != 0,当value为链表时,则在if标签中判断时为taskIds.size != 0。
2.对传递的参数一定要进行非空判断,在前台获得的参数进行非空判断,或者在xml文件中进行非空判断。例如在xml中对list判空
<if test="list!=null and list.size()>0">
<foreach collection="list" item="shopcartIds" open="("
separator="," close=")">
#{shopcartIds,jdbcType=BIGINT}
</foreach>
</if>
对数组判空:
<if test="employeeIds!=null and employeeIds.length >0">
<foreach collection="array" item="employeeIds" index="index"
open="(" close=")" separator=",">
#{employeeIds}
</foreach>
</if>
mybatis对日期Date类型格式化
mysql数据库:Date日期类型,在xml文件中格式化写法:(常用)
<sql id="Base_Column_List2">
id,user_id,user_name,user_type,
date_format(create_time_time,'%Y-%m-%d %H:%i:%S') AS createTime,
date_format(update_time_time,'%Y-%m-%d %H:%i:%S') AS updateTime
</sql>
oracle数据库:Date日期类型,在xml文件中格式化写法(常用)
<sql id="Base_Column_List" >
JQID, JJDID, GLJJDBH,
to_char(BJSJ,'yyyy-MM-dd HH24:mi:ss') bjsj_str,
to_char(YJSJ,'yyyy-MM-dd HH24:mi:ss') yjsj_str
</sql>
备注:转换成字符串则要在实体类中定义string类型的日期