💗wei_shuo的个人主页
💫wei_shuo的学习社区
🌐Hello World !
日志
日志工厂
- 如果数据库操作异常,需要排错,日志是最好的排错工具
- SLF4J | LOG4J | LOG4J2 | JDK_LOGGING | COMMONS_LOGGING | STDOUT_LOGGING | NO_LOGGING
- STDOUT_LOGGING 标准日志输出
STDOUT_LOGGING
STDOUT_LOGGING
是标准日志输出
,书写在mybatis-config.xml
文件的<settings>
标签内
- mybatis核心配置文件配置日志
<settings>
<!--标准日志工厂实现-->
<setting name="logImpl" value="STDOUT_LOGGING"/>
</settings>
LOG4J
Log4j是Apache
的一个开源项目,通过使用Log4j,我们可以控制日志信息输送的目的地是控制台
、文件、GUI组件,甚至是套接口服务器、NT
的事件记录器、UNIX
、Syslog
、守护进程
等;我们也可以控制每一条日志的输出格式;通过定义每一条日志信息的级别,我们能够更加细致地控制日志的生成过程。最令人感兴趣的就是,这些可以通过一个配置文件
来灵活地进行配置,而不需要修改应用的代码
• 导入Log4j包
<dependency>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
<version>1.2.17</version>
</dependency>
• log4j.properties(Log4j配置)
log4j.properties
#将等级为DEBUG的日志信息输出到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/wei.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
• 配置Log4j为日志的实现
<settings>
<!--标准日志工厂实现-->
<setting name="logImpl" value="LOG4J"/>
</settings>
Log4j使用
• 导包
import org.apache.log4j.Logger;
• 生成日志对象,参数为当前类的class,此处定义为成员变量static修饰,方便全局调用
//创建日志对象
static Logger logger = Logger.getLogger(UserDaoTest.class);
• 测试
@Test
public void testLog4j(){
logger.info("info:进入了testLog4j");
logger.debug("debug:进入了testLog4j");
logger.error("error:进入了testLog4j");
}
Mybatis分页
Limit分页
• 接口
//分页
List<User> getUserByLimit(Map<String,Integer> map);
• Mapper.xml
<!--分页-->
<select id="getUserByLimit" parameterType="map" resultType="user">
select * from mybatis.user limit #{startIndex},#{pageSize};
</select>
• 测试
@Test
public void getUserByLimit(){
//获取执行sql对象
SqlSession sqlSession = MybatisUtils.getSqlSession();
//获得接口UserMapper
UserMapper mapper = sqlSession.getMapper(UserMapper.class);
//构造Map
HashMap<String, Integer> map = new HashMap<>();
map.put("startIndex",1);
map.put("pageSize",2);
List<User> userList = mapper.getUserByLimit(map);
for (User user: userList){
System.out.println(user);
}
//关闭SqlSession,避免造成内存出现问题
sqlSession.close();
}
}
RowBounds分页
• 接口
List<User> getUserByRowBounds(Map<String,Integer> map);
• Mapper.xml
<select id="getUserByRowBounds" resultType="user">
select * from mybatis.user;
</select>
• 测试
@Test
public void getUserByRowBounds(){
SqlSession sqlSession = MybatisUtils.getSqlSession();
//RowBounds实现
RowBounds rowBounds = new RowBounds(1, 3);
//通过Java代码层面实现分页
List<User> userList = sqlSession.selectList("com.wei.dao.UserMapper.getUserByRowBounds",null,rowBounds);
for (User user: userList){
System.out.println(user);
}
sqlSession.close();
}
注解开发
面向接口编程
面向接口编程是先把客户的业务逻辑线提取出来,作为接口,业务具体实现通过该接口的实现类来完成。当客户需求变化时,只需编写该业务逻辑的新的实现类,通过更改配置文件中该接口的实现类就可以完成需求,不需要改写现有代码,减少对系统的影响。
根本原因:解耦
三种面向区别
- 面向对象:考虑问题,以对象为单位,考虑它的属性及方法
- 面向过程:考虑问题,以具体的流程为单位,考虑它的实现
- 接口设计与非接口设计:针对复用技术而言,与面向对象(过程)不是一个问题,更多体现在对系统的整体架构
注解开发
• 注解在接口实现
public interface UserMapper {
@Select("select * from user")
List<User> getUsers();
}
• 核心配置文件绑定接口
<!--绑定接口-->
<mappers>
<mapper class="com.wei.dao.UserMapper"/>
</mappers>
• 测试类
public class UserMapperTest {
@Test
public void test(){
//获取sqlSessionFactory对象
SqlSession sqlSession = MybatisUtils.getSqlSession();
//获得UserMapper接口类
UserMapper mapper = sqlSession.getMapper(UserMapper.class);
//获得UserMapper中接口类的方法
List<User> users = mapper.getUsers();
for (User user : users) {
System.out.println(user);
}
//关闭SqlSession,避免造成内存出现问题
sqlSession.close();
}
}
CRUD
• 可以在工具类创建时实现自动提交事物
public static SqlSession getSqlSession(){
return sqlSessionFactory.openSession(true); //此处设置参数为true时,表示开启自动提交事物功能
}
• 编写接口,增加注解
@Select("select * from user")
List<User> getUsers();
//方法存在多个参数,需要加上@Param注解
@Select("select * from user where id = #{id} and name = #{name}")
User getUserById(@Param("id") int id, @Param("name") String name);
@Insert("insert into user(id,name,pwd) value(#{id},#{name},#{password})")
int addUser(User user);
@Update("update user set name=#{name},pwd=#{password} where id=#{id}")
int updateUser(User user);
@Delete("delete from user where id = #{uid}")
int deleteUser(@Param("uid") int id);
• 测试类
public class UserMapperTest {
@Test
public void test(){
//获取sqlSessionFactory对象
SqlSession sqlSession = MybatisUtils.getSqlSession();
//获得UserMapper接口类
UserMapper mapper = sqlSession.getMapper(UserMapper.class);
User byId = mapper.getUserById(2, "李顺");
System.out.println(byId);
mapper.addUser(new User(10,"hello","213123"));
mapper.updateUser(new User(10,"world","13212"));
mapper.deleteUser(10);
//关闭SqlSession,避免造成内存出现问题
sqlSession.close();
}
}
🌼 结语:创作不易,如果觉得博主的文章赏心悦目,还请——点赞
👍收藏
⭐️评论
📝冲冲冲
🤞