编写dao层xml文件

这篇具有很好参考价值的文章主要介绍了编写dao层xml文件。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

导入mybatis-plus-boot-starter依赖,就需要配置数据库的相关信息,一般会在公共模块下引入,其他模块引入公共模块,但是nacos服务引入在公共模块,有的不需要连接数据库,因此我们需要在不需要连接数据库的地方排除掉这个mybatis的依赖

<dependency>
			<groupId>com.wll.shop</groupId>
			<artifactId>wll-common</artifactId>
			<version>1.0-SNAPSHOT</version>
			<exclusions>
				<exclusion>
					<groupId>com.baomidou</groupId>
					<artifactId>mybatis-plus-boot-starter</artifactId>
				</exclusion>
			</exclusions>

parameterType ,resultMap,resultType

“parameterType”指的是传递给方法或函数的参数的数据类型。它指定在调用该方法或函数时应提供的值的类型。他一般省略不写
"parameterType"的取值可以是任何有效的Java数据类型,例如String、Integer、Boolean等

“resultMap”和“resultType”与对象关系映射(ORM)框架(如MyBatis或Hibernate)有关,这些框架帮助将数据库记录映射到面向对象的代码中。

“resultMap”用于定义数据库查询结果如何映射到对象。它指定了结果集中的列与对象的属性之间的映射关系。

<resultMap id="BaseResultMap" type="com.bjpowernode.crm.workbench.domain.Activity" >
    <id column="id" property="id" jdbcType="CHAR" />
    <result column="owner" property="owner" jdbcType="CHAR" />
    <result column="name" property="name" jdbcType="VARCHAR" />
    <result column="start_date" property="startDate" jdbcType="CHAR" />
    <result column="end_date" property="endDate" jdbcType="CHAR" />
    <result column="cost" property="cost" jdbcType="VARCHAR" />
    <result column="description" property="description" jdbcType="VARCHAR" />
    <result column="create_time" property="createTime" jdbcType="CHAR" />
    <result column="create_by" property="createBy" jdbcType="VARCHAR" />
    <result column="edit_time" property="editTime" jdbcType="CHAR" />
    <result column="edit_by" property="editBy" jdbcType="VARCHAR" />
    <collection id="attrs" ofType="com.wll.shop.skuEsModule">
	    <result column="attr_id" property="atrrId"></result>
	    <result column="attr_name" property="attrName"></result>
	    <result column="attr_value" property="attrValue"></result>
    </collection>
  </resultMap>

另一方面,“resultType”指定应使用的Java数据类型来保存数据库查询结果。它通常用于结果是单个值或简单数据类型(例如Integer、String)的情况。

当数据库中没有匹配结果,查询的数据为空的时候,返回的类型是什么?

答:

第一种:resultType为基本类型,如string

如果select的结果为空,则dao接口返回结果为null

第二种,resultType为基本类型,如int

后台报异常: org.apache.ibatis.binding.BindingException: Mapper method
'com.fkit.dao.xxDao.getUserById attempted to return null from a method
with a primitive return type (int).
解释:查询结果为null,试图返回null但是方法定义的返回值是int,null转为int时报错
解决办法:修改select的返回值为String

第三种 resultType为类为map ,如map、hashmap

dao层接口返回值为null

第四种 resultType 为list ,如list

dao层接口返回值为[],即空集合。

注意:此时判断查询是否为空就不能用null做判断

第五种 resultType 为类 ,如com.fkit.pojo.User

dao层接口返回值null

“resultMap”和“resultType”都用于处理关系数据库和面向对象代码之间的映射,但与“resultType”相比,“resultMap”提供了更大的灵活性和对映射过程的控制。

动态sql标签

if

他常用于判断传进来的参数的值是否为空,如果不为空加入sql语句中
mapper接口:

List<UserInfo> queryByUserInfo(UserInfo userInfo);

映射文件中对应的动态sql:

<select id="queryByUserInfo" parameterType="UserInfo" resultMap="BaseResultMap">
    select
    <include refid="Base_Column_List"/>
    from user_info where 1=1
    <if test="name != null and name != ''">
        and name=#{name}
    </if>
    <if test="gender != null and gender != ''">
        and gender=#{gender}
    </if>
</select>

2、where标签

