今天主要是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,暂时不纠结这个