Mybatis:使用、配置、增删改查、xml实现、分页、返回自定义json、md5加密、xml文件解析

1. 工程怎么可以使用mybatis?

1)导入依赖
2)配置配置文件。应该添加哪些属性?
spring: 
  datasource:
    url: jdbc:mysql://localhost:3306/lizhendb?serverTimezone=GMT%2B8
    username: root
    password: root

url后面的serveTimezone是用来干嘛的?

3)先创建DO和DAO类(加上@Mapper),然后创建xml完成resultMap配置,最后创建DAO里的api和对应的xml语句。

2. 不用xml怎么增删改查?

怎么插入?如果想让主键自增怎么办?想显示出id呢?

UserMapper接口

    @Insert("insert into user(user_name,pwd,nick_name,avatar,gmt_created" +
            ",gmt_modified)values(#{userName},#{pwd},#{nickName},#{avatar}" +
            ",now(),now())")
    @Options(useGeneratedKeys = true, keyColumn = "id", keyProperty = "id")
    //keyColumn是表中的字段,keyProperty是对象属性中的。
    int insert(UserDO userDO);

    //怎么修改?
    @Update("update user set nick_name=#{nickName},gmt_modified=now()" +
            "where id = #{id}")
    int update(UserDO userDO);

    @Delete("delete from user where id=#{id}")
    int delete(@Param("id") long id);

    @Select("select id,user_name as userName,pwd,nick_name as nickName" +
            ",avatar,gmt_created as gmtCreated,gmt_modified as gmtModified" +
            " from user where user_name= #{userName} limit 1")
    UserDO findByUserName(@Param("userName") String name);

3. Controller层、DAO层和DO包的作用是什么?需要添加的注解分别是什么?

DAO层会包含对数据库操作的接口和实现类

DO包里是和数据库一一对应的实体类

给DAO接口加上@Mapper注解

然后给里面的查询方法加上@Select(sql)

4. 怎么用xml实现增删改查?第一步是什么?第二三四步呢?

第一步,给配置文件加上相关属性?什么属性?怎么写?

