6.1 log4j使用

配套视频:【编程不良人】Mybatis 从入门到精通_哔哩哔哩_bilibili

 相关jar包:

 org.apache.logging.log4j

 log4j-core

 2.14.1

 org.slf4j

 slf4j-log4j12

 1.7.25

视频中log4j.properties

## 根日志

## 日志级别

log4j.rootLogger=ERROR,stdout

## 输出位置

log4j.appender.stdout=org.apache.log4j.ConsoleAppender

## 布局

log4j.appender.stdout.layout=org.apache.log4j.PatternLayout

## 格式

log4j.appender.stdout.layout.conversionPattern=[%p] %d{yyyy-MM-dd} %t %c %m%n

## 子日志

## 日志级别

log4j.logger.dao=DEBUG

## 监听spring框架的日志级别

log4j.logger.org.springframework=ERROR

StudentDAOTest2.java运行findByIdTest结果

[DEBUG] 2022-04-12 main dao.StudentDAO.findById ==>  Preparing: select id,name,age from student where id=? 

[DEBUG] 2022-04-12 main dao.StudentDAO.findById ==> Parameters: 1(Integer)

[DEBUG] 2022-04-12 main dao.StudentDAO.findById <==      Total: 1

Student{id=1, name='张三', age=15}

Student{id=1, name='张三', age=15}

(待完善)若进行如下细节设置,测试还存在问题:

### 设置###

log4j.rootLogger = debug,stdout,D,E

### 输出信息到控制抬 ###

log4j.appender.stdout = org.apache.log4j.ConsoleAppender

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

### 输出DEBUG级别以上的日志到=D://logs/debug.log ###

log4j.appender.D = org.apache.log4j.DailyRollingFileAppender

log4j.appender.D.File = D://Software_Development/IDEA_code/logs/debug.log           //日志输出路径 可更改

log4j.appender.D.Append = true

log4j.appender.D.Threshold = DEBUG

log4j.appender.D.layout = org.apache.log4j.PatternLayout

log4j.appender.D.layout.ConversionPattern = %-d{yyyy-MM-dd HH:mm:ss} [ %t:%r ] - [ %p ] %m%n

### 输出ERROR级别以上的日志到=E://logs/error.log ###

log4j.appender.E = org.apache.log4j.DailyRollingFileAppender

log4j.appender.E.File =D://Software_Development/IDEA_code/logs/error.log

log4j.appender.E.Append = true

log4j.appender.E.Threshold = ERROR

log4j.appender.E.layout = org.apache.log4j.PatternLayout

log4j.appender.E.layout.ConversionPattern = %-d{yyyy-MM-dd HH:mm:ss} [ %t:%r ] - [ %p ] %m%n

测试代码:

package log4j;

import org.apache.log4j.Logger;

/**

* @ClassName TestLog4j

* @Description TODO

* @Author Jiangnan Cui

* @Date 2022/4/9 22:00

* @Version 1.0

*/

public class TestLog4j {

   private static final Logger logger = Logger.getLogger(Logger.class);

   public static void main(String[] args) {

       //记录info级别的信息

       logger.info("这是info级别的信息");

       //记录debug级别的信息

       logger.debug("这是debug级别的信息");

       //记录error级别的信息

       logger.error("这是error级别的信息");

  }

}

运行结果:

log4j:ERROR setFile(null,true) call failed.

java.io.FileNotFoundException: D:\Software_Development\IDEA_code\logs\debug.log           \ÈÕÖ¾Êä³ö·¾¶ ¿É¸ü¸Ä (系统找不到指定的路径。)

at java.io.FileOutputStream.open0(Native Method)

at java.io.FileOutputStream.open(FileOutputStream.java:270)

at java.io.FileOutputStream.(FileOutputStream.java:213)

at java.io.FileOutputStream.(FileOutputStream.java:133)

at org.apache.log4j.FileAppender.setFile(FileAppender.java:294)

at org.apache.log4j.FileAppender.activateOptions(FileAppender.java:165)

at org.apache.log4j.DailyRollingFileAppender.activateOptions(DailyRollingFileAppender.java:223)

at org.apache.log4j.config.PropertySetter.activate(PropertySetter.java:307)

at org.apache.log4j.config.PropertySetter.setProperties(PropertySetter.java:172)

at org.apache.log4j.config.PropertySetter.setProperties(PropertySetter.java:104)

