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>