mybatis.mapper-locations=classpath:com/youkeda/comment/dao/*.xml

第二步,在resource对应的目录下创建相应的xxDAO.xml文件。文件内容是什么?每个节点是用来干嘛的?此节点的属性有哪些?文件是用来干嘛的?

内容:头约束,mapper节点(有namespace属性),resultMap节点(有id,type)

resultMap的子节点是什么,有什么属性?

    <mapper namespace="com.youkeda.comment.dao.UserDAO">
        <resultMap id="userResultMap" type="com.youkeda.comment.dataobject.UserDO">
            <id column="id" property="id"/>
            <result column="user_name" property="userName"/>
            <result column="nick_name" property="nickName"/>
        </resultMap>
    </mapper>

该文件是用来写增删改查的

这些增删改查可以添加上if,set,where语句。也必须用insert,update,select,delete语句来实现增删改查。

5. 增删改查怎么写?

<insert id="batchAdd" parameterType="java.util.List" useGeneratedKeys="true" keyProperty="id">
    insert into user (user_name,pwd,nick_name,avatar,gmt_created,gmt_modified)
    values
    <foreach collection="list" item="it" index="index" separator=",">
        (#{it.userName},#{it.pwd},#{it.nickName},#{it.avatar},now(),now())
    </foreach>
</insert>

<delete id="delete">
delete from user where id = #{id}
</delete>

<update id="update" parameterType="com.youkeda.comment.dao.UserDAO">
    update user
    <set>
        <if test="nickName!= null">
            nick_name = #{nickName},gmt_modified = now()
        </if>
    </set>
    where id = #{id}
</update>

<select id="search" resultMap="userResultMap">
    select * from user
    <where>
        <if test="keyWord!=null">
            user_name like concat('%',#{keyWord},'%')
            or nick_name like concat('%',#{keyWord},'%')
        </if>
        <if test="startTime!=null">
            and gmt_created <![CDATA[>=]]> #{startTime}
        </if>
        <if test="endTime!=null">
            and gmt_created <![CDATA[<=]]> #{endTime}
        </if>
    </where>
</select>

<select id="findByIds" resultMap="userResultMap">
    select * from user
    <where>
        id in
        <foreach item="item" index="index" collection="ids" open="(" separator="," close=")">
            #{item}
        </foreach>
    </where>
</select>

执行后会变成 select * from user where id in (?,?,?)

6. dao层接口都有哪些注解?

注意dao层接口中,接口名上面用@Mapper(或者@Repository)。

增删改查方法应该用:@Insert @Select @Update @Delete,设置键自增用@Options

参数用@Param。注意只能接收String或Integer这些类型,如果是对象,就不需要用注解

相对的,如果是control层,对象的类型就要用注解了:@RequestBody

7. 分页怎么分?逻辑是什么?Page有哪些方法?作用分别是什么?怎么获取总页数?

使用pageHelper分页工具分页比较简单。只要在doSelectPage中用lambda执行myBaits查询方法就会自动执行分页逻辑。并且返回分页对象Page,如下:

Pagepage =

PageHelper.startPage(pageNum,pageSize).doSelectPage(()->commentDAO.findAll());

解释:startPage是PageMethod类中的一个方法,PageHelper继承了PageMethod类,调用startPage返回的是Page对象,Page类中有doSelectPage方法,此方法返回对象仍是Page,而且他的参数是一个ISelect函数式接口。doSelectPage方法体是调用ISelect接口中的唯一方法doSelect,所以我们调用doSelectPage()只需要传入一个lambda作为函数式接口的方法体就可以了。

另:第一个参数startPage是指定页数。 第二个参数pageSize是指定每页的记录数。

另2:Page对象是MyBatis封装的分页模型,他有

getResult() 获取每页数据

getPages() 获取总页数

getTotal() 获取总记录数

getPageNum() 获取当前页面数

Ctrl+f查找,Ctrl+r查找替换,Ctrl+f12查看当前文件结构

8. 一般企业还会额外封装一个通用的分页模型Paging用于处理返回值。(不用记)

pageNum 当前页面数

pageSize 每页记录数

totalPage 总页面数

totalCount 总记录数

data 当前页面的集合数据

return new Paging<>(page.getPageNum(), page.getPageSize(), page.getPages(), page.getTotal(), page.getResult());

9. api返回Json的时候,怎么隐藏字段?怎么规定时间格式?怎么在输出时给字段改名?怎么在json输出是过滤掉空字符串?为什么要过滤?

使用jackson可以对返回的json字符串进行处理

model包中的user实体,不想泄露密码,应该怎么办?
可以用jackson注解来忽略:

@JsonSerialize(using = NullSerializer.class)

配置了这个注解之后,api返回json结果的时候,就不会返回这个字段的值。

如果想规定时间输出格式,也可以用jackson注解来完成格式化输出

@JsonFormat(shape=JsonFormat.Shape.STRING,pattern = “yyyy-MM-dd HH:mm:ss”)

private LocalDateTime gmtCreated;

改名:

@JsonProperty(“isSuccess”)

​ private boolean success = false;

在配置文件application.properties中添加下面这两句话:

spring.jackson.deserialization.fail-on-unknown-properties=false

spring.jackson.default-property-inclusion=non_null

可以过滤掉值为null的json字段。因为如果不过滤会浪费流量。

**
**

**
**

**
**

10.实现类比如UserServiceImpl在spring中属于什么成分?所以需要加什么注解?

属于Bean。加@Component注解

假定数据在编程领域里叫做****mock

**
**

**
**

**
**

11.基于安全的考虑,用户自定义输入的文本需要禁止 HTML 标签,这样可以避免很多恶意的代码

这个技能要掌握住哦可以使用commons-text库进行输出的html转义,从而达到禁用html标签的作用。

所以为什么要这样来着?

String body = StringEscapeUtils.escapeHtml4(content); 执行此段代码可以完成转义

12.如何给代码用md5加密?

​ // 密码加自定义盐值,确保密码安全

​ String saltPwd = pwd + “_ykd2050”;

​ // 生成md5值,并转小写字母

​ String md5Pwd = DigestUtils.md5Hex(saltPwd).toUpperCase();

这里用了common-codec库。其实spring自己也有md5加密。自己搜搜就行了

13.如果一个对象的属性里有其他的子对象,那么怎么才能在查询的时候直接映射子对象呢?

<!--    resultMap有一个子节点associate可以聚合其他模型-->
<resultMap id="commentModelResultMap" type="com.youkeda.comment.model.Comment">
    <id column="id" property="id"/>
    <result column="ref_id" property="refId"/>
    <result column="gmt_modified" property="gmtModified"/>
    <association property="author" javaType="com.youkeda.comment.model.User">
        <id property="id" column="user_id"/>
        <result column="user_name" property="userName"/>
        <result column="nick_name" property="nickName"/>
        <result column="avatar" property="avatar"/>
    </association>
</resultMap>
<!--    property对应的是comment表的字段名称,javaType对应的是java对象-->
<!--    查询语句怎么写?-->
<select id="findByRefId" resultMap="commentModelResultMap">
    select a.*,u.user_name,u.nick_name,u.avatar from comment as a left join user as u
    on a.user_id=u.id where a.ref_id=#{refId} order by a.gmt_created
</select>
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值