at org.apache.log4j.PropertyConfigurator.parseAppender(PropertyConfigurator.java:842)

at org.apache.log4j.PropertyConfigurator.parseCategory(PropertyConfigurator.java:768)

at org.apache.log4j.PropertyConfigurator.configureRootCategory(PropertyConfigurator.java:648)

at org.apache.log4j.PropertyConfigurator.doConfigure(PropertyConfigurator.java:514)

at org.apache.log4j.PropertyConfigurator.doConfigure(PropertyConfigurator.java:580)

at org.apache.log4j.helpers.OptionConverter.selectAndConfigure(OptionConverter.java:526)

at org.apache.log4j.LogManager.(LogManager.java:127)

at org.apache.log4j.Logger.getLogger(Logger.java:117)

at log4j.TestLog4j.(TestLog4j.java:13)

log4j:ERROR Either File or DatePattern options are not set for appender [D].

[INFO ] 2022-04-09 23:05:48,318 method:log4j.TestLog4j.main(TestLog4j.java:17)

这是info级别的信息

[DEBUG] 2022-04-09 23:05:48,320 method:log4j.TestLog4j.main(TestLog4j.java:19)

这是debug级别的信息

[ERROR] 2022-04-09 23:05:48,320 method:log4j.TestLog4j.main(TestLog4j.java:21)

这是error级别的信息

参考链接:

IDEA中log4j.properties配置文件详解 - 百度文库 idea中log4j的简单使用 - 种瓜得豆。 - 博客园

6.2 排序(order by)

sql语句:

-- 格式:select 字段1,字段2,... from 表名 order by 字段名 asc/desc

--     其中,asc表示升序(默认的排序方式,可省略不写),desc表示降序

SELECT id,name,age FROM student ORDER BY name

查询结果:

6.3 分页查询(limit)

配套视频:【编程不良人】Mybatis 从入门到精通_哔哩哔哩_bilibili

分页前一般先排序,这里以age进行降序排列,每条显示5条数据为例,进行说明

-- 降序排列

SELECT id,NAME,age FROM student ORDER BY age DESC

-- 语法:limit 起始值 页面的大小

-- 格式:select 字段1,字段2,... from 表名 order by 字段名 limit (n-1)*pageSize,pageSize

--       其中,pageSize表示页面大小,(n-1)*pageSize表示起始值,n表示当前页,总页数=数据总数/页面大小

-- 以每页显示5条数据为例

-- 查询第1页 (1-1)*5=0,5 第1页从0开始,范围为0-4,对应第1到第5条数据  

SELECT id,name,age FROM student ORDER BY age DESC LIMIT 0,5

-- 查询第2页 (2-1)*5=5,5 第2页从5开始,范围为5-9,对应第6到第10条数据  

SELECT id,NAME,age FROM student ORDER BY age DESC LIMIT 5,5

  

-- 查询第3页 (3-1)*5=10,5 第3页从10开始,范围为10-14,对应第11到第15条数据        

SELECT id,NAME,age FROM student ORDER BY age DESC LIMIT 10,5

  

StudentDAO.java

/**

* @MethodName selectByPage

* @Description

* @param: pageNow 当前页码

* @param: pageSize 每页显示信息条数

* @return: java.util.List

* @Author Jiangnan Cui

* @Date 2022/4/10 16:16

*/

List selectByPage(Map map);

StudentDAOMapper.xml

注意:limit后面只能这样传入两个参数,多加操作会报错(就目前认知来看)

测试

/**

* @MethodName selectByPage

* @Description 分页查询

* @Author Jiangnan Cui

* @Date 2022/4/10 16:23

*/

@Test

public void selectByPage(){

   SqlSession sqlSession = MybatisUtil.getSqlSession();

   StudentDAO studentDAO = sqlSession.getMapper(StudentDAO.class);

   HashMap map = new HashMap<>();

   map.put("pageStart",0);//第1页从0开始,范围为0-4,对应第1到第5条数据

   map.put("pageSize",5);

   List students1 = studentDAO.selectByPage(map);

   System.out.println("---------------第1页----------------");

   students1.forEach(student -> System.out.println(student));

   map.put("pageStart",5);//第2页从5开始,范围为5-9,对应第6到第10条数据

   map.put("pageSize",5);

   List students2 = studentDAO.selectByPage(map);

   System.out.println("---------------第2页----------------");

   students2.forEach(student -> System.out.println(student));

   map.put("pageStart",10);//第3页从10开始,范围为10-14,对应第11到第15条数据

   map.put("pageSize",5);

   List students3 = studentDAO.selectByPage(map);

   System.out.println("---------------第3页----------------");

   students3.forEach(student -> System.out.println(student));

   sqlSession.close();

}

