MyBatis 实例

栏目: 数据库 · 发布时间: 5年前

内容简介:编写log4j配置文件在resource目录下新建log4j.xml文件

确定依赖

<dependencies>
    <dependency>
      <groupId>mysql</groupId>
      <artifactId>mysql-connector-java</artifactId>
      <version>8.0.15</version>
    </dependency>
    <dependency>
      <groupId>org.apache.logging.log4j</groupId>
      <artifactId>log4j</artifactId>
      <version>2.11.2</version>
      <type>pom</type>
    </dependency>
    <dependency>
      <groupId>org.mybatis</groupId>
      <artifactId>mybatis</artifactId>
      <version>3.5.1</version>
    </dependency>
    <dependency>
      <groupId>junit</groupId>
      <artifactId>junit</artifactId>
      <version>4.11</version>
      <scope>test</scope>
    </dependency>
  </dependencies>

确定目前的目录结构

MyBatis 实例

编写log4j配置文件

编写log4j配置文件

在resource目录下新建log4j.xml文件

<?xml version="1.0" encoding="UTF-8"?>
<!--日志级别以及优先级排序: OFF > FATAL > ERROR > WARN > INFO > DEBUG > TRACE > ALL -->
<!--Configuration后面的status,这个用于设置log4j2自身内部的信息输出,可以不设置,当设置成trace时,你会看到log4j2内部各种详细输出-->
<!--monitorInterval:Log4j能够自动检测修改配置 文件和重新配置本身,设置间隔秒数-->
<configuration status="WARN" monitorInterval="1800">
	<Properties>
		<!-- 日志默认存放的位置,这里设置为项目根路径下,也可指定绝对路径 -->
		<!-- ${web:rootDir}是web项目根路径,java项目没有这个变量,需要删掉,否则会报异常 -->
		<property name="basePath">log4j/log4j2Logs</property>
		<!-- <property name="basePath">d:/qfxSpringMVCMybaitsDemoLogs</property> -->
		
		<!-- 控制台默认输出格式,"%-5level":日志级别,"%l":输出完整的错误位置,是小写的L,因为有行号显示,所以影响日志输出的性能 -->
		<property name="console_log_pattern">%d{yyyy-MM-dd HH:mm:ss.SSS} [%-5level] %l - %m%n</property>
		<!-- 日志文件默认输出格式,不带行号输出(行号显示会影响日志输出性能);%C:大写,类名;%M:方法名;%m:错误信息;%n:换行 -->
		<property name="log_pattern">%d{yyyy-MM-dd HH:mm:ss.SSS} [%-5level] %C.%M - %m%n</property>
		
		<!-- 日志默认切割的最小单位 -->
		<property name="every_file_size">20MB</property>
		<!-- 日志默认输出级别 -->
		<property name="output_log_level">DEBUG</property>
		
		<!-- 日志默认存放路径(所有级别日志) -->
		<property name="rolling_fileName">${basePath}/all.log</property>
		<!-- 日志默认压缩路径,将超过指定文件大小的日志,自动存入按"年月"建立的文件夹下面并进行压缩,作为存档 -->
		<property name="rolling_filePattern">${basePath}/%d{yyyy-MM}/all-%d{yyyy-MM-dd}-%i.log.gz</property>
		<!-- 日志默认同类型日志,同一文件夹下可以存放的数量,不设置此属性则默认为7个 -->
		<property name="rolling_max">50</property>
		
		<!-- Info日志默认存放路径(Info级别日志) -->
		<property name="info_fileName">${basePath}/info.log</property>
		<!-- Info日志默认压缩路径,将超过指定文件大小的日志,自动存入按"年月"建立的文件夹下面并进行压缩,作为存档 -->
		<property name="info_filePattern">${basePath}/%d{yyyy-MM}/info-%d{yyyy-MM-dd}-%i.log.gz</property>
		<!-- Info日志默认同一文件夹下可以存放的数量,不设置此属性则默认为7个 -->
		<property name="info_max">10</property>
		
		<!-- Warn日志默认存放路径(Warn级别日志) -->
		<property name="warn_fileName">${basePath}/warn.log</property>
		<!-- Warn日志默认压缩路径,将超过指定文件大小的日志,自动存入按"年月"建立的文件夹下面并进行压缩,作为存档 -->
		<property name="warn_filePattern">${basePath}/%d{yyyy-MM}/warn-%d{yyyy-MM-dd}-%i.log.gz</property>
		<!-- Warn日志默认同一文件夹下可以存放的数量,不设置此属性则默认为7个 -->
		<property name="warn_max">10</property>
		
		<!-- Error日志默认存放路径(Error级别日志) -->
		<property name="error_fileName">${basePath}/error.log</property>
		<!-- Error日志默认压缩路径,将超过指定文件大小的日志,自动存入按"年月"建立的文件夹下面并进行压缩,作为存档 -->
		<property name="error_filePattern">${basePath}/%d{yyyy-MM}/error-%d{yyyy-MM-dd}-%i.log.gz</property>
		<!-- Error日志默认同一文件夹下可以存放的数量,不设置此属性则默认为7个 -->
		<property name="error_max">10</property>
		
		<!-- 控制台显示的日志最低级别 -->
		<property name="console_print_level">DEBUG</property>
	
	</Properties>
	
	<!--定义appender -->
	<appenders>
		<!-- 用来定义输出到控制台的配置 -->
		<Console name="Console" target="SYSTEM_OUT">
			<!-- 设置控制台只输出level及以上级别的信息(onMatch),其他的直接拒绝(onMismatch)-->
			<ThresholdFilter level="${console_print_level}" onMatch="ACCEPT" onMismatch="DENY"/>
			<!-- 设置输出格式,不设置默认为:%m%n -->
			<PatternLayout pattern="${console_log_pattern}"/>
		</Console>
		
		<!-- 打印root中指定的level级别以上的日志到文件 -->
		<RollingFile name="RollingFile" fileName="${rolling_fileName}" filePattern="${rolling_filePattern}">
			<PatternLayout pattern="${log_pattern}"/>
			<SizeBasedTriggeringPolicy size="${every_file_size}"/>
			<!-- 设置同类型日志,同一文件夹下可以存放的数量,如果不设置此属性则默认存放7个文件 -->
			<DefaultRolloverStrategy max="${rolling_max}" />
			<!-- 匹配INFO以及以上级别 -->
			<Filters>
				<ThresholdFilter level="INFO" onMatch="ACCEPT" onMismatch="DENY"/>
			</Filters>
		</RollingFile>
		
		<!-- 打印INFO级别的日志到文件 -->
		<RollingFile name="InfoFile" fileName="${info_fileName}" filePattern="${info_filePattern}">
			<PatternLayout pattern="${log_pattern}"/>
			<SizeBasedTriggeringPolicy size="${every_file_size}"/>
			<DefaultRolloverStrategy max="${info_max}" />
			<!-- 匹配INFO级别 -->
			<Filters>
				<ThresholdFilter level="WARN" onMatch="DENY" onMismatch="NEUTRAL"/>
				<ThresholdFilter level="INFO" onMatch="ACCEPT" onMismatch="DENY"/>
			</Filters>
		</RollingFile>
		
		<!-- 打印WARN级别的日志到文件 -->
		<RollingFile name="WarnFile" fileName="${warn_fileName}" filePattern="${warn_filePattern}">
			<PatternLayout pattern="${log_pattern}"/>
			<SizeBasedTriggeringPolicy size="${every_file_size}"/>
			<DefaultRolloverStrategy max="${warn_max}" />
			<!-- 匹配WARN级别 -->
			<Filters>
				<ThresholdFilter level="ERROR" onMatch="DENY" onMismatch="NEUTRAL"/>
				<ThresholdFilter level="WARN" onMatch="ACCEPT" onMismatch="DENY"/>
			</Filters>
		</RollingFile>
		
		<!-- 打印ERROR级别的日志到文件 -->
		<RollingFile name="ErrorFile" fileName="${error_fileName}" filePattern="${error_filePattern}">
			<PatternLayout pattern="${log_pattern}"/>
			<SizeBasedTriggeringPolicy size="${every_file_size}"/>
			<DefaultRolloverStrategy max="${error_max}" />
			<!-- 匹配ERROR级别 -->
			<Filters>
				<ThresholdFilter level="FATAL" onMatch="DENY" onMismatch="NEUTRAL"/>
				<ThresholdFilter level="ERROR" onMatch="ACCEPT" onMismatch="DENY"/>
			</Filters>
		</RollingFile>
	</appenders>
	
	<!--然后定义logger,只有定义了logger并引入的appender,appender才会生效-->
	<loggers>
		<!-- 设置对打印 sql 语句的支持 -->
		<logger name="java.sql" level="debug" additivity="false">
			<appender-ref ref="Console"/>
		</logger>
		<!--建立一个默认的root的logger-->
		<root level="${output_log_level}">
			<appender-ref ref="RollingFile"/>
			<appender-ref ref="Console"/>
			<appender-ref ref="InfoFile"/>
			<appender-ref ref="WarnFile"/>
			<appender-ref ref="ErrorFile"/>
		</root>
	</loggers>
