下载log4j-1.2.17.jar包:www.mvnrepository.com/artifact/log4j/log4j
也可以在我们之前下载的MyBatis压缩包中找lib->log4j-1.2.17.jar导入到构建目录中。
1、启动日志
conf.xml文件全局参数设置:
<configuration>
<!--数据库文件引入-->
<properties resource="db.properties"/>
<!--全局参数-->
<settings>
<!--开启日志并指定日志类型,如果不指定,默认SLF4j-->
<setting name="logImpl" value="LOG4j"/>
</settings>
<!--设置单个/多个别名-->
<typeAliases>
2、编写日志输出文件
log4j.rootLogger=DEBUG,stdout
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
#日志布局
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
#日志格式
log4j.appender.stdout.layout.onversionPattern=%5p [%t] -%m%n
Log4j建议只使用四个级别,优先级从高到低分别是 ERROR、WARN、INFO、DEBUG
开发时我们使用DEBUG就行
3、使用日志
现在我们在看开启日志后的区别,运行java控制台将看到如图(不用慌,我们只关注箭头指的地方):
MyBatis缓存
在进行查询操作后mybatis会将查询到的数据放入一级二级缓存中,下次在进行相同的操作将不需要再次连接数据库查询,直接找缓存即可。
一级缓存(内存):同一SqlSession对象可以在一级缓存内找缓存,但是commit()后悔清空缓存。
二级缓存(硬盘):同一namespace不同SqlSession对象可以在二级缓存内找缓存,需要注意的是,耳机缓存只有在当前SqlSession被关闭才会使用到。
一级缓存默认开启,二级缓存需要我们手动打开。
1、在conf.xml配置
<!--开启二级缓存-->
<setting name="cacheEnabled" value="true"/>
2、在mapper.xml文件中声明开启
<!-- 声明当前mapper全局开启二级缓存 -->
<cache></chche>
<!--关闭指定select的二级缓存-->
<select id="" useCache="false"></select>
一级二级缓存清理:commit(),进行增删改时;
三方缓存(这里用EnCache)
1、下载jar包:
slf4j-api-1.7.25:MyBatis自带,在lib里面找
MyBatis Ehcache » 1.1.0:https://mvnrepository.com/artifact/org.mybatis.caches/mybatis-ehcache/1.1.0
Ehcache Core » 2.6.11:https://mvnrepository.com/artifact/net.sf.ehcache/ehcache-core/2.6.11
下载完成后导入构建
2、在src下新建EhCache.xml文件来配置Ehcache(下面代码直接复制):
<?xml version="1.0" encoding="UTF-8"?>
<ehcache xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:noNamespaceSchemaLocation="http://ehcache.org/ehcache.xsd"
updateCheck="false">
<!--
diskStore:为缓存路径,ehcache分为内存和磁盘两级,此属性定义磁盘的缓存位置。参数解释如下:
user.home – 用户主目录
user.dir – 用户当前工作目录
java.io.tmpdir – 默认临时文件路径
-->
<diskStore path="java.io.tmpdir/Tmp_EhCache"/>
<!--
defaultCache:默认缓存策略,当ehcache找不到定义的缓存时,则使用这个缓存策略。只能定义一个。
-->
<!--
name:缓存名称。
maxElementsInMemory:缓存最大数目
maxElementsOnDisk:硬盘最大缓存个数
eternal:对象是否永久有效,一但设置了,timeout将不起作用
overflowToDisk:是否保存到磁盘,当系统当机时
timeToIdleSeconds:设置对象在失效前的允许闲置时间(单位:秒)。仅当eternal=false对象不是永久有效时使用,可选属性,默认值是0,也就是可闲置时间无穷大
timeToLiveSeconds:设置对象在失效前允许存活时间(单位:秒)。最大时间介于创建时间和失效时间之间。仅当eternal=false对象不是永久有效时使用,默认是0.,也就是对象存活时间无穷大
diskPersistent:是否缓存虚拟机重启期数据 Whether the disk store persists between restarts of the Virtual Machine. The default value is false.
diskSpoolBufferSizeMB:这个参数设置DiskStore(磁盘缓存)的缓存区大小。默认是30MB。每个Cache都应该有自己的一个缓冲区
diskExpiryThreadIntervalSeconds:磁盘失效线程运行时间间隔,默认是120秒
memoryStoreEvictionPolicy:当达到maxElementsInMemory限制时,Ehcache将会根据指定的策略去清理内存。默认策略是LRU(最近最少使用)。你可以设置为FIFO(先进先出)或是LFU(较少使用)
clearOnFlush:内存数量最大时是否清除
memoryStoreEvictionPolicy:可选策略有:LRU(最近最少使用,默认策略)、FIFO(先进先出)、LFU(最少访问次数)
FIFO,first in first out,这个是大家最熟的,先进先出
LFU, Less Frequently Used,就是上面例子中使用的策略,直白一点就是讲一直以来最少被使用的。如上面所讲,缓存的元素有一个hit属性,hit值最小的将会被清出缓存
LRU,Least Recently Used,最近最少使用的,缓存的元素有一个时间戳,当缓存容量满了,而又需要腾出地方来缓存新的元素的时候,那么现有缓存元素中时间戳离当前时间最远的元素将被清出缓存
-->
<defaultCache
eternal="false"
maxElementsInMemory="10000"
overflowToDisk="false"
diskPersistent="false"
timeToIdleSeconds="1800"
timeToLiveSeconds="259200"
memoryStoreEvictionPolicy="LRU"/>
<cache
name="cloud_user"
eternal="false"
maxElementsInMemory="5000"
overflowToDisk="false"
diskPersistent="false"
timeToIdleSeconds="1800"
timeToLiveSeconds="1800"
memoryStoreEvictionPolicy="LRU"/>
</ehcache>
3、使用EhCache
<!--配置EhCache-->
<cache type="org.mybatis.caches.ehcache.EhcacheCache">
<!--覆盖EhCache.xml中的属性-->
<property name="" value=""></property>
</cache>
逆向工程
MyBatis Generator Core » 1.3.5。jar:https://mvnrepository.com/artifact/org.mybatis.generator/mybatis-generator-core/1.3.5
1、新建Java工程:MyBatisGenerator
导入mybatis.jar、ojdbc.jar、MyBatis Generator.jar
2、逆向工程配置文件:generator.xml并插入以下代码
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE generatorConfiguration PUBLIC "-//mybatis.org//DTD MyBatis Generator Configuration 1.0//EN" "http://mybatis.org/dtd/mybatis-generator-config_1_0.dtd">
<generatorConfiguration>
<context id="DB2Tables" targetRuntime="MyBatis3">
<commentGenerator>
<!-- 是否去除自动生成的注释 -->
<property name="suppressAllComments" value="true"/>
</commentGenerator>
<!-- Mysql数据库连接的信息:驱动类、连接地址、用户名、密码 -->
<jdbcConnection driverClass="oracle.jdbc.OracleDriver"
connectionURL="jdbc:oracle:thin:@127.0.0.1:1521/orcl"
userId="scott"
password="tiger">
</jdbcConnection>
<!-- Oracle数据库
<jdbcConnection driverClass="oracle.jdbc.OracleDriver"
connectionURL="jdbc:oracle:thin:@127.0.0.1:1521:yycg"
userId="yycg"
password="yycg">
</jdbcConnection>
-->
<!-- 默认为false,把JDBC DECIMAL 和NUMERIC类型解析为Integer,为true时
把JDBC DECIMAL 和NUMERIC类型解析为java.math.BigDecimal -->
<javaTypeResolver >
<property name="forceBigDecimals" value="false" />
</javaTypeResolver>
<!-- targetProject:生成POJO实体类的位置 -->
<javaModelGenerator targetPackage="org.mybatis.entity" targetProject=".\src">
<!-- enableSubPackages:是否让schema作为包的后缀 -->
<property name="enableSubPackages" value="false" />
<!-- 从数据库返回的值被清理前后的空格 -->
<property name="trimStrings" value="true" />
</javaModelGenerator>
<!-- targetProject:mapper映射文件生成的位置 -->
<sqlMapGenerator targetPackage="org.mybatis.mapper" targetProject=".\src">
<!-- enableSubPackages:是否让schema作为包的后缀 -->
<property name="enableSubPackages" value="false" />
</sqlMapGenerator>
<!-- targetProject:mapper接口生成的的位置 -->
<javaClientGenerator type="XMLMAPPER" targetPackage="org.mybatis.mapper" targetProject=".\src">
<!-- enableSubPackages:是否让schema作为包的后缀 -->
<property name="enableSubPackages" value="false" />
</javaClientGenerator>
<!-- 指定数据表 -->
<table schema="" tableName="id"></table>
<table schema="" tableName="name"></table>
<table schema="" tableName="age"></table>
<table schema="" tableName="sex"></table>
<!-- 有些表的字段需要指定java类型
<table schema="DB2ADMIN" tableName="ALLTYPES" domainObjectName="Customer" >
<property name="useActualColumnNames" value="true"/>
<generatedKey column="ID" sqlStatement="DB2" identity="true" />
<columnOverride column="DATE_FIELD" property="startDate" />
<ignoreColumn column="FRED" />
<columnOverride column="LONG_VARCHAR_FIELD" jdbcType="VARCHAR" />
</table> -->
</context>
</generatorConfiguration>
3、Test.java执行
package org.mybatis.test;
import org.mybatis.generator.api.MyBatisGenerator;
import org.mybatis.generator.config.Configuration;
import org.mybatis.generator.config.xml.ConfigurationParser;
import org.mybatis.generator.exception.InvalidConfigurationException;
import org.mybatis.generator.exception.XMLParserException;
import org.mybatis.generator.internal.DefaultShellCallback;
import java.io.File;
import java.io.IOException;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;
public class Test {
public static void main(String[] args) throws IOException, XMLParserException, InvalidConfigurationException, SQLException, InterruptedException {
File file = new File("src/generator.xml");
List<String> warnings = new ArrayList<>();
ConfigurationParser configurationParser = new ConfigurationParser(warnings);
Configuration configuration = configurationParser.parseConfiguration(file);
DefaultShellCallback callback = new DefaultShellCallback(true);
//逆向工程的核心类
MyBatisGenerator generator = new MyBatisGenerator(configuration,callback, warnings);
generator.generate(null);
System.out.println("123456");
}
}