学习Mybatis第三天
学习Mybatis第三天
1. 日志
1.1 日志工厂
如果一个数据库操作出现了异常,我们需要排错,日志就是最好的助手了!
曾今:sout,debug
现在:日志工厂
- SLF4J
- LOG4J 【掌握】
- LOG4J2
- JDK_LOGGING
- COMMONS_LOGGING
- STDOUT_LOGGING 【掌握】
- NO_LOGGING
在Mybatis中具体使用哪一个日志实现,在设置中设定
STDOUT_LOGGING 标准日志输出
在mybatis核心配置文件中配置
<settings><setting name="logImpl" value="STDOUT_LOGGING"/>
</settings>
1.2 LOG4J
什么是LOG4J
Log4j是Apache的一个开源项目
通过使用Log4j,我们可以控制日志信息输送的目的地:控制台,文本,GUI组件…
我们也可以控制每一条日志的输出格式
通过定义每一条日志信息的级别,我们能够更加细致地控制日志的生成过程。最令人感兴趣的就 是,这些可以通过一个配置文件来灵活地进行配置,而不需要修改应用的代码。
- 先导入LOG4J的包
<dependency><groupId>log4j</groupId><artifactId>log4j</artifactId><version>1.2.12</version>
</dependency>
- log4j.properties
#将等级为DEBUG的日志信息输出到console和file这两个目的地,console和file的定义在下面的代码log4j.rootLogger=DEBUG,console,file#控制台输出的相关设置log4j.appender.console = org.apache.log4j.ConsoleAppenderlog4j.appender.console.Target = System.outlog4j.appender.console.Threshold=DEBUGlog4j.appender.console.layout = org.apache.log4j.PatternLayoutlog4j.appender.console.layout.ConversionPattern=[%c]-%m%n#文件输出的相关设置log4j.appender.file = org.apache.log4j.RollingFileAppenderlog4j.appender.file.File=./log/zhang.loglog4j.appender.file.MaxFileSize=10mblog4j.appender.file.Threshold=DEBUGlog4j.appender.file.layout=org.apache.log4j.PatternLayoutlog4j.appender.file.layout.ConversionPattern=[%p][%d{yy-MM-dd}][%c]%m%n#日志输出级别log4j.logger.org.mybatis=DEBUGlog4j.logger.java.sql=DEBUGlog4j.logger.java.sql.Statement=DEBUGlog4j.logger.java.sql.ResultSet=DEBUGlog4j.logger.java.sql.PreparedStatement=DEBUG
- 配置log4j为日志的实现
<settings><setting name="logImpl" value="LOG4J"/>
</settings>
4. LOG4J的使用,直接测试运行刚才的查询
简单使用
在要使用LOG4J的类中,导入包import org.apache.log4j.Logger;
日志对象,参数为当前类的class
static Logger logger = Logger.getLogger(UserDaoTest.class);
- 日志级别
logger.info("info:进入了testlog4j");logger.debug("debug:进入了testlog4j");logger.error("erro:进入了testlog4j");
2.分页
为什么要分页
- 减少数据的处理量
2.1使用Limit分页
语法 select * from user limit startIndex,pageSize
select * from user limit n; #[0,n)
使用Mybatis实现分页,核心SQL
- 接口
//分页List<User> getUserByLimit(Map<String,Integer> map);
- Mapper.xml
<!--分页--><select id="getUserByLimit" parameterType="map" resultType="User">select * from mybatis.user limit #{startIndex},#{pageSize}</select>
- 测试
@Testpublic void getUserByLimit(){SqlSession sqlSession = MybatisUtils.getSqlSession();UserMapper mapper = sqlSession.getMapper(UserMapper.class);HashMap<String, Integer> stringIntegerHashMap = new HashMap<>();stringIntegerHashMap.put("startIndex",0);stringIntegerHashMap.put("pageSize",2);List<User> userByLimit = mapper.getUserByLimit(stringIntegerHashMap);for (User user : userByLimit) {System.out.println(user);}sqlSession.close();}
2.2 RowBounds
不再使用SQL实现分页
- 接口
//分页2List<User> getUserByRowBounds();
- mapper.xml
<!--分页2--><select id="getUserByRowBounds" parameterType="map" resultType="User">select * from mybatis.user</select>
- 测试
@Testpublic void getUserByRowBounds(){SqlSession sqlSession = MybatisUtils.getSqlSession();//RowBounds实现RowBounds rowBounds = new RowBounds(1, 2);//通过java代码层面实现分页List<Object> userList = sqlSession.selectList("com.zhang.dao.UserMapper.getUserByRowBounds",null,rowBounds);for (Object user : userList) {System.out.println(user);}sqlSession.close();}
2.3 分页插件
[MyBatis 分页插件 PageHelper]()
3. 使用注解开发
3.1 面向接口编程
- 大家之前都学过面向对象编程,也学习过接口,但在真正的开发中,很多时候我们会选择面向接口编程
- 根本原因 : 解耦 , 可拓展 , 提高复用 , 分层开发中 , 上层不用管具体的实现 , 大家都遵守共同的标准 , 使得开发变得容易 , 规范性更好
- 在一个面向对象的系统中,系统的各种功能是由许许多多的不同对象协作完成的。在这种情况下, 各个对象内部是如何实现自己的,对系统设计人员来讲就不那么重要了;
- 而各个对象之间的协作关系则成为系统设计的关键。小到不同类之间的通信,大到各模块之间的交 互,在系统设计之初都是要着重考虑的,这也是系统设计的主要工作内容。面向接口编程就是指按 照这种思想来编程。
关于接口的理解
接口从更深层次的理解,应是定义(规范,约束)与实现(名实分离的原则)的分离。
接口的本身反映了系统设计人员对系统的抽象理解。
接口应有两类:
第一类是对一个个体的抽象,它可对应为一个抽象体(abstract class);
第二类是对一个个体某一方面的抽象,即形成一个抽象面(interface);
一个体有可能有多个抽象面。抽象体与抽象面是有区别的。
三个面向区别
- 面向对象是指,我们考虑问题时,以对象为单位,考虑它的属性及方法 .
- 面向过程是指,我们考虑问题时,以一个具体的流程(事务过程)为单位,考虑它的实现 .
- 接口设计与非接口设计是针对复用技术而言的,与面向对象(过程)不是一个问题.更多的体现就是 对系统整体的架构
3.2 利用注解开发
- 注解在接口上实现
@Select("select * from user")List<User> getUsers();
- 需要在核心配置文件中绑定接口
<!--绑定接口--><mappers><mapper class="com.zhang.dao.UserMapper"/></mappers>
- 测试
@Testpublic void test(){SqlSession sqlSession = MybatisUtils.getSqlSession();UserMapper mapper = sqlSession.getMapper(UserMapper.class);List<User> users = mapper.getUsers();for (User user : users) {System.out.println(user);}sqlSession.close();}
本质:反射机制实现
底层:动态代理
3.3 注解的CRUD
- 我们可以在工具类创建的时候实现自动提交事务
public static SqlSession getSqlSession(){//此处设置为ture,可以不用手动提交SqlSession sqlSession = sqlSessionFactory.openSession(true);return sqlSession;}
- 编写接口,增加注解
//方法存在多个参数,所有参数前面必须加上@Param("id")注解@Select("select * from user where id = #{id}")User getUserByID(@Param("id") int id);@Insert("insert into user(id,name,pwd) values (#{id},#{name},#{pwd})")int addUser(User user);@Update("update user set name =#{name},pwd = #{pwd} where id = #{id}")int updateUser(User user);@Delete("delete from user where id = #{id}")int deleteUser(@Param("id") int id);
- 绑定接口
<!--绑定接口--><mappers><mapper class="com.zhang.dao.UserMapper"/></mappers>
【注意:我们必须要将接口注册绑定到我们的核心配置文件中】
- 测试类
@Testpublic void test(){SqlSession sqlSession = MybatisUtils.getSqlSession();UserMapper mapper = sqlSession.getMapper(UserMapper.class);
// List<User> users = mapper.getUsers();
// for (User user : users) {// System.out.println(user);
// }// User userByID = mapper.getUserByID(1);
// System.out.println(userByID);// mapper.addUser(new User(5, "爱飞", "131444"));
// mapper.updateUser(new User(5,"爱青","121212"));mapper.deleteUser(5);sqlSession.close();}
3.4关于@Param()注解
- 基本类型的参数或者String类型,需要加上
- 引用类型不需要加
- 如果只有一个基本类型的话,可以忽略,建议加上
- 我们在SQL中引用的就是这里的@Param()中设定的属性名
//方法存在多个参数,所有参数前面必须加上@Param("id")注解@Select("select * from user where id = #{id}")User getUserByID(@Param("id") int id);
学习Mybatis第三天相关推荐
- MyBatis学习总结(三)
MyBatis学习总结(三) 之前对数据库的增删改查是基于XML实现的,现在要基于注解实现. 1 .定义SQL映射接口 这个是我的项目目录 创建一个接口UserMapperI接口 package co ...
- 菜鸟Vue学习笔记(三)
菜鸟Vue学习笔记(三) 本周使用了Vue来操作表单,接下来说下Vue中双向绑定表单元素的用法. Vue中双向绑定是使用的v-model,所谓的双向绑定即改变变量的值,表单元素的值也会改变,同样的,改 ...
- python学习之第三课时--基本数据类型及区别,变量
python学习之第三课时--基本数据类型及区别,变量 基本数据类型及区别 1. 数字类型(int) 数字型--变量值直接是数字,没有双引号"" 整数 2. 浮点数(float ...
- HTML5 Canvas 学习日志(三)
2019独角兽企业重金招聘Python工程师标准>>> HTML5 Canvas 学习日志(三) Canvas的11种合成 蓝色为destination,粉色为source 1 ...
- Linux学习之CentOS(三十四)--配置域主DNS服务器
在上一篇随笔里 Linux学习之CentOS(三十三)--DNS基础及域名系统架构,讲解了DNS的一些基础知识以及域名系统架构,在本篇随笔里将详细地讲解主DNS服务器的配置... 一.DNS服务器的类 ...
- Java NIO 学习笔记(三)----Selector
目录: Java NIO 学习笔记(一)----概述,Channel/Buffer Java NIO 学习笔记(二)----聚集和分散,通道到通道 Java NIO 学习笔记(三)----Select ...
- 拒绝从入门到放弃_《鸟哥的 Linux 私房菜 — 基础学习篇(第三版)》必读目录
目录 目录 前言 关于这本书 必看知识点 最后 前言 相信部分刚进入这个行业的新同学会对一个问题感到疑惑,为什么从培训学校出来的学员不被欢迎? 这里记录下一些我个人的看法(博主也曾有面试新员工的经历) ...
- UFLDL深度学习笔记 (三)无监督特征学习
UFLDL深度学习笔记 (三)无监督特征学习 1. 主题思路 "UFLDL 无监督特征学习"本节全称为自我学习与无监督特征学习,和前一节softmax回归很类似,所以本篇笔记会比较 ...
- 学习javascript数据结构(三)——集合
前言 总括: 本文讲解了数据结构中的[集合]概念,并使用javascript实现了集合. 原文博客地址:学习javascript数据结构(三)--集合 知乎专栏&&简书专题:前端进击者 ...
最新文章
- 微软python在线学习_微软再推免费在线 Python 教程,面向数据科学和机器学习初学者...
- CSS3颜色渐变模式
- python操作文件夹-Python文件操作大全,随机删除文件夹内的任意文件
- 802.1x认证EAP包结构
- 【市场调研与分析】Intel发力移动安全领域——By Me at 20140613
- LSGO软件技术团队内部技术交流
- apt mysql 5.1_linux下apt安装mysql导致mysql.user table is damaged
- java编写两邮件传输,JAVA邮件发送(文字+图片+附件)【源码】
- androidpn的学习研究(五)androidpn-client 常见BUG解决方法
- oracle 12c 自增序列
- 注入修改代码,白嫖按键精灵ios手机版
- Tensorflow-Keras教程
- Android项目用到的or比较好的资料
- jupyter notebook报错:ModuleNotFoundError: No module named ‘cufflinks‘
- 2W字!梳理50道经典计算机网络面试题(收藏版)
- java小游戏-扫雷游戏
- 路由器总是显示未连接到服务器,链接路由器但一直显示未连接服务器
- Python黑客入门:暴力破解zip,零基础也可以学会
- RBAC权限管理系统
- Ubuntu 20.04 使用 哆点教程
热门文章
- 百度地图API显示车辆运行轨迹并动画展示
- C# NPIO导出Excel设置宽度背景色
- 镜头选型——景深计算
- 什么是服务器丢包?恒讯科技教你如何解决
- vc 实时显示系统时间
- 剑指offer T46把数字翻译成字符串
- 4.4 服务器上的 Git - 配置服务器
- AJAX步步精心系列(一)AJAX简介
- Tomcat出现警告:[RMI TCP Connection(3)-127.0.0.1] org.apache.tomcat.util.descriptor.web.WebXml.setVersion
- 教研室 计算机实验室管理制度,实验室规章制度(电子版)