Mybatis动态SQL应用解析

内容导读

日志管理与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.多参数查询,大于号&gt; 此处的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 &gt; #{birth}
      </if>
    </where>
  </select>
 
  <!--3.Map集合的传参方式,<号的转义lt;-->
  <select id="selectNames" resultType="java.lang.String">
    select name
    from cool
    where gender = #{gender}
    and birth &lt; #{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);
    }
}

更多精彩内容请关注本站!

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值