发表于: 2020-11-18 18:00:47

1 1299


今天完成的事情:
日志了解及配置应用
一.日志系统基本常识
1.日志系统作用:将日志信息输出到控制台和文本文件,以追踪代码运行信息。
1、关于日志级别
日志可分为五个级别
DEBUG :为程序的调试信息,最低级
INFO :为一般要显示的信息,比如登录登出
ERROR:为严重错误 主要是程序的错误
WARN :为一般警告,比如session丢失
FATAL:崩溃,整个程序终止运行
目前只用到了DEBUG,INFO,ERROR
    private static Logger logger =Logger.getLogger(MybatisTest.class);
     System.out.println("This is println message. yeah");
        // 记录debug级别的信息
        logger.debug("This is debug message.");
        // 记录info级别的信息
        logger.info("This is info message.");
        // 记录error级别的信息
        logger.error("This is error message.");


可在自定义的文件夹查看到日志,这个一般可以在log4j的配置文件看到文件夹的位置


例子:


打开log.log日志可查看到debug级别(为程序的调试信息,可以看到入参和出参的信息,也可以看到JDBC连接池的信息(控制分支的信息))的信息,


一些翻译:


配置文件中一些具体参数的作用
### 设置,log4j.rootLogger用来配置日志输出的优先级和日志输出的目的地。这里是输出优先级是debug级别,目的是输出到stdout参数所指定的载体当中###
log4j.rootLogger = debug,stdout,D,E,I
### 输出信息到控制台 ###
### 设置 名为stdout的输出端载体是那种类型,这里是ConsoleAppender(控制台类型)###
log4j.appender.stdout = org.apache.log4j.ConsoleAppender
### 设置  使用System.out 进行输出 ###
log4j.appender.stdout.Target = System.out
### 设置 设置界面布局###
log4j.appender.stdout.layout = org.apache.log4j.PatternLayout
### 设置 日志的布局格式###
log4j.appender.stdout.layout.ConversionPattern = [%-5p] %d{yyyy-MM-dd HH:mm:ss,SSS} method:%l%n%m%n
运行这个的时候出现一个错误
Incompatible types. Found: 'com.sun.org.slf4j.internal.Logger', required: 'org.apache.log4j.Logger'


使用alt+enter,就会出现这两个包。


运行就会报错

师兄过来看了一下,说是包导错了,换成下面的包,然后重新修改代码,成功跑通



mybatis动态查询
1、where、if标签    做了
2、choose(when、otherwise)标签
3、set标签
4、trim标签
5、foreach标签    做了
6、bind标签
2、choose(when、otherwise)标签
属性介绍:
从多个选项中选择一个,按顺序判断when中的条件出否成立,如果有一个成立,则choose结束。当choose中所有when的条件都不满则时,则执行 otherwise中的sql.类似于Java 的switch 语句,choose为switch,when为case,otherwise则为default
mapper.xml配置文件
<!-- 当参数id有值时优先使用id查询-->
<!-- 当没有id时就去判断用户名是否有值,如果有值就根据用户名全配-->
<!-- 如果用户名也没有值,就是sql查询为空-->
<select id="selectStudentByIdOrName" resultType="com.kbk.pojo.Student">
select * from student
<where>
<choose>
<when test="id != null">
and id = #{id}
</when>
<when test="name != null">
and name = #{name}
</when>
<otherwise>
and 1=2
</otherwise>
</choose>
</where>
</select>
接口:
/**
*
*
* @Title: selectStudentByIdOrName
*
* @Description: 根据用户id或者用户名查询用户
*
* @param student
* @return
*
*/
List<Student> selectStudentByIdOrName(Student student);
测试类:
/**
*
* 当参数id有值时优先使用id查询
* 当没有id时就去判断用户名是否有值,如果有值就根据用户名全配
* 如果用户名也没有值,就是sql查询为空
*
*/
@Test
public void testSelectStudentByIdOrName(){
Student s = new Student();
// s.setId(8);
s.setName("孙悟空");
List<Student> Students = studentDao.selectStudentByIdOrName(s);
for(Student student : Students){
System.out.println(student);
}
}
首先是有id=8 ,   name=孙悟空,查看SQL语句,是select * from student WHERE id = ?,并没有name传进去,说明choose标签的作用是按照按顺序判断when中的条件出否成立,如果有一个成立,则choose结束。并没有进行到下一个name标签