输出结果:

---------------第1页----------------

Student{id=13, name='慢羊羊', age=70}

Student{id=3, name='光头强', age=37}

Student{id=5, name='小猪猪', age=28}

Student{id=6, name='猪猪侠', age=25}

Student{id=9, name='熊大', age=20}

---------------第2页----------------

Student{id=7, name='猪小呆', age=19}

Student{id=2, name='小呆呆', age=18}

Student{id=10, name='熊二', age=16}

Student{id=1, name='张三', age=15}

Student{id=12, name='暖羊羊', age=14}

---------------第3页----------------

Student{id=11, name='沸羊羊', age=12}

Student{id=4, name='喜洋洋', age=6}

Student{id=8, name='皮卡丘', age=5}

参考链接:

Mybatis--->limit分页查询 - Spring_Xian - 博客园 Mybatis中实现limit分页查询_努力学习搞钱的博客-CSDN博客_mybatis 查询limit

6.4 模糊查询(like)

以在name中模糊查询“猪”为例,sql语句:

-- 格式:select 字段1,字段2,... from 表名 where 字段名 like ’%要查询的模糊词%‘

--     %模糊词: 表示前模糊

--     模糊词%: 表示后模糊

--     %模糊词%:表示中间模糊

SELECT id,name,age FROM student WHERE name LIKE '%猪%'

数据库中查询结果:

 

StudentDAO.java

//模糊查询

List selectByLike(String keyWords);

StudentDAOMapper.xml

注意:

1.模糊查询时要使用“ ”将%括起来而不是’ ‘

2.查询中涉及到中文时,需要在连接数据库时配置characterEncoding=UTF-8

以上两种任一种不设置错误或设置错误均会导致查询不到结果或结果为null!!!

测试

   /**

    * @MethodName selectByLikeTest

    * @Description 模糊查询

    * @Author Jiangnan Cui

    * @Date 2022/4/10 12:21

    */

   @Test

   public void selectByLikeTest(){

       SqlSession sqlSession = MybatisUtil.getSqlSession();

       StudentDAO studentDAO = sqlSession.getMapper(StudentDAO.class);

       List students = studentDAO.selectByLike("小");

       for (Student student : students) {

           System.out.println(student);

      }

  }

输出结果:

Student{id=5, name='小猪猪', age=28}

Student{id=6, name='猪猪侠', age=25}

Student{id=7, name='猪小呆', age=19}

6.5 实体类别名设置

 实体类起别名对应代码:

   

   

       

       

   

6.6 引入properties配置文件

 jdbc.properties

driver = com.mysql.cj.jdbc.Driver

url = jdbc:mysql://localhost:3306/mybatis

username = root

password = 123456

mybatis-config.xml

   

   

   

   

       

       

           

           

           

           

           

               

               

               

               

               

           

       

   

 

6.7 动态sql(sql、include、if、where、choose、when、otherwise、set、trim、foreach)

配套视频:【编程不良人】Mybatis 从入门到精通_哔哩哔哩_bilibili

具体实现:

t_book表

DROP TABLE IF EXISTS `t_book`;

CREATE TABLE IF NOT EXISTS `t_book`(

`id` VARCHAR(40) PRIMARY KEY,

`name` VARCHAR(40),

`publishDate` DATE,

`price` DOUBLE(7,3),

`author` VARCHAR(50)

)ENGINE=INNODB CHARSET=utf8;

INSERT INTO `t_book` VALUES

('1','六脉神剑',SYSDATE(),120.23,'小黑'),

('2','如来神掌',SYSDATE(),110.23,'小名'),

('3','葵花宝典',SYSDATE(),80.23,'无名'),

('4','星星点灯',SYSDATE(),90.34,'小牛'),

('5','黯然销魂掌',SYSDATE(),67.23,'小伟');

Book.java

package entity;

import java.util.Date;

/**

* @ClassName Book

* @Description TODO

* @Author Jiangnan Cui

* @Date 2022/4/12 15:25

* @Version 1.0

*/

public class Book {

   private String id;

   private String name;

   private Date publishDate;

   private Double price;

   private String author;

   @Override