where标签的作用:让where子句更加动态智能。
● 所有条件都为空时,where标签保证不会生成where子句。
● 自动去除某些条件前面多余的and或or。
把上面的代码where1=1修改为下面的代码,当存在用户名时根据用户名查询,存在性别根据性别查询,两个都存在是根据两个条件插叙,两个都不存在时查询全部。

<select id="queryByUserInfo" parameterType="UserInfo" resultMap="BaseResultMap">
    select
    <include refid="Base_Column_List"/>
    from user_info
    <where>
        <if test="name != null and name != ''">
            and name=#{name}
        </if>
        <if test="gender != null and gender != ''">
            and gender=#{gender}
        </if>
    </where>
</select>

trim标签

trim标签的属性:
● prefix:在trim标签中的语句前添加内容
● suffix:在trim标签中的语句后添加内容
● prefixOverrides:前缀覆盖掉(去掉)
● suffixOverrides:后缀覆盖掉(去掉)

List<Car> selectByMultiConditionWithTrim(@Param("brand") String brand, @Param("guidePrice") Double guidePrice, @Param("carType") String carType);
<select id="selectByMultiConditionWithTrim" resultType="car">
  select * from t_car
  <trim prefix="where" suffixOverrides="and|or">
    <if test="brand != null and brand != ''">
      brand like #{brand}"%" and
    </if>
    <if test="guidePrice != null and guidePrice != ''">
      guide_price >= #{guidePrice} and
    </if>
    <if test="carType != null and carType != ''">
      car_type = #{carType}
    </if>
  </trim>
</select>

foreach

他的属性:

collection:集合或数组,如传进来参数的名称
item:集合或数组中的元素
separator:分隔符 ,如’,’
open:foreach标签中所有内容的开始
close:foreach标签中所有内容的结束

循环数组或集合,动态生成sql,比如这样的SQL:
批量删除:

delete from t_car where id in(1,2,3);
delete from t_car where id = 1 or id = 2 or id = 3;

批量添加:

insert into t_car values
  (null,'1001','凯美瑞',35.0,'2010-10-11','燃油车'),
  (null,'1002','比亚迪唐',31.0,'2020-11-11','新能源'),
  (null,'1003','比亚迪宋',32.0,'2020-10-11','新能源')

用in来删除

int deleteBatchByForeach(@Param("ids") Long[] ids);
<delete id="deleteBatchByForeach">
  delete from t_car where id in
  <foreach collection="ids" item="id" separator="," open="(" close=")">
    #{id}
  </foreach>
</delete>

用or来删除

int deleteBatchByForeach2(@Param("ids") Long[] ids);
<delete id="deleteBatchByForeach2">
  delete from t_car where
  <foreach collection="ids" item="id" separator="or">
    id = #{id}
  </foreach>
</delete>

批量添加

int insertBatchByForeach(@Param("cars") List<Car> cars);
<insert id="insertBatchByForeach">
  insert into t_car values 
  <foreach collection="cars" item="car" separator=",">
    (null,#{car.carNum},#{car.brand},#{car.guidePrice},#{car.produceTime},#{car.carType})
  </foreach>
</insert>

sql标签与include标签

sql标签用来声明sql片段
include标签用来将声明的sql片段包含到某个sql语句当中
作用:代码复用。易维护。

<sql id="carCols">id,car_num carNum,brand,guide_price guidePrice,produce_time produceTime,car_type carType</sql>

<select id="selectAllRetMap" resultType="map">
  select <include refid="carCols"/> from t_car
</select>

<select id="selectAllRetListMap" resultType="map">
  select <include refid="carCols"/> carType from t_car
</select>

<select id="selectByIdRetMap" resultType="map">
  select <include refid="carCols"/> from t_car where id = #{id}
</select>

查询

1、List<Activity> selectActivityForDetailByIds(String[] ids);

传入一个String数组,通过这个数组来查询活动,返回一个Activity活动集合

  <select id="selectActivityForDetailById" parameterType="string" resultMap="BaseResultMap">
      select a.id,u1.name as owner,a.name,a.start_date,a.end_date,a.cost,a.description,a.create_time,u2.name as create_by,
          a.edit_time,u3.name as edit_by
      from tbl_activity a
      join tbl_user u1 on a.owner=u1.id
      join tbl_user u2 on a.create_by=u2.id
      left join tbl_user u3 on a.edit_by=u3.id
      where a.id=#{id}
    </select>

注意事项:

1、parameterType为string类型是因为数组中的每一个元素都是string类型的,resultMap对应写好的数据库字段和实体类属性的映射id
2、多表联查,join on 后面的on字段是主表属性在前
3、传进来的参数用#{}括起来,括号内的值和传进来的dao层方法的参数名相同。可以使用@Param()来定义

2、List<Activity> selectActivityForDetailByNameClueId(Map<String,Object> map);

 <select id="selectActivityForDetailByNameClueId" parameterType="map" resultMap="BaseResultMap">
    select a.id,a.name,a.start_date,a.end_date,u.name as owner
    from tbl_activity a
    join tbl_user u on a.owner=u.id
    where a.name like '%' #{activityName} '%' and a.id not in (
         select activity_id
         from tbl_clue_activity_relation
         where clue_id=#{clueId}
    )
  </select>