注释id,留名字,这时候SQL语句是select * from student WHERE name = ?,没有ID。


注释id和name,这时SQL语句是select * from student WHERE 1=2,所以结果输出为空


和where标签做对比,id和name同时存在,SQL语句select * from student WHERE id = ? and name = ?,故choose标签确实是按照顺序来判断


3、set标签
1.注意:此标签用于update语句。
2.修改Mapper文件,具体内容如下:
属性介绍:
【解释】
a.SQL语句的set被<set>标签替代。
b.每个<if>中语句最后都带有逗号,如果有写过SQL语句的同学就一定知道,最后的逗号是不能有的,因此,这里的<set>标签能够帮助我们自动的移除最后一个<if>中的逗号。
c.<trim>是一个非常强大的标签,因此,我们也可以通过<trim>来实现<set>的功能,如下:【这种写法的运行效果与<set>等价】
mapper.xml配置文件
<!-- 去除逗号,-->
<update id="updateStudentInfoBySet" parameterType="Student">
update Student
<set>
<if test="studentId != null">
studentId = #{studentId},
</if>
<if test="name != null">
name = #{name},
</if>
<if test="gender != null">
gender = #{gender},
</if>
</set>
where id = #{id}
</update>
接口:
/**
*
*
* @Title: updateStudentInfoBySet
*
* @Description: 根据主键更新student
*
* @param student
* @return
*
*/
boolean updateStudentInfoBySet(Student student);
测试类:
/**
* 根据主键更新student
*/
@Test
public void UpdateStudentInfoBySet(){
Student student = new Student();
student.setId(1);
student.setStudentId(250);
student.setName("佘帅帅");
student.setGender(1);
boolean a =studentDao.updateStudentInfoBySet(student);
//输出用户信息
System.out.println("是否成功修改:"+a);
System.out.println(student);
}
结果,SQL语句(update Student SET studentId = ?, name = ?, gender = ? where id = ? ):


4、trim标签
属性介绍:
where 和 set 标签的功能都可以用trim标签实现,并且在底层就是通过TrimSqlNode 实现的。
trim是更灵活的去除多余关键字的标签,他可以实践where和set的效果.
属性“prefix”表示:加入前缀where,属性“prefixOverrides”表示:自动覆盖第一个“and”或者“or”,后缀的用法类似.
where 标签对应的trim的实现如下
<trim prefix="WHERE" prefixOverrides="ADN |OR "> 
....
</trim>
这里”ADN  | OR  ” 后面的空格不能省略,为了避免匹配到 andes 、orders 等单词。
set 标签对应的trim的实现如下:
<trim prefix="SET" suffixOverrides=","> 
.... 
</trim>


where 标签对应的trim的实现如下
Mapper.xml配置:
<!-- 使用trim标签来配置where标签-->
<!-- 目的是去掉第一个and,不然就会报错-->
<select id="selectStudentByTrimW" resultType="com.kbk.pojo.Student">
select * from student
<trim prefix="where" prefixOverrides="AND | OR ">
<if test="id != null">
and id = #{id}
</if>
<if test="name != null" >
AND name = #{name}
</if>
</trim>
</select>
接口:
/**
* 根据传入参数条件
* @param student 查询的条件:有可能有ID,有可能有Name,也有可能有学号,还有可能是都有
* @return
*/
List<Student> selectStudentByTrimW(Student student);
测试类:
/**
* 使用trim标签来配置where标签
* 根据传入参数条件
* 目的是去掉第一个and,不然就会报错
*/
@Test
public void testSelectStudentByTrimW(){
Student s = new Student();
s.setId(8);
s.setName("孙悟空");
//根据传入参数条件
List<Student> Students = studentDao.selectStudentByTrimW(s);
for(Student student : Students){
System.out.println(student);
}
}
结果:



