2.Log4J
<settings> <setting name="logImpl" value="LOG4J"/> </settings>
(1).什么是Log4j?
Log4j是Apache的一个开源项目,通过使用Log4j,我们可以控制日志信息输送的目的地是控制台、文件、GUI组件,甚至是套接口服务器、NT的事件记录器、UNIX Syslog守护进程等;我们也可以控制每一条日志的输出格式;通过定义每一条日志信息的级别,我们能够更加细致地控制日志的生成过程。最令人感兴趣的就是,这些可以通过一个配置文件来灵活地进行配置,而不需要修改应用的代码。
(2).怎么使用Loghj?
(1).导入依赖的包
<!-- https://mvnrepository.com/artifact/log4j/log4j --> <dependency> <groupId>log4j</groupId> <artifactId>log4j</artifactId> <version>1.2.17</version> </dependency>
(2).添加一个配置文件
详细:
# 日志等级可以在哪里使用 log4j.rootLogger=DEBUG,console,dailyFile,im log4j.additivity.org.apache=true # 控制台(console) log4j.appender.console=org.apache.log4j.ConsoleAppender log4j.appender.console.Threshold=DEBUG log4j.appender.console.ImmediateFlush=true log4j.appender.console.Target=System.err log4j.appender.console.layout=org.apache.log4j.PatternLayout log4j.appender.console.layout.ConversionPattern=[%-5p] %d(%r) --> [%t] %l: %m %x %n # 日志文件(logFile) log4j.appender.logFile=org.apache.log4j.FileAppender log4j.appender.logFile.Threshold=DEBUG log4j.appender.logFile.ImmediateFlush=true log4j.appender.logFile.Append=true log4j.appender.logFile.File=E:/logs/log.log4j log4j.appender.logFile.layout=org.apache.log4j.PatternLayout log4j.appender.logFile.layout.ConversionPattern=[%-5p] %d(%r) --> [%t] %l: %m %x %n # 回滚文件(rollingFile) log4j.appender.rollingFile=org.apache.log4j.RollingFileAppender log4j.appender.rollingFile.Threshold=DEBUG log4j.appender.rollingFile.ImmediateFlush=true log4j.appender.rollingFile.Append=true log4j.appender.rollingFile.File=E:/logs/log.log4j log4j.appender.rollingFile.MaxFileSize=200KB log4j.appender.rollingFile.MaxBackupIndex=50 log4j.appender.rollingFile.layout=org.apache.log4j.PatternLayout log4j.appender.rollingFile.layout.ConversionPattern=[%-5p] %d(%r) --> [%t] %l: %m %x %n # 定期回滚日志文件(dailyFile) log4j.appender.dailyFile=org.apache.log4j.DailyRollingFileAppender log4j.appender.dailyFile.Threshold=DEBUG log4j.appender.dailyFile.ImmediateFlush=true log4j.appender.dailyFile.Append=true log4j.appender.dailyFile.File=E:/logs/log.log4j log4j.appender.dailyFile.DatePattern='.'yyyy-MM-dd log4j.appender.dailyFile.layout=org.apache.log4j.PatternLayout log4j.appender.dailyFile.layout.ConversionPattern=[%-5p] %d(%r) --> [%t] %l: %m %x %n # 应用于socket log4j.appender.socket=org.apache.log4j.RollingFileAppender log4j.appender.socket.RemoteHost=localhost log4j.appender.socket.Port=5001 log4j.appender.socket.LocationInfo=true # Set up for Log Factor 5 log4j.appender.socket.layout=org.apache.log4j.PatternLayout log4j.appender.socket.layout.ConversionPattern=[%-5p] %d(%r) --> [%t] %l: %m %x %n # Log Factor 5 Appender log4j.appender.LF5_APPENDER=org.apache.log4j.lf5.LF5Appender log4j.appender.LF5_APPENDER.MaxNumberOfRecords=2000 # 发送日志到指定邮件 log4j.appender.mail=org.apache.log4j.net.SMTPAppender log4j.appender.mail.Threshold=FATAL log4j.appender.mail.BufferSize=10 log4j.appender.mail.From = xxx@mail.com log4j.appender.mail.SMTPHost=mail.com log4j.appender.mail.Subject=Log4J Message log4j.appender.mail.To= xxx@mail.com log4j.appender.mail.layout=org.apache.log4j.PatternLayout log4j.appender.mail.layout.ConversionPattern=[%-5p] %d(%r) --> [%t] %l: %m %x %n # 应用于数据库 log4j.appender.database=org.apache.log4j.jdbc.JDBCAppender log4j.appender.database.URL=jdbc:mysql://localhost:3306/test log4j.appender.database.driver=com.mysql.jdbc.Driver log4j.appender.database.user=root log4j.appender.database.password= log4j.appender.database.sql=INSERT INTO LOG4J (Message) VALUES('=[%-5p] %d(%r) --> [%t] %l: %m %x %n') log4j.appender.database.layout=org.apache.log4j.PatternLayout log4j.appender.database.layout.ConversionPattern=[%-5p] %d(%r) --> [%t] %l: %m %x %n # 自定义Appender log4j.appender.im = net.cybercorlin.util.logger.appender.IMAppender log4j.appender.im.host = mail.cybercorlin.net log4j.appender.im.username = username log4j.appender.im.password = password log4j.appender.im.recipient = corlin@cybercorlin.net log4j.appender.im.layout=org.apache.log4j.PatternLayout log4j.appender.im.layout.ConversionPattern=[%-5p] %d(%r) --> [%t] %l: %m %x %n
常用:
#将等级为DEBUG的日志信息输出到console 和file这两个目的地,console 和file的定义在下面的代码 log4j.rootLogger=DEBUG,console,file #控制台输出的相关设置 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=[%c]-%m%n #文件输出的相关设置 log4j.appender.file = org.apache.log4j.RollingFileAppender log4j.appender.file.File=./log/lwt.log log4j.appender.file.MaxFileSize=10mb log4j.appender.file.Threshold=DEBUG log4j.appender.file.layout=org.apache.log4j.PatternLayout log4j.appender.file.layout.ConversionPattern=[%p][%d{yy-MM-dd}][%c]%m%n #日志输出级别 log4j.logger.org.mybatis=DEBUG log4j.logger.java.sql=DEBUG log4j.logger.java.sql.Statement=DEBUG log4j.logger.java.sql.ResultSet=DEBUG log4j.logger.java.sql.PreparedStatement=DEBUG
3.使用Log4j的操作
(1).提升作用域:
因为一个日志工厂: 不仅仅局限于一个方法,它运用于整个类的方法
Logger logger = Logger.getLogger(String.valueOf(UserDaoTest.class));
(2).绑定日志对象,就是一个类
Logger logger = Logger.getLogger(String.valueOf(绑定的类名.class));
(3).导入使用log4j的包名不要错误
import org.apache.log4j.Logger;
(4).执行后会输出一个日志文件
(5).学会查看日志
(6).日志级别
logger.info("info: 进入了Log4j的工厂...."); logger.debug("debug: 进入了Log4j的工厂...."); logger.error("error: 进入了Log4j的工厂....");
(十一)、分页(利用Map键值对的形式)
1.为什么要使用分页?
(1).减少数据的处理量
2.如何处理数据的分页?(第一种实现方式)
(1).使用数据库的Limit
起始索引=(n-1)*页的距离
select *from user limit index,pagcont;
如果给了两个参数:
就是第一个代表着起始索引页,第二个代表着每页展示的数据数
如果给了一个参数:
就是第一个直接代表展示的数据行数。
(2).使用mybatis进行数据的分页
(1).利用Map当作参数(接口)
List<User> getUserByLimit(Map<String,Object> map);
(2).配置Mapper.xml
因为返回的
<select id="getUserByLimit" parameterType="map" resultMap="UserMap"> select *from mybatis.user limit #{index},#{pag}; </select>
(3).在使用Map键值对形式的时候,不是随便起名字的。
要和占位的参数名字要一直一致>
(4).测试:
@Test public void log4j(){ logger.info("info: 进入了Log4j的工厂...."); logger.debug("debug: 进入了Log4j的工厂...."); logger.error("error: 进入了Log4j的工厂...."); SqlSession sqlSession = MybatisUtils.getSqlSession(); UserMapper mapper = sqlSession.getMapper(UserMapper.class); Map<String, Object> map = new HashMap<>(); map.put("index",0); map.put("pag",2); List<User> userByLimit = mapper.getUserByLimit(map); for (User user : userByLimit) { System.out.println(user); } }
3.RowBounds分页(第二种实现方式)
摆脱了对SQL语句的分页
Mapper接口
package Com.Jsxs.Dao; import Com.Jsxs.pojo.User; import java.util.List; import java.util.Map; public interface UserMapper { // 根据ID查询用户 User getUserById(int id); // 利用Mybatis进行分页的查询操作 , List<User> getUserByLimit(Map<String,Object> map); // 利用RowBounds进行分页的查询操作 List<User> getUserByRowBounds(); }
Mapper.xml语句的配置
<?xml version="1.0" encoding="UTF8" ?> <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "https://mybatis.org/dtd/mybatis-3-mapper.dtd"> <!--namespace绑定一个对应的Dao/Mapper接口--> <mapper namespace="Com.Jsxs.Dao.UserMapper"> <!--结果集映射--> <resultMap id="UserMap" type="User"> <!-- column对应数据库的字段, property对应实体类的属性 --> <result column="id" property="id"></result> <result column="name" property="name"></result> <result column="pwd" property="password"></result> </resultMap> <select id="getUserById" parameterType="int" resultMap="UserMap"> select id,name,pwd from mybatis.user where id=#{id} </select> <select id="getUserByLimit" parameterType="map" resultMap="UserMap"> select *from mybatis.user limit #{index},#{pag}; </select> <select id="getUserByRowBounds" parameterType="map" resultMap="UserMap"> select *from mybatis.user; </select> </mapper>
测试类的实现
sqlSession.selectList("Com.Jsxs.Dao.UserMapper.getUserByRowBounds",null,rowBounds);
@Test public void testRowBounds(){ SqlSession sqlSession = MybatisUtils.getSqlSession(); RowBounds rowBounds = new RowBounds(2, 2); // 类的路径+实现的方法 List<User> list = sqlSession.selectList("Com.Jsxs.Dao.UserMapper.getUserByRowBounds",null,rowBounds); for (User user : list) { System.out.println(user); } sqlSession.close(); } }
RowBuounds类的源码
注意观察点:
查询结果
4.分页插件(第三种实现方式)
(十二)、使用注解开发
1.面向接口编程
在一个面向对象的系统中,系统的各种功能是由许许多多的不同对象协作完成的。在这种情况下,各个对象内部是如何实现自己的,对系统设计人员来讲就不那么重要了;而各个对象之间的协作关系则成为系统设计的关键。小到不同类之间的通信,大到各模块之间的交互,在系统设计之初都是要着重考虑的,这也是系统设计的主要工作内容。面向接口编程就是指按照这种思想来编程。
1.关于接口的理解。
接口从更深层次的理解,应是定义(规范,约束)与实现(名实分离的原则)的分离。
接口的本身反映了系统设计人员对系统的抽象理解。
接口应有两类:第一类是对一个个体的抽象,它可对应为一个抽象体(abstract class);
第二类是对一个个体某一方面的抽象,即形成一个抽象面(interface);
一个体有可能有多个抽象面。
抽象体与抽象面是有区别的。
2.设计接口的另一个不可忽视的因素是接口所处的环境(context,environment),系统论的观点:环境是系统要素所处的空间与外部影响因素的总和。任何接口都是在一定的环境中产生的。因此环境的定义及环境的变化对接口的影响是不容忽视的,脱离原先的环境,所有的接口将失去原有的意义。
2.使用注解进行数据的查询
开辟注解接口
package Com.Jsxs.Dao; import Com.Jsxs.pojo.User; import org.apache.ibatis.annotations.Select; import java.util.List; public interface UserMapper { @Select("select *from user") List<User> getUser(); }
配置实现类的映射
<?xml version="1.0" encoding="UTF8" ?> <!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Config 3.0//EN" "https://mybatis.org/dtd/mybatis-3-config.dtd"> <!--configuration核心配置文件--> <configuration> <properties resource="db.properties"></properties> <!-- 类型别名--> <typeAliases> <package name="Com.Jsxs.pojo"/> </typeAliases> <!-- 默认选项--> <environments default="development"> <!-- 第一套环境--> <environment id="development"> <!-- 事务管理器--> <transactionManager type="JDBC"/> <!-- 数据源 --> <dataSource type="POOLED"> <property name="driver" value="${driver}"/> <property name="url" value="${url}"/> <property name="username" value="${username}"/> <property name="password" value="${password}"/> </dataSource> </environment> </environments> <!-- 绑定接口--> <mappers> <mapper class="Com.Jsxs.Dao.UserMapper"></mapper> </mappers> </configuration>
进行实现
package Com.Jsxs.Dao; import Com.Jsxs.pojo.User; import Com.Jsxs.utils.MybatisUtils; import org.apache.ibatis.session.SqlSession; import org.junit.Test; import java.util.List; public class UserDaoTest { /** * 查询全部的用户信息 */ @Test public void test(){ SqlSession sqlSession = MybatisUtils.getSqlSession(); UserMapper mapper = sqlSession.getMapper(UserMapper.class); List<User> user = mapper.getUser(); for (User user1 : user) { System.out.println(user1); } } }
查询结果
注解的使用存在着弊端,应对简单的语句没问题,遇见复杂的就会出现问题