   public String toString() {

       return "Book{" +

               "id='" + id + '\'' +

               ", name='" + name + '\'' +

               ", publishDate=" + publishDate +

               ", price=" + price +

               ", author='" + author + '\'' +

               '}';

  }

   public Book(String id, String name, Date publishDate, Double price, String author) {

       this.id = id;

       this.name = name;

       this.publishDate = publishDate;

       this.price = price;

       this.author = author;

  }

   public Book() {

  }

   public String getId() {

       return id;

  }

   public void setId(String id) {

       this.id = id;

  }

   public String getName() {

       return name;

  }

   public void setName(String name) {

       this.name = name;

  }

   public Date getPublishDate() {

       return publishDate;

  }

   public void setPublishDate(Date publishDate) {

       this.publishDate = publishDate;

  }

   public Double getPrice() {

       return price;

  }

   public void setPrice(Double price) {

       this.price = price;

  }

   public String getAuthor() {

       return author;

  }

   public void setAuthor(String author) {

       this.author = author;

  }

}

a. sql标签

BookDAO.java

/**

* @MethodName selectAll

* @Description 测试查询所有

* @return: java.util.List

* @Author Jiangnan Cui

* @Date 2022/4/12 15:27

*/

List selectAll();

BookDAOMapper.xml

  id,name,publishDate,price,author

TestBookDAO.java

/**

* @MethodName testSelectAll

* @Description 测试查询所有  

* @Author Jiangnan Cui

* @Date 2022/4/12 16:13

*/

@Test

public void testSelectAll(){

   SqlSession sqlSession = MybatisUtil.getSqlSession();

   BookDAO bookDAO = sqlSession.getMapper(BookDAO.class);

   List books = bookDAO.selectAll();

   books.forEach(book -> System.out.println(book));

   MybatisUtil.close();

}

b. if标签

BookDAO.java

/**

* @MethodName selectByFields

* @Description 用来测试动态sql:if、where

* @param: book 此处一定要传入对象

* @return: java.util.List

* @Author Jiangnan Cui

* @Date 2022/4/12 16:08

*/

List selectByFields(Book book);

BookDAOMapper.xml

TestBookDAO.java

/**

* @MethodName testSelectByFields

* @Description 测试 where if

* @Author Jiangnan Cui

* @Date 2022/4/12 16:13

*/

@Test

public void testSelectByFields(){

   SqlSession sqlSession = MybatisUtil.getSqlSession();

   BookDAO bookDAO = sqlSession.getMapper(BookDAO.class);

   List books = bookDAO.selectByFields(new Book(null, "六脉神剑", null, null, "小黑"));

   books.forEach(book -> System.out.println("book = " + book));

}

c.choose when otherwise标签

BookDAO.java

/**

* @MethodName selectByChoose

* @Description 用来测试动态sql:choose、when、otherwise

* @param: book

* @return: java.util.List

* @Author Jiangnan Cui

* @Date 2022/4/12 16:32

*/

List selectByChoose(Book book);

BookDAOMapper.xml

TestBookDAO.java

/**

* @MethodName testSelectByChoose

* @Description 测试 choose、when、otherwise

* @Author Jiangnan Cui

* @Date 2022/4/12 16:39

*/

@Test

public void testSelectByChoose(){

   SqlSession sqlSession = MybatisUtil.getSqlSession();

   BookDAO bookDAO = sqlSession.getMapper(BookDAO.class);

   //List books = bookDAO.selectByChoose(new Book(null, "六脉神剑",null , null, null));

   //List books = bookDAO.selectByChoose(new Book(null, null,null , null, "小黑"));

   List books = bookDAO.selectByChoose(new Book(null, null,null , 110.23, "小黑"));

   books.forEach(book -> System.out.println("book = " + book));

}

d. set标签

BookDAO.java

/**

* @MethodName update

* @Description 测试set标签

* @Author Jiangnan Cui

* @Date 2022/4/12 16:59

* @param book

*/

void update(Book book);

BookDAOMapper.xml

  update t_book

   

       

          name=#{name},

       

       

          author=#{author}

       

   

  where id=#{id}

TestBookDAO.java

/**

* @MethodName testUpdate

* @Description 测试 set

* @Author Jiangnan Cui

* @Date 2022/4/12 17:13

*/

@Test

public void testUpdate(){

   SqlSession sqlSession = MybatisUtil.getSqlSession();

   BookDAO bookDAO = sqlSession.getMapper(BookDAO.class);

   bookDAO.update(new Book("1","九阴真经",null,null,"小猫"));

   MybatisUtil.commit();

}