注意事项

1、parameterType是传进来的参数类型是map,因此是map 2、这里涉及到了模糊查询,模糊查询这里使用的是 like '%' #{参数} '%'

SQL中IF函数的使用

语法:IF(expr1,expr2,expr3)

expr1 的值为 TRUE,则返回值为 expr2
expr1 的值为FALSE,则返回值为 expr3

其中,expr1是判断条件,expr2和expr3是符合expr1的自定义的返回结果。

select
if(il.status_id = 'INV_STTS_AVAILABLE','全新','二手') as status_id
from inventory_location as il;

求有效期

在查询的时候的select后面使用
有效期是当前时间到终止时间(大于0则显示,否则<0是默认为0)

IF(TIMESTAMPDIFF(DAY,NOW(),t.end_date) >0 ,TIMESTAMPDIFF(DAY,NOW(),t.end_date),0) as effictiveDay

知识点讲解----------------------时间差函数:TIMESTAMPDIFF() -----------------------------------------

TIMESTAMPDIFF() 是 MySQL 中用来计算两个日期或时间之间的差值的函数。该函数返回两个日期/时间之间的差值,可以指定差值的单位(秒、分钟、小时、天等)。TIMESTAMPDIFF() 函数的语法如下:

TIMESTAMPDIFF(unit, start_date, end_date)

参数说明:

unit:表示差值的单位,可以是以下值之一:MICROSECOND(微秒)、SECOND(秒)、MINUTE(分)、HOUR(小时)、DAY(天)、WEEK(周)、MONTH(月)、QUARTER(季度)或 YEAR(年)。
start_date:表示时间段的起始时间。
end_date:表示时间段的结束时间。

插入

删除

新增

