Mybatis持久层框架 | 日志、分页、注解开发

社区

日志

日志工厂

  • 如果数据库操作异常,需要排错,日志是最好的排错工具
  • 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的事件记录器、UNIXSyslog守护进程等;我们也可以控制每一条日志的输出格式;通过定义每一条日志信息的级别,我们能够更加细致地控制日志的生成过程。最令人感兴趣的就是,这些可以通过一个配置文件来灵活地进行配置,而不需要修改应用的代码

  • 导入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();
    }

}
0
0
0
0
评论
未登录
看完啦,登录分享一下感受吧~
暂无评论