MyBatis - 基础学习5 - 日志
一.日志
工厂日志:
如果一个数据库的操作出现了异常,我们需要排错。日志就是最好的助手
以前排错使用:sout,debug
现在:日志工厂
logImpl(日志工厂)
- SLF4J
- LOG4J (掌握)
- LOG4J2
- JDK_LOGGING
- COMMONS_LOGGING
- STDOUT_LOGGING(掌握)
- NO_LOGGING
在mybatis中具体使用那个,就需要自己配置
1.标准的工厂日志实现:
<settings> <setting name="logImpl" value="STDOUT_LOGGING"/> </settings>
2.Log4j
- Log4j是Apache的一个开源项目,通过使用Log4j,我们可以控制日志信息输送的目的地是控制台、文件、GUI组件,甚至是套接口服务器、NT的事件记录器、UNIX Syslog守护进程等
- 通过定义每一条日志信息的级别,我们能够更加细致地控制日志的生成过程
- 这些可以通过一个配置文件来灵活地进行配置,而不需要修改应用的代码
a.需要导包
<!-- https://mvnrepository.com/artifact/log4j/log4j --> <dependency> <groupId>log4j</groupId> <artifactId>log4j</artifactId> <version>1.2.17</version> </dependency>
b.新建一个log4j的properties
#将等级为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/ma.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
c.配置log4j的setting
<settings> <setting name="logImpl" value="LOG4J"/> </settings>
d.使用log4j
简单使用:
1.导包 apache.log4j.logger
2.日志对象,参数为:要输出在那个类;类名+.class
static Logger logger = Logger.getLogger(UserDaoTest.class);
3.日志级别
logger.info("info:进入了testlog4j方法");
logger.debug("debug:进入了testlog4j方法");
logger.error("error:进入了testlog4j方法");
info:提示信息,我们在正常跑代码的时候就可以输出
debug:调试的时候输出的信息
error:出错的时候才会输出的信息
二.分页
使用mybatis实现分页,核心在于使用sql
1.编写分页接口
List<User> getUser(Map<String,Integer> map);
2.在mapper.xml中编写sql语句
<!--分页实查询--> <select id="getUser" parameterType="map" resultMap="usermap"> select * from mybatis.user limit #{index},#{pagesize} </select>
3.测试
@Test public void testlimit(){ SqlSession sqlSession = MyBatisUtils.getSqlSession(); UserMapper mapper = sqlSession.getMapper(UserMapper.class); HashMap<String, Integer> map = new HashMap<String, Integer>(); map.put("index",0); map.put("pagesize",2); List<User> user = mapper.getUser(map); for (User user1 : user) { System.out.println(user1); } sqlSession.close(); }
三.RowBounds分页(基于sql的偏少了,更多的是Java去实现)
1.编写接口
List<User> getUserrowbands();//不需要传参分页参数,Java去实践
2.编写mapper.xml:由于使用Java代码实现分页,所以sql语句就是查询所有的记录
<!-- rowbands 分页实查询--> <select id="getUserrowbands" resultMap="usermap"> select * from mybatis.user </select>
3.测试:这里会引入一个新对象(RowBounds)Java层面分页的控制对象
@Test public void testgetUserrowbands(){ SqlSession sqlSession = MyBatisUtils.getSqlSession(); // 通过roebands实现分页 RowBounds rowBounds = new RowBounds(1, 2);//起始数据 一页显示多少数据 List<User> user = sqlSession.selectList("top.lostyou.dao.UserMapper.getUserrowbands",null,rowBounds); for (User user1 : user) { System.out.println(user1); } sqlSession.close(); }
1.编写接口
public interface UserMapper { @Select("select * from user") List<User> getUser(); }
2.更改mapper映射,映射文件为class
<mappers> <mapper class="top.lostyou.dao.UserMapper"/> </mappers>
3.测试
@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); } sqlSession.close(); }
总结:使用注解来映射简单语句会使代码显得更加简洁,但对于稍微复杂一点的语句,Java 注解不仅力不从心,还会让你本就复杂的 SQL 语句更加混乱不堪。 因此,如果你需要做一些很复杂的操作,最好用 XML 来映射语句
- 面向接口编程
大家之前都学过面向对象编程,也学习过接口,但在真正的开发中,很多时候我们会选择面向接口编程
根本原因:解耦,可拓展,提高复用,分层开发中,上层不用管具体的实现,大家都遵守共同的标准,使得开发变得容易,规范性更好
- 在一个面向对象的系统中,系统的各种功能是由许许多多的不同对象协作完成的。在这种情况下,各个对象内部是如何实现自己的,对系统设计人员来讲就不那么重要了;
- 而各个对象之间的协作关系则成为系统设计的关键。小到不同类之间的通信,大到各模块之间的交互,在系统设计之初都是要着重考虑的,这也是系统设计的主要工作内容。面向接口编程就是指按照这种思想来编程。
- 关于接口的理解
-接口从更深层次的理解,应是定义(规范,约束)与实现(名实分离的原则)的分离。
接口的本身反映了系统设计人员对系统的抽象理解。
- 接口应有两类:
-第一类是对一个个体的抽象,它可对应为一个抽象体(abstract class);
- 第二类是对一个个体某一方面的抽象,即形成一个抽象面(interface)一个体有可能有多个抽象面。抽象体与抽象面是有区别的。
- 三个面向区别
-面向对象是指,我们考虑问题时,以对象为单位,考虑它的属性及方法
-面向过程是指,我们考虑问题时,以一个具体的流程(事务过程)为单位,考虑它的实现
-接口设计与非接口设计是针对复用技术而言的,与面向对象(过程)不是一个问题.更多的体现就是对系统整体的架构