1、int insertActivityByList(List activityList);

 <insert id="insertActivityByList" parameterType="com.bjpowernode.crm.workbench.domain.Activity">
    insert into tbl_activity(id, owner, name, start_date, end_date, cost, description, create_time, create_by)
    values
    <foreach collection="list" item="obj" separator=",">
      (#{obj.id},#{obj.owner},#{obj.name},#{obj.startDate},#{obj.endDate},#{obj.cost},#{obj.description},#{obj.createTime},#{obj.createBy})
    </foreach>
  </insert>

注意事项:

1、因为插入的元素每一个都是Activity类型的,因此parameterType是Activity类型的 因为这个是inset into
表名(列名1,列名2,…)
values(?,?,…)(?,?,…),批量插入,因此这里使用了foreach标签,遍历整个集合,在values后面给占位符赋值。

Sql中的关键字

GROUP_CONCAT

分析当前spu有多少个sku,所有sku涉及到的属性组合?
1个spu有多个sku,sku有多个属性组合,应该是一个属性id,一个属性的名称,对应有多少属性。
比如说品牌是attr,他的名字是品牌,他的值可以是小米,华为,苹果等。
实现一对多的展现结果,使用GROUP_CONCAT关键字。

select ssav.`attr_id` attr_id,
ssav.`attr_name` attr_name,
GROUP_CONCAT(DISTINCT ssav.`attr_value`) attr_values
from `pms_sku_info` info
left join `pms_sku_sale_attr_value` ssav on ssav.`sku_id` = info.`sku_id`
where info.`spu_id` = #{spu_id}
group by ssav.`attr_id`,ssav.`attr_name`

编写dao层xml文件

@Mapper
List<SkuItemSaleAttrVo> getSaleAttrsBySpuId(@Param("spuId") Long spuId);

Case When
现在公司出台了一个奇葩的规定

对当前工资为 1 万以上的员工,降薪 10%。
对当前工资低于 1 万的员工,加薪 20%。

需要使用case when文章来源地址https://www.toymoban.com/news/detail-498243.html

到了这里,关于编写dao层xml文件的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • MyBatis的XML映射文件

    目录 2.1 XML配置文件规范 在Mybatis中使用XML映射文件方式开发,需要符合一定的规范 - XML映射文件定义规范: 2.2 XML配置文件实现 第1步:创建XML映射文件 第2步:编写XML映射文件 2.3 MybatisX的使用 总结: Mybatis的开发有两种方式: 注解 XML配置文件 通过XML配置文件的形式来配置

    2024年02月13日
    浏览(36)
  • 文件导入以及在线编辑-xml案例

        在线编辑器 参考 http://t.csdn.cn/uSgnf   在components下创建一个文件 叫 editor 然后 在下面创建一个js文件 叫 data_format_utils data_format_utils.js 参考代码如下 用来格式化 vkBeautify - javascript plugin 然后在 editor目录下创建一个组件 我这里叫 index.vue 参考代码如下 然后在main.js全局引入

    2024年02月13日
    浏览(41)
  • 关于com.baomidou:mybatis-plus-boot-starter:jar:unknown was not found解决办法

    原型 修改以后解决了

    2024年02月11日
    浏览(37)
  • mybatis(mybatis-plus)映射文件(XML文件)中特殊字符转义

    XML 文件在解析时会将五种特殊字符进行转义,当不希望语法被转义时,就需要进行特别处理,参考HTML字符转义规范Myabtis 中五个特殊字符 原始符号 符号含义 大于 小于 and \\\" 英文双引号 ’ 英文单引号 原始符号 转义字符 gt lt amp \\\" quot ’ apos

    2024年02月10日
    浏览(45)
  • MyBatis的使用(XML映射文件)

    MyBatis基于注解开发简单便捷,但是弊端是失去SQL语句的灵活性,不能根据实际情况产生不同的SQL语句 MyBatis除了支持注解开发以外,还支持一种开发方式:XML映射文件,将SQL语句写到XML映射文件中,基于更多种的选择可以让SQL变得更加灵活 1.开发方式 1.和基于注解开发方式一

    2024年02月08日
    浏览(37)
  • MyBatis-XML映射文件

    规范 XML映射文件的名称与Mapper接口名称一致(EmpMapper对应EmpMpper.xml),并且将XML映射文件和Mapper接口放置在相同包下(同包同名) ​​​ 在maven项目结构中所有的配置文件都在resources目录之下,因此要在该目录下创建Mapper接口相同的文件目录,注意在创建目录时要使用 / 来

    2024年02月13日
    浏览(48)
  • Mybatis—XML配置文件、动态SQL

    学习完Mybatis的基本操作之后,继续学习Mybatis—XML配置文件、动态SQL。 Mybatis的开发有两种方式: 注解 XML 之前学习的基本操作都是基于注解开发。使用Mybatis的注解方式,主要是来完成一些简单的增删改查功能。如果需要实现复杂的SQL功能,建议使用XML来配置映射语句,也就

    2024年02月06日
    浏览(39)
  • IDEA创建Mybatis格式XML文件

    设置位置:File | Settings | Editor | File and Code Templates 选择Files,点击+号 Name中输入xml模板名(名称自行决定),后缀名extension输入xml(固定) 内容处输入Mybatis的xml文件模板内容,勾选Enable Live Template,点击应用 完成后,在需要xml文件处新建,选择设置好的xml名称,按需补充内容

    2024年02月12日
    浏览(49)
  • Mybatis|mapper配置文件xml位置

    在核心配置文件mybatis-config.xml中设置映射文件位置 application.yml文件中添加配置: mybatis案例中和springboot中都是一样的,只要目录名和包名相同 需要在pom.xml中添加如下内容 越努力,越幸运! codefishyyf与你一起努力!

    2024年02月06日
    浏览(69)
  • MyBatis运行找不到xml资源文件

    程序运行后,没有将 src/main/java 目录下的资源文件(xml、properties等等)导出到 target工作目录下,所以程序找不到 java目录: 运行后的target目录: 可以看到并没有 MonsterMapper.xml文件 Maven项目在 pom.xml 文件中配置 将Maven项目clean一下, 运行后 target目录就会生成xml文件 如果还是不行

    2023年04月23日
    浏览(26)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包