41-SSM-6

今天主要是servcie层

1.完成所有的dao层的动态sql

<select id="findPagePermissions" parameterType="map" resultType="Permission">
   select id,pname,pcode,pid,plevel,url,DATE_FORMAT(createtime,'%Y-%m-%d  %H:%i:%s') as createtime from t_t_permission
   <where>
      <trim suffixOverrides="and">
            <if test="map.name != null and map.name != ''">
               name LIKE concat(concat('%',#{map.name}),'%') and
            </if>
            <if test="map.plevel != null and map.plevel != ''">
               plevel = #{map.plevel} and
            </if>
         </trim>
   </where>
   order by id
   limit #{map.start},#{map.end}
</select>

as是起别名,差点忘了

这里还是一个动态查询sql,还是根据:1名字进行模糊查询,2是否有map.plevel这个等级,默认order by id-->默认按照id的升序进行查询

limit #{map.start},#{map.end}--> 这里的意思是给这个查询给2个限制:

                                                                                                            1.从哪行开始,2.共查询多少行

这个sql的意思应该就是,查询指定page的数据,暂时先不看

②最常用的,这里paramType基本类型可以不写,会自动识别

   <select id="findPermissionByPcode" parameterType="String" resultType="Permission">
   select id,pname,pcode,pid,plevel,url,createtime from t_t_permission
   where id = #{pCode}
   </select>

③不会写很多动态sql不要紧,基本的就那几个,会写就行了

<insert id="addPermission" parameterType="Permission">
    insert into t_t_permission
    <trim prefix="(" suffix=")" suffixOverrides=",">
        <if test="permission.pName != null and permission.pName != ''">
            pname,
        </if>
        <if test="permission.pCode != null and permission.pCode != ''">
            pCode,
        </if>
        <if test="permission.pid != null and permission.pid != ''">
            pid,
        </if>
        <if test="permission.plevel != null and permission.plevel != ''">
            plevel,
        </if>
        <if test="permission.url != null and permission.url != ''">
            url,
        </if>
        createtime,
    </trim>
    values
    <trim prefix="(" suffix=")" suffixOverrides=",">
        <if test="permission.pName != null and permission.pName != ''">
            #{permission.pName},
        </if>
        <if test="permission.pCode != null and permission.pCode != ''">
            #{permission.pCode},
        </if>
        <if test="permission.pid != null and permission.pid != ''">
            #{permission.pid},
        </if>
        <if test="permission.plevel != null and permission.plevel != ''">
            #{permission.plevel},
        </if>
        <if test="permission.url != null and permission.url != ''">
            #{permission.url},
        </if>
        DATE_FORMAT(now(),'%Y-%m-%d %H:%i:%s')
    </trim>
</insert>

翻译:

        insert  into  permission (pname,pCode,pid,plevel,url,createtime) values (#{permission.name},#{permission.pCode},#{permission.pid},#{permission.plevel},#{permission.url},#{permission.createtime})

这里注意一下,这里插数据的时间,是写的        DATE_FORMAT(now(),'%Y-%m-%d %H:%i:%s')  -->意思是当前时间

<update id="editPermission" parameterType="Permission">
   update  t_t_permission set
   <trim suffixOverrides=",">
      <if test="permission.pName != null and permission.pName != ''">
         pname = #{permission.pName},
      </if>
      <if test="permission.pCode != null and permission.pCode != ''">
         pCode = #{permission.pCode},
      </if>
      <if test="permission.pid != null and permission.pid != ''">
         pid = #{permission.pid},
      </if>
      <if test="permission.plevel != null and permission.plevel != ''">
         plevel = #{permission.plevel},
      </if>
      <if test="permission.url != null and permission.url != ''">
         url = #{permission.url},
      </if>
         updatetime = DATE_FORMAT(now(),'%Y-%m-%d %H:%i:%s')
   </trim>
   <where> id =
      <if test="permission.id != null and permission.id != ''">
         #{permission.id}
      </if>
      <if test="permission.id == null and permission.id == ''">
         0
      </if>
   </where>
</update>

翻译:

        update permission set pname = #{permission.pName},pCode = #{permission.pCode},pid = #{permission.pid},plevel = #{permission.plevel}, url = #{permission.url},updatetime = DATE_FORMAT(now(),'%Y-%m-%d %H:%i:%s') where id=#{permission.id}(ID存在);如果ID不存在就是where id = 0

tips:namespace

<mapper namespace="com.ld7.backend.dao.RoleMapper">这里还是写dao的mapper名...不回顾又忘了

⑤几种基本的动态sql都看了,接下来就不再写demo了,占空间,下面有一个重点动态sql

<select id="findPageUsers" parameterType="map" resultType="User">
    select tu.username,tu.name,tu.age,tu.phone,tu.address,tr.rolename as ident,tu.email from t_t_user tu
    left join t_t_user_role tur on tu.id = tur.user_id
    left join t_t_role tr on tur.role_id = tr.id
    <where>
        <trim suffixOverrides="and">
            <if test="map.name != null and map.name != ''">
                tu.name LIKE concat(concat('%',#{map.name}),'%') and
            </if>
            <if test="map.ident != null and map.ident != ''">
                ident LIKE concat(concat('%',#{map.ident}),'%') and
            </if>
        </trim>
    </where>
    order by tu.id
    limit #{map.start},#{map.end}
</select>

翻译-->

    select tu.username,tu.name,tu.age,tu.phone,tu.address,tr.rolename as ident,tu.email from user tu left join t_t_user_role tur on tu.id = tur.user_id left join t_t_role tr on tur.role_id = tr.id    

在这里,不写AS给user表起别名为tu,直接省略了AS,先查询user表,然后连表查询user_role表,再联表查询role表

联表查询里面的条件是用关键字:ON,在ON后面写联表条件,后面的<WHERE>标签里面的条件是给user表的,也就是原始表,order by毫无疑问也是原表

⑥where in

这里的意思是in后面的所有的集合都要操作

⑦SELECT DISTINCT的意思是查的结果是不同的值

⑧r.`rolecode`,暂时还不清楚,这里的对象的链式调用永 ' ' 和不用有啥区别,有疑问,很正常,没必要即时解决,遇到问题再解决不是态度不端正,而是为了更高的效率,那些写好几层嵌套select的...实在有点搞不懂

⑨mybatis存储过程call

CREATE DEFINER=`root`@`localhost` PROCEDURE `addUser`(in v_name varchar(30),v_email varchar(50),v_password varchar(20),v_ident varchar(20),v_ident_num varchar(20))
BEGIN
        insert into t_t_user(username,email,password,ident,identnum)values(v_name,v_email,v_password,v_ident,v_ident_num);
        insert into t_t_user_role(user_id,role_id)
        select a.id,b.id from t_t_user a,t_t_role b where a.email = v_email and b.rolename=v_ident;
    END

也就是说,在数据库的表里面,写好存储过程,这样就可以直接调用了,我们在这里把函数copy进去

11)useGeneratedKeys="true"    keyProperty="user.id"

useGeneratedKeys="true"-->在成功插入数据以后会返回主键ID,然后后面的keyProperty="user.id"这个对象的属性负责接收

12)这里有一个sql函数max(id),表示id的最大值

13)传入值类型 parameterType是可以不写的,但是返回值resultType是肯定要写的

14)重点

<delete id="deleteUser" parameterType="java.lang.String">
    delete from user where username
    <if test="ids != null and ids != ''">
        in  <foreach item="ids" collection="ids" open="(" separator="," close=")">
        #{ids}
    </foreach>
    </if>
    <if test="ids == null or ids == ''">
        = 'unexists'
    </if>
</delete>

在这里,我们看

<foreach item="ids" collection="ids" open="(" separator="," close=")">

#{ids}

</foreach>

就是说这里in后面就是  ( ids[0] , ids[1] , ids[2] , ids[3] ) ,ids里面的全部删除

tips:

    foreach元素的属性主要有 item,index,collection,open,separator,close。

    item表示集合中每一个元素进行迭代时的别名,

    index指 定一个名字,用于表示在迭代过程中,每次迭代到的位置,

    open表示该语句以什么开始,

    separator表示在每次进行迭代之间以什么符号作为分隔 符,

    close表示以什么结束。

在这里collection有异议:

在这个demo里面collection属性值直接写的就是形参名,但是别人写的blog是:    

1. 如果传入的是单参数且参数类型是一个List的时候,collection属性值为list
2. 如果传入的是单参数且参数类型是一个array数组的时候,collection的属性值为array
3. 如果传入的参数是多个的时候,我们就需要把它们封装成一个Map了,当然单参数也可

也是留着之后再看吧...

15)InnoDB引擎

count(*)对行的数目进行计算,包含NULL

count(column)对特定的列的值具有的行数进行计算,不包含NULL值。

count()还有一种使用方式,count(1)这个用法和count(*)的结果是一样的。

16)@Resource和@Autowired一样,只不过一个是byName,一个是byClass,暂时不纠结这个

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值