比如在配置文件去掉  AND


会出现报错,SQL语句(select * from student where and id = ? AND name = ?
语法错误



set 标签对应的trim的实现如下:
Mapper配置文件:
<!-- 使用trim标签来配置set标签-->
<update id="updateStudentByTrimSet" parameterType="Student">
update Student
<trim prefix="set" suffixOverrides="," suffix="where id = #{id}">
<if test="studentId != null">
studentId = #{studentId},
</if>
<if test="name != null">
name = #{name},
</if>
<if test="gender != null">
gender = #{gender},
</if>
</trim>
</update>
接口:
/**
*
*
* @Title: updateStudentByTrimSet
*
* @Description: 使用trim标签来配置set标签,根据主键更新student
*
* @param student
* @return
*
*/
boolean updateStudentByTrimSet(Student student);
测试类:
/**
* 使用trim标签来配置set标签,根据主键更新student
*/
@Test
public void UpdateStudentByTrimSet(){
Student student = new Student();
student.setId(1);
student.setStudentId(250);
student.setName("佘帅帅");
student.setGender(1);
boolean a =studentDao.updateStudentByTrimSet(student);
//输出用户信息
System.out.println("是否成功修改:"+a);
System.out.println(student);
}
结果:



6、bind标签
bind标签可以使用OGNL表达式创建一个变量并将其绑定到上下文中。
OGNL 是 Object-Graph Navigation Language 的缩写,对象-图行导航语言,语法为:#{ }。
Mapper配置文件类
<!-- 本来的模糊查询方式-->
<!-- <select id="findStudentByName" parameterType="java.lang.String" resultType="com.jnshu.Pojo.Student">-->
<!-- select * from student where name like concat('%',#{0},'%')-->
<!-- </select>-->
<!-- 使用bing,模糊查询方式-->
<select id="findStudentByNameBind" resultType="com.kbk.pojo.Student">
<bind name="likeStr" value="'%' + name + '%'" />
select * from student where name like #{likeStr}
</select>
接口:
/**
*
*
* @Title: findStudentByNameBind
*
* @Description: 演示bind用法
*
* @param(value="name")
* @return
*
*/
List<Student> findStudentByNameBind(@Param("name") String name);
测试类:
/**
* 演示bind用法,根据名字查询
*/
@Test
public void testFindStudentByNameBind(){
List<Student> Students = studentDao.findStudentByNameBind("静夜思");
for(Student student : Students){
System.out.println(student);
}
}
做这的时候碰到错误,
org.apache.ibatis.exceptions.PersistenceException:
### Error querying database.  Cause: org.apache.ibatis.reflection.ReflectionException: There is no getter for property named 'name' in 'class java.lang.String'
### Cause: org.apache.ibatis.reflection.ReflectionException: There is no getter for property named 'name' in 'class java.lang.String'


自己尝试了半个小时debug,重现编写xml中的SQL语句,试了多次还是没有成功
最后是师兄在接口中加了@Param(value = "name")

@Param的用法和作用

用注解来简化xml配置的时候,@Param注解的作用是给参数命名(重命名,这时候接口的定义参数名无意义,可以随意改动),参数命名后就能根据名字得到参数值,正确的将参数传入sql语句中
接口中@Param(value = "name1")参数重命名传到sql语句中,是传到以下位置。之前一直报错的原因,是因为传过来的参数,xml识别不了。


明天计划的事情:
使用自定义域名并通过配置本地Host来配置DB连接文件,ResultMap
为什么不可以用Select * from table?
CreateAt和UpdateAt的意义分别是创建时间和修改时间,这两个时间应该在什么情况下赋值?是否应该开放给外部调用的接口?
遇到的问题:
以上


收获:日志的了解和使用,mybatis动态标签了解和使用,@param的了解和使用
碰到知识点,一定要用一遍,光看是没有作用的,会忘记的。而且需要多测试几次,比如:在这个单词后面加一个1,测试一下这个接口和xml文件的对应关系,其他的都可以照此测试。



返回列表 返回列表
评论

    分享到