内容导读
日志管理与lombok工具应用
mybatis动态sql作用与常用语句
mybatis动态sql应用
单元测试
一、日志管理与lombok工具应用
1、日志信息的管理级别
info>debug>warn>error
2、日志文件记录catch中捕获的信息及我们通过日志工具输出的信息
log.info():输出通用信息
log.debug():输出调试信息
log.warn():输出警告信息
log.error():输出错误信息
3、lombok工具应用
通过注解简化实体类代码、用于日志信息输出。
创建基于SSM项目,并在pom.xml中导入相关的依赖
<!--日志工具log:记录程序运行的状态,输出控制台信息,还可以一键关闭控制台输出-->
<!--日志工具slf4与lombok整合使用-->
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-log4j12</artifactId>
<version>1.7.6</version>
</dependency>
<!--导入lombok-->
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.18.20</version>
</dependency>
(1)简化实体类
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.io.Serializable;
/**
* 以下为lombok的注解
*/
@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
public class User implements Serializable {
//用户id,自动生成
private Integer userId;
//用户名称
private String username;
//密码
private String password;
//用户性别
private String gender;
//用户图片
private String userImg;
//删除标记0未,1已
private Integer delTag;
}
(2)日志属性配置文件log4j.properties
设置日志的级别、输出格式、输出内容与文件路径等
#设置日志信息输出位置,info代表输出信息的级别,stdout标准输出设置,logfile输出到磁盘文件上
#级别:INFO>DEBUG>WARN>ERROR
log4j.rootLogger=INFO,stdout,logfile
# 表示在控制台输出信息时是追加还覆盖,此时追加方式
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
# 表示在控制台输出信息时格式,此处为普通文本格式
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
# 设置在控制台输出信息时格式:比如输出日期等,%d输出日期,%p输出线程优级,%c输出程序中的类名,%m具体日志消息,%n换行
log4j.appender.stdout.layout.ConversionPattern=%d %p [%c] - %m%n
# 设置磁盘文件中的日志信息按追加方式添加
log4j.appender.logfile=org.apache.log4j.RollingFileAppender
# 磁盘文件的类型,此处为网页格式
log4j.appender.logfile.layout=org.apache.log4j.HTMLLayout
# 日志文件在磁盘中的完整路径
log4j.appender.logfile.File=c:/temp/mylol.html
# 设置日志文件的大小
log4j.appender.logfile.MaxFileSize=512KB
# 日志文件最大的备份索引号3
log4j.appender.logfile.MaxBackupIndex=3
#日志文件输出格式设置
log4j.appender.logfile.layout.ConversionPattern=%d %p [%c] - %m%n
(3)程序中使用日志工具
//添加lombok的日志注解(内置log4j功能)
@Slf4j
public class MyTools {
//此处创建一个日志工具对象,其实这里应用了反射技术来生成对象
//private static Logger log = Logger.getLogger(MyTools.class);
//声明数据库操作的工厂对象
private static SqlSessionFactory factory;
//使用线程池来管理数据库操作对象SqlSession,它代替PreparedStatement对象功能
private static ThreadLocal<SqlSession> local = new ThreadLocal<SqlSession>();
static {
try {
//拿到配置文件的字节流
InputStream in = Resources.getResourceAsStream("mybatis-onfig.xml");
//直接通过工厂构建对象生成工厂对象
factory = new SqlSessionFactoryBuilder().build(in);
log.info("数据库已连接");
} catch (IOException e) {
log.error("数据库连接有误!");
}
}
//通过线程池管理数据库操作对象
public static SqlSession getSqlSession() {
//从线程池拿已有的数据库操作对象
SqlSession ss = local.get();
//如果从线程池中取的对象为空则创建数据库操作对象
if (ss == null) {
//生成对象并设置数据库事务管理不自动提交
ss = factory.openSession(false);
//再放入线程池
local.set(ss);
}
return ss;
}
测试一下日志工具的使用
public static void main(String[] args) {
getSqlSession();
//日志文件记录catch中捕获取的信息,及程序员通过log.info(),log.warn(),log.error()方法输出信息
log.warn("此处可能有问题!");
}
}
二、mybatis动态sql作用与常用语句
1、定义与作用
通过条件语句(或其它控制语句)动态拼接(生成)sql语句的机制称为动态sql语句。
动态sql更灵活高效实现sql查询与安全检查,比如:判断用户输入数据是否为空,实现记录的批量插入等。
2、常用动态sql语句
通常以标签方式出现,也可以在注解编程中使用。
<if></if>
<where></where>
<trim</trim>
<forEach></forEach>
3、五种传参及动态sql语句应用
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<!--映射文件对应的接口的完整路径,简称命名空间-->
<mapper namespace="com.mysoft.mapper.CoolMapper">
<!--增删改都没返回值类型的设置-->
<!--1.collecton后是集合类型名称:list与set,item自定义对象名称,取自增id号-->
<!--此处是样的:values(),(),(),()-->
<insert id="insertCools" useGeneratedKeys="true" keyProperty="id" keyColumn="id">
insert into cool(name,gender,birth,mobile) values
<foreach collection="list" item="cool" separator=",">
(#{cool.name},#{cool.gender},#{cool.birth},#{cool.mobile})
</foreach>
</insert>
<!--2.多参数查询,大于号> 此处的where与if动态sql语句有两个作用:判断是否为空,纠正sql语句的错误-->
<select id="selecCools" resultType="com.qf.day0516.entity.Cool">
select id, name, gender, birth, mobile
from cool
<where>
<if test="gender!=nlll">
gender = #{gender}
</if>
<if test="birth!=null">
and birth > #{birth}
</if>
</where>
</select>
<!--3.Map集合的传参方式,<号的转义lt;-->
<select id="selectNames" resultType="java.lang.String">
select name
from cool
where gender = #{gender}
and birth < #{birth};
</select>
<!--4.插入一条记录,传一个实体对象,拿自动生成的id号-->
<insert id="insertCool" useGeneratedKeys="true" keyProperty="id" keyColumn="id">
insert into cool(name, gender, birth, mobile) value (#{name},#{gender},#{birth},#{mobile});
</insert>
<!--5.通过参数的索引号传参不要忘了加arg0,arg1,arg2,一般少用-->
<update id="updateCool">
update cool
set gender=#{arg1},
birth=#{arg2}
where id = #{arg0};
</update>
</mapper>
三、单元测试
@Slf4j
public class MyTest {
//1.批量插入记录
@Test
public void go1() {
SqlSession ss = MyTools.getSqlSession();
CoolMapper cm = ss.getMapper(CoolMapper.class);
//创建list集合
Timestamp tt1 = Timestamp.valueOf("2022-9-8 9:10:11");
//获取当前的时间,传给数据库的时间戳对象
LocalDateTime ldt = LocalDateTime.now();
Timestamp tt2 = Timestamp.valueOf(ldt);
Timestamp tt3 = Timestamp.valueOf("2005-11-18 18:15:6");
// Cool cc1 = new Cool();
// cc1.setName();
// cc1.setGender();
// cc1.setMobile();
Cool c1 = new Cool(null, "tim", "男", tt1, "13701234567");
Cool c2 = new Cool(null, "nick", "男", tt2, "13601234567");
Cool c3 = new Cool(null, "kitty", "女", tt3, "13901234567");
List<Cool> cools = new ArrayList<>();
cools.add(c1);
cools.add(c2);
cools.add(c3);
//添加集合对象
int n = cm.insertCools(cools);
log.info("id:"+cools.get(1).getId());
//提交事务,增删改需要提交,才最终添加到数据库
ss.commit();
//System.out.println("已添加:"+n);
log.info("已添加:"+n);
}
//2.多参查询
@Test
public void go2(){
SqlSession ss = MyTools.getSqlSession();
CoolMapper cm = ss.getMapper(CoolMapper.class);
Timestamp tt = Timestamp.valueOf("2005-11-18 19:0:0");
List<Cool> cs = cm.selecCools(null,tt);
System.out.println(cs);
}
//3.通过map传参查询
@Test
public void go3(){
SqlSession ss = MyTools.getSqlSession();
CoolMapper cm = ss.getMapper(CoolMapper.class);
Map<String,Object> maps = new HashMap<>();
Timestamp tt = Timestamp.valueOf("2005-11-18 19:0:0");
maps.put("gender","男");
maps.put("birth",tt);
List<String> strs = cm.selectNames(maps);
System.out.println(strs);
}
//4.通过索引号传参
@Test
public void go5(){
SqlSession ss = MyTools.getSqlSession();
CoolMapper cm = ss.getMapper(CoolMapper.class);
Timestamp tt = Timestamp.valueOf("2010-11-18 18:8:8");
int n = cm.updateCool(1009,"男",tt);
//增删改要提交事务
ss.commit();
System.out.println("修改:"+n);
}
}
更多精彩内容请关注本站!