e. trim标签

BookDAO.java

/**

* @MethodName update

* @Description 测试trim标签

* @Author Jiangnan Cui

* @Date 2022/4/12 16:59

* @param book

*/

void update(Book book);

BookDAOMapper.xml

  update t_book

   

   

       

          name=#{name},

       

       

          author=#{author}

       

   

  id=#{id}

TestBookDAO.java

/**

* @MethodName testUpdate

* @Description 测试 trim

* @Author Jiangnan Cui

* @Date 2022/4/12 17:13

*/

@Test

public void testUpdate(){

   SqlSession sqlSession = MybatisUtil.getSqlSession();

   BookDAO bookDAO = sqlSession.getMapper(BookDAO.class);

   bookDAO.update(new Book("1","九阴真经",null,null,"小猫"));

   MybatisUtil.commit();

}

f. foreach标签

批量插入数据

-- 批量插入数据使用的sql语句:insert into 表名 (字段一,字段二,字段三) values(aaa,bbb,ccc),(ddd,eee,fff),(ggg,hhh,lll)

BookDAO.java

/**

* @MethodName insertAll

* @Description 测试foreach遍历

* @param: books

* @Author Jiangnan Cui

* @Date 2022/4/12 17:44

*/

public void insertAll(List books);

BookDAOMapper.xml

   

      SELECT LAST_INSERT_ID()

   

  insert into t_book

  ()

  values

   

      (

      #{book.id},#{book.name},#{book.publishDate},#{book.price},#{book.author}

      )

   

TestBookDAO.java

/**

* @MethodName testInsertBatch

* @Description 测试foreach遍历 批量插入数据

* @Author Jiangnan Cui

* @Date 2022/4/12 17:52

*/

@Test

public void testInsertBatch(){

   SqlSession sqlSession = MybatisUtil.getSqlSession();

   BookDAO bookDAO = sqlSession.getMapper(BookDAO.class);

   bookDAO.insertBatch(Arrays.asList(

           new Book(UUID.randomUUID().toString(), "海边的卡夫卡", new Date(), 23.45, "村上春树"),

           new Book(UUID.randomUUID().toString(),"阿弥陀佛么么哒",new Date(),25.36,"大冰"),

           new Book(UUID.randomUUID().toString(),"兄弟",new Date(),34.56,"余华")

  ));

   MybatisUtil.commit();

}

批量更新数据

-- 批量更新数据使用的sql语句: UPDATE 表名 SET aa = CASE id WHEN 1 THEN 'aaa' WHEN 2 THEN 'bbb' WHEN 3 THEN 'ccc' END  ,SET bb = CASE id WHEN 1 THEN 'ddd' WHEN 2 THEN 'eee' WHEN 3 THEN 'fff' END WHERE id IN (1,2,3)

BookDAO.java

/**

* @MethodName updateBatch

* @Description 测试foreach遍历 批量更新数据

* @param: books

* @Author Jiangnan Cui

* @Date 2022/4/12 17:44

*/

public void updateBatch(List books);

BookDAOMapper.xml

  update t_book set

  name =

   

            separator=" " open="case id" close="end">

      when #{book.id} then #{book.name}

   

  ,price =

   

            separator=" " open="case id" close="end">

  when #{book.id} then #{book.price}

   

  ,author =

   

            separator=" " open="case id" close="end">

      when #{book.id} then #{book.author}

   

  where id in

   

            separator="," open="(" close=")">

      #{book.id}

   

TestBookDAO.java

/**

* @MethodName testUpdateBatch

* @Description 测试foreach遍历 批量更新数据

* @Author Jiangnan Cui

* @Date 2022/4/12 17:52

*/

@Test

public void testUpdateBatch(){

   SqlSession sqlSession = MybatisUtil.getSqlSession();

   BookDAO bookDAO = sqlSession.getMapper(BookDAO.class);

   bookDAO.updateBatch(Arrays.asList(

           new Book("1", "喜羊羊", new Date(),11.11, "猪猪侠"),

           new Book("2","暖羊羊",new Date(),22.22,"小呆呆"),

           new Book("3","沸羊羊",new Date(),33.33,"波比")

  ));

   MybatisUtil.commit();

}

参考链接

评论可见,请评论后查看内容,谢谢!!!
 您阅读本篇文章共花了: