mybaties日常开发总结

开发环境: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类型的日期

MyBatis是一款开源的持久化框架,它提供了很多可以配置的属性。这些属性可以帮助我们优化和定制我们的应用程序。 首先,我们有一些与数据库连接相关的属性。可以设置数据库的驱动程序名称、URL、用户名和密码,以及其他连接属性,例如连接池的大小和超时。 其次,我们有一些与事务管理相关的属性。我们可以配置事务管理器的类型、隔离级别和超时值。这些属性可以帮助我们确保数据操作的一致性和可靠性。 此外,我们还可以配置缓存相关的属性。我们可以设置缓存的类型、范围和大小,以及缓存的刷新间隔和过期策略。这些属性可以帮助我们提高数据访问的效率和性能。 另外,我们还可以配置一些与映射文件相关的属性。我们可以设置映射文件的位置和命名规则,以及其他与映射配置相关的属性。这些属性可以帮助我们管理和维护我们的映射文件。 最后,还有其他一些与日志记录、调试和性能优化相关的属性。我们可以设置日志记录器的类型和级别,以及其他与日志记录相关的属性。我们还可以配置调试器的类型和其他与调试相关的属性。这些属性可以帮助我们更好地了解和跟踪我们的应用程序的执行过程。 总之,通过配置这些属性,我们可以根据应用程序的需求来优化和定制我们的MyBatis应用程序。同时,这些属性也提供了一些常用的设置和功能,可以帮助我们更好地管理和维护我们的应用程序。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值