</configuration>

新建mybatis配置文件

在resource目录下新建mybatis-config.xml配置文件

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
		"http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
	<!-- 定义别名 -->
	<typeAliases>
		<!-- 暂时预留出别名 -->
	</typeAliases>
	
	<!-- 定义数据库信息 -->
	<environments default="development">
		<environment id="development">
			<!-- jdbc事物管理 -->
			<transactionManager type="JDBC"/>
			<!-- 数据库链接信息 -->
			<dataSource type="POOLED">
				<property name="driver" value="com.mysql.cj.jdbc.Driver"/>
				<property name="url" value="jdbc:mysql://47.94.95.84:32786/mybatis"/>
				<property name="username" value="mybatis"/>
				<property name="password" value="ABCcba20170607"/>
			</dataSource>
		</environment>
	</environments>
</configuration>

构建SqlSessionFactory

根据配置文件构建出sql 会话的产生工厂

package com.ming;

import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;

import java.io.IOException;
import java.io.InputStream;

/**
 * @author ming
 * 构建SqlSessionFactory
 * 由于数据库连接是宝贵的,需要对数据库连接统一管理,所以使用单例进行管理
 * 这里的单利使用的双重锁
 * SqlSessionFactory为线程不安全类型需要加锁,确保同一时刻,只有一个线程可以使用该对象
 */
