Mybatis06--日志和分页

一、日志

1.1日志工厂

如果一个数据库操作出现了异常,我们需要排错,所以日志就是最好的助手

曾经:sout,debug

在这里插入图片描述

  • SLF4J
  • LOG4J 掌握
  • LOG4J2
  • JDK_LOGGING
  • COMMONS_LOGGING
  • STDOUT_LOGGING 掌握
  • NO_LOGGING

在Mybatis中具体使用哪一个日志实现,在设置中设定

STDOUT_LOGGING标准日志输出

在Mybatis核心配置文件中配置日志

可以拿上面写过的例子来测试,直接把以下内容写入mybatis-config.xml即可

注意标签顺序~

<settings>
    <!--标准日志工厂实现-->
   <setting name="logImpl" value="STDOUT_LOGGING"/>
</settings>

控制台输出:

Opening JDBC Connection
Created connection 601008104.
Setting autocommit to false on JDBC Connection [com.mysql.jdbc.JDBC4Connection@23d2a7e8]
==>  Preparing: select * from shy.user1 where id = ? 
==> Parameters: 1(Integer)
<==    Columns: id, username, password
<==        Row: 1, shy, 123
<==      Total: 1
User1{id=1, username='shy', pwd='123'}
Resetting autocommit to true on JDBC Connection [com.mysql.jdbc.JDBC4Connection@23d2a7e8]
Closing JDBC Connection [com.mysql.jdbc.JDBC4Connection@23d2a7e8]
Returned connection 601008104 to pool.

1.2 Log4j

1.先导入Log4j包

​ Log4j是Apache的一个开源项目,通过使用Log4j,我们可以控制日志信息输送的目的地是控制台、文件、GUI组件

​ 我们也可以控制每一条日志的输出格式

​ 通过定义每一条日志信息的级别,我们能够更加细致地控制日志的生成过程

​ 这些可以通过一个配置文件来灵活地进行配置,而不需要修改应用的代码。

配置:

结构:
在这里插入图片描述

1.导入Log4j包

<!-- https://mvnrepository.com/artifact/log4j/log4j -->
<dependency>
    <groupId>log4j</groupId>
    <artifactId>log4j</artifactId>
    <version>1.2.17</version>
</dependency>

2.log4j.properties

### 配置根 ###
log4j.rootLogger = DEBUG,console,file

### 设置输出sql的级别###
log4j.logger.org.mybatis=DEBUG
log4j.logger.java.sql=DEBUG
log4j.logger.java.sql.Statement=DEBUG
log4j.logger.java.sql.PreparedStatement=DEBUG
log4j.logger.java.sql.ResultSet=DEBUG

### 配置输出到控制台 ###
log4j.appender.console = org.apache.log4j.ConsoleAppender
log4j.appender.console.Target = System.out
log4j.appender.console.Threshold = DEBUG
log4j.appender.console.layout = org.apache.log4j.PatternLayout
log4j.appender.console.layout.ConversionPattern =  %d{ABSOLUTE} %5p %c{1}:%L - %m%n

### 配置输出到文件 ###
log4j.appender.file = org.apache.log4j.RollingFileAppender
log4j.appender.file.File = ./log/shy.log
log4j.appender.file.MaxFileSize=10mb
log4j.appender.file.Threshold = DEBUG
log4j.appender.file.layout = org.apache.log4j.PatternLayout
log4j.appender.file.layout.ConversionPattern = %-d{yyyy-MM-dd HH:mm:ss}  [ %t:%r ] - [ %p ]  %m%n

3.配置log4j为日志的实现,这里一个字母不能差,最好直接复制

<settings>
     <setting name="logImpl" value="LOG4J"/>
</settings>

4.Log4j的使用,直接测试运行刚才的查询

