日志
日志工厂
- 如果数据库操作异常,需要排错,日志是最好的排错工具
- 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(); } }