public class SqlSessionFactoryUtil {

    /**
     * SqlSessionFactory对象
     */
    private static SqlSessionFactory sqlSessionFactory = null;

    /**
     * 类线程锁
     */
    private static final Class CLASS_LOCK = SqlSessionFactoryUtil.class;

    /**
     * 日志管理类
     */
    private static final Logger logger = LogManager.getLogger();
    /**
     * 单例
     */
    private SqlSessionFactoryUtil(){

    }

    /**
     * @return SqlSessionFactory
     * 初始化SqlSessionFactory对象
     */
    public static SqlSessionFactory initSqlSessionFactory(){
        // 配置文件
        String resource = "mybatis-config.xml";
        // 输出流
        InputStream inputStream = null;
        try{
            // 获得配置文件输入流
            inputStream = Resources.getResourceAsStream(resource);
        }catch (IOException e){
            // 错误写入配置文件中
            logger.error(e);
        }

        // 即类锁 采用最小同步快的方式
        if(sqlSessionFactory == null) {
            // 此处排队
            synchronized (CLASS_LOCK) {
                // 多线程情况下唯一的获取工厂对象
                sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
            }
        }
        return sqlSessionFactory;
    }

    /**
     * 打开SqlSession
     * @return SqlSession
     */
    public static SqlSession openSqlSesion(){
        // 判空处理
        if(sqlSessionFactory == null){
            initSqlSessionFactory();
        }
        return sqlSessionFactory.openSession();
    }
}

构建POJO

package com.ming;

public class role {
    private int id;
    private String role_name;
    private String note;
    public role(){

    }

    public void setId(int id) {
        this.id = id;
    }

    public void setRole_name(String role_name) {
        this.role_name = role_name;
    }

    public void setNote(String note) {
        this.note = note;
    }

    public int getId() {
        return id;
    }

    public String getRole_name() {
        return role_name;
    }

    public String getNote() {
        return note;
    }
}

编写配置文件

package com.ming;

public class role {
    private int id;
    private String role_name;
    private String note;
    public role(){

    }

    public void setId(int id) {
        this.id = id;
    }

    public void setRole_name(String role_name) {
        this.role_name = role_name;
    }

    public void setNote(String note) {
        this.note = note;
    }

    public int getId() {
        return id;
    }

    public String getRole_name() {
        return role_name;
    }

    public String getNote() {
        return note;
    }
}

更改mybatis配置文件

<mappers>
		<mapper resource="RoleMapper.xml"/>
	</mappers>

根据映射定义接口

package com.ming;

import org.apache.ibatis.annotations.Param;

import javax.management.relation.Role;

public interface RoleMapper {
    /**
     * @param id
     * @return
     */
    public Role getRole(int id);

    /**
     * @param id
     * @return
     */
    public int deleteRole(int id);

    /**
     * @param role
     * @return
     */
    public int insertRole(Role role);
}

最后编写应用类

<%@ page import="org.apache.ibatis.session.SqlSession" %>
<%@ page import="com.ming.SqlSessionFactoryUtil" %>
<%@ page import="com.ming.RoleMapper" %>
<%@ page import="com.ming.Role" %>
<html>
<body>
<h2>Hello World!</h2>

<%
    SqlSession sqlSession = null;
    try{
        sqlSession = SqlSessionFactoryUtil.openSqlSesion();
        RoleMapper roleMapper = sqlSession.getMapper(RoleMapper.class);
        Role role = new Role();
        role.setRole_name("name");
        role.setNote("note");
        roleMapper.insertRole(role);
        roleMapper.deleteRole(1);
        sqlSession.commit();
    }catch (Exception e){
        e.printStackTrace();
        sqlSession.rollback();
    }finally {
        if(sqlSession != null){
            sqlSession.close();
        }
    }
%>
</body>
</html>

MyBatis 实例


以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,也希望大家多多支持 码农网

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

Numerical Recipes 3rd Edition

Numerical Recipes 3rd Edition

William H. Press、Saul A. Teukolsky、William T. Vetterling、Brian P. Flannery / Cambridge University Press / 2007-9-6 / GBP 64.99

Do you want easy access to the latest methods in scientific computing? This greatly expanded third edition of Numerical Recipes has it, with wider coverage than ever before, many new, expanded and upd......一起来看看 《Numerical Recipes 3rd Edition》 这本书的介绍吧!

CSS 压缩/解压工具
CSS 压缩/解压工具

在线压缩/解压 CSS 代码

RGB CMYK 转换工具
RGB CMYK 转换工具

RGB CMYK 互转工具

HEX HSV 转换工具
HEX HSV 转换工具

HEX HSV 互换工具