22:47:25,927 DEBUG LogFactory:135 - Logging initialized using 'class org.apache.ibatis.logging.log4j.Log4jImpl' adapter.
22:47:25,989 DEBUG VFS:111 - Class not found: org.jboss.vfs.VFS
22:47:25,989 DEBUG JBoss6VFS:142 - JBoss 6 VFS API is not available in this environment.
22:47:25,989 DEBUG VFS:111 - Class not found: org.jboss.vfs.VirtualFile
22:47:25,989 DEBUG VFS:63 - VFS implementation org.apache.ibatis.io.JBoss6VFS is not valid in this environment.
22:47:25,989 DEBUG VFS:77 - Using VFS adapter org.apache.ibatis.io.DefaultVFS
22:47:25,989 DEBUG DefaultVFS:222 - Find JAR URL: file:/D:/IDEA/IdeaWorkSpace/Mybatis-Study/mybatis-04/target/classes/com/shy/pojo
22:47:25,989 DEBUG DefaultVFS:248 - Not a JAR: file:/D:/IDEA/IdeaWorkSpace/Mybatis-Study/mybatis-04/target/classes/com/shy/pojo
22:47:26,021 DEBUG DefaultVFS:102 - Reader entry: User1.class
22:47:26,021 DEBUG DefaultVFS:113 - Listing file:/D:/IDEA/IdeaWorkSpace/Mybatis-Study/mybatis-04/target/classes/com/shy/pojo
22:47:26,021 DEBUG DefaultVFS:222 - Find JAR URL: file:/D:/IDEA/IdeaWorkSpace/Mybatis-Study/mybatis-04/target/classes/com/shy/pojo/User1.class
22:47:26,115 DEBUG DefaultVFS:248 - Not a JAR: file:/D:/IDEA/IdeaWorkSpace/Mybatis-Study/mybatis-04/target/classes/com/shy/pojo/User1.class
22:47:26,115 DEBUG DefaultVFS:102 - Reader entry: ����   1 <
22:47:26,130 DEBUG ResolverUtil:256 - Checking to see if class com.shy.pojo.User1 matches criteria [is assignable to Object]
22:47:26,203 DEBUG PooledDataSource:335 - PooledDataSource forcefully closed/removed all connections.
22:47:26,203 DEBUG PooledDataSource:335 - PooledDataSource forcefully closed/removed all connections.
22:47:26,204 DEBUG PooledDataSource:335 - PooledDataSource forcefully closed/removed all connections.
22:47:26,204 DEBUG PooledDataSource:335 - PooledDataSource forcefully closed/removed all connections.
22:47:26,270 DEBUG JdbcTransaction:137 - Opening JDBC Connection
22:47:26,483 DEBUG PooledDataSource:406 - Created connection 1209669119.
22:47:26,484 DEBUG JdbcTransaction:101 - Setting autocommit to false on JDBC Connection [com.mysql.jdbc.JDBC4Connection@481a15ff]
22:47:26,485 DEBUG getUserById:159 - ==>  Preparing: select * from shy.user1 where id = ? 
22:47:26,515 DEBUG getUserById:159 - ==> Parameters: 1(Integer)
22:47:26,528 DEBUG getUserById:159 - <==      Total: 1
User1{id=1, username='shy', pwd='123'}
22:47:26,528 DEBUG JdbcTransaction:123 - Resetting autocommit to true on JDBC Connection [com.mysql.jdbc.JDBC4Connection@481a15ff]
22:47:26,529 DEBUG JdbcTransaction:91 - Closing JDBC Connection [com.mysql.jdbc.JDBC4Connection@481a15ff]
22:47:26,529 DEBUG PooledDataSource:363 - Returned connection 1209669119 to pool.

简单使用

1.在要使用Log4j的类中导入包 import org.apache.log4j.Logger;案例还是使用之前做过的根据用户查询相关信息就行,直接新建一个模块,然后copy过来就能用改动的地方不多~

例子:

1.UserMapper接口

package com.shy.dao;
import com.shy.pojo.User1;
import java.util.List;
import java.util.Map;
public interface UserMapper {
    //根据ID查询用户
    User1 getUserById(int id);
    //分页
    List<User1> getUserByLimit(Map<String,Integer> map);
}

2.实体类还是之前使用的

3.UserMapper.xml

<?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.shy.dao.UserMapper">
    <resultMap id="UserMap" type="User1">
        <result column="password" property="pwd"/>
    </resultMap>
    <select id="getUserById" resultMap="UserMap">
        select *  from shy.user1 where id = #{id}
    </select>
    <!--分页:减少数据的处理量-->
    <select id="getUserByLimit" parameterType="map" resultMap="UserMap">
        select * from shy.user1 limit #{startIndex},#{pageSize}
    </select>
</mapper>

4.mybatis-config.xml加入

<settings>
     <setting name="logImpl" value="LOG4J"/>
</settings>

5.编写log4j配置文件,上面有

6.测试

package com.shy.dao;
import com.shy.pojo.User1;
import com.shy.utils.MybatisUtils;
import org.apache.ibatis.session.SqlSession;
import org.apache.log4j.Logger;
import org.junit.Test;
import java.util.HashMap;
import java.util.List;
public class UserDaoTest {
    //日志对象,加载参数为当前类的class
    static Logger logger = Logger.getLogger(UserDaoTest.class);
    @Test
    public void getUserByList(){
        SqlSession sqlSession = MybatisUtils.getSqlSession();
        UserMapper mapper = sqlSession.getMapper(UserMapper.class);
        HashMap<String, Integer> map = new HashMap<String, Integer>();
        map.put("startIndex",1);
        map.put("pageSize",1);
        List<User1> userList = mapper.getUserByLimit(map);
        for (User1 user1 : userList) {
            System.out.println(user1);
        }
        sqlSession.close();
    }
    @Test
    public void test(){
        SqlSession sqlSession = MybatisUtils.getSqlSession();
        logger.info("测试进入test方法成功");
        UserMapper mapper = sqlSession.getMapper(UserMapper.class);
        User1 userById = mapper.getUserById(1);
        System.out.println(userById);
        sqlSession.close();
    }
	//日志级别
    @Test
    public void testLog4j(){
        logger.info("info:进入了testLog4j");
        logger.debug("debug:进入了testLog4j");
        logger.error("error:进入了testLog4j");
    }

}

二、分页

2.1减少数据的处理量

使用Limit分页

SELECT * FROM USER1 limit (当前页码 - 1)*每页数量,每页数量
SELECT * FROM USER1 limit 3; #[0,3]

使用Mybatis实现分页

1.接口

//分页
List<User1> getUserByLimit(Map<String,Integer> map);

2.Mapper.xml

<!--分页-->
    <select id="getUserByLimit" parameterType="map" resultMap="UserMap">
        select * from shy.user1 limit #{startIndex},#{pageSize}
    </select>

3.测试

	@Test
    public void getUserByList(){
        SqlSession sqlSession = MybatisUtils.getSqlSession();
        UserMapper mapper = sqlSession.getMapper(UserMapper.class);
        HashMap<String, Integer> map = new HashMap<String, Integer>();
        map.put("startIndex",1);
        map.put("pageSize",1);
        List<User1> userList = mapper.getUserByLimit(map);
        for (User1 user1 : userList) {
            System.out.println(user1);
        }
        sqlSession.close();
    }

2.2 MyBatis 分页插件 PageHelper,有这玩意儿两行就完事了~

三、使用注解开发

3.1面向接口编程

根本原因:解耦

深层理解:定义与实现分离

接口应有两类:

​ 第一类是对一个个个体的抽象,他可对应为一个抽象体

​ 第二类是对一个个体某一方面的抽象,形成一个抽象面

三个面向区别:

​ 面向对象:我们考虑问题时,以对象为单位,考虑他的属性及方法

​ 面向过程:我们考虑问题时,以一个具体的流程(事务过程)为单位考虑它 的实现

​ 接口设计与非接口设计是针对复用技术而言的,与面向对象(过程)不是一个问题,更多的体现就是对系统整体的架构

3.2使用注解开发

简单的语句可以使用,复杂的别用,一般使用xml文件配置更好

3.3CRUD

我们可以在工具类创建的时候实现自动提交事务!

//获取SqlSession连接
  public static SqlSession getSession(){
      return getSession(true); //事务自动提交
  }
 
  public static SqlSession getSession(boolean flag){
      return sqlSessionFactory.openSession(flag);
  }

1.注解在接口上实现:

package com.shy.dao;
import com.shy.pojo.User1;
import org.apache.ibatis.annotations.Insert;
import org.apache.ibatis.annotations.Param;
import org.apache.ibatis.annotations.Select;
import java.util.List;
public interface UserMapper {
    @Select("select * from user1")
    List<User1> getUser();
    //方法存在多个参数,所有的参数前必须加@Param注解
    @Select("select * from user1 where id = #{id}")
    User1 getUserByID(@Param("id") int id);
    @Insert("insert into user1(id,username,password) values (#{id},#{username},#{pwd})")
    int addUser(User1 user1);
}

2.在核心配置文件中绑定接口

<!--可以给实体类取别名-->
    <typeAliases>
        <package name="com.shy.pojo"/>
    </typeAliases>
<!--绑定接口-->
    <mappers>
        <mapper class="com.shy.dao.UserMapper"/>
    </mappers>

3.测试

import com.shy.dao.UserMapper;
import com.shy.pojo.User1;
import com.shy.utils.MybatisUtils;
import org.apache.ibatis.session.SqlSession;
import org.junit.Test;
public class UserMapperTest {
    @Test
    public void test(){
        SqlSession sqlSession = MybatisUtils.getSqlSession()
        UserMapper mapper = sqlSession.getMapper(UserMapper.class);
        /*List<User1> user = mapper.getUser();
        for (User1 user1 : user) {
            System.out.println(user);
        }*/
        /*User1 userByID = mapper.getUserByID(1);
        System.out.println(userByID);*/
        mapper.addUser(new User1(3,"zz","963"));
        sqlSession.commit();
        sqlSession.close();
    }
}

本质:反射机制实现

底层:动态代理

@Param注解

基本类型的参数或者String类型需要加上

引用数据类型不用加

如果只有一个基本类型的话,可以忽略,建议加上

在SQL中使用的就是@Param中设定的属性名

#{} 和 ${}区别:去用#{}

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值