mybatis使用介绍
- 2016-03-16 20:34:00
- admin
- 原创 1979
一、数据库准备
DROP TABLE IF EXISTS Student;
CREATE TABLE Student(
id INT NOT NULL KEY auto_increment,
name VARCHAR(32)
);
INSERT INTO Student VALUES(1, 'feinen');
INSERT INTO Student VALUES(2, 'baobao');
二、mybatis的maven配置
英文帮助:http://www.mybatis.org/generator/index.html
中文帮助:http://generator.sturgeon.mopaas.com/index.html
mybatis手册:http://www.mybatis.org/mybatis-3/
mybatis-spring手册:http://www.mybatis.org/spring/
使用mybatis的maven插件:mvn mybatis-generator:generate命令行使用:java -jar mybatis-generator-core-1.3.2.jar -configfile generatorConfig.xml -overwrite
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.3.0</version>
</dependency>
<dependency>
<groupId>org.mybatis.generator</groupId>
<artifactId>mybatis-generator-core</artifactId>
<version>1.3.2</version>
<scope>runtime</scope>
</dependency>
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis-spring</artifactId>
<version>1.2.3</version>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.0.5</version>
<scope>runtime</scope>
</dependency>
<build>
<plugins>
<plugin>
<groupId>org.mybatis.generator</groupId>
<artifactId>mybatis-generator-maven-plugin</artifactId>
<version>1.3.2</version>
<configuration>
<configurationFile>src\main\resources\generateConfig.xml</configurationFile>
<!--print run log -->
<verbose>true</verbose>
<!--overwrite generated files -->
<overwrite>true</overwrite>
</configuration>
</plugin>
</plugins>
</build>
三、generateConfig.xml说明
properties 指定属性配置文件
classPathEntry 指定数据库的驱动文件
context 指定一个数据库的配置
commentGenerator 指定如何生成注释
jdbcConnection 指定数据库的连接信息
javaTypeResolver 指定DECIMAL和NUMERIC如何映射到JAVA类型
javaModelGenerator 如何生成数据库表实体类(骆驼命名法)
sqlMapGenerator 如何生成Mapper文件
javaClientGenerator 如何生成DAO或者Mapper接口(可选的)
四、mybatis细节(mysqld重启后,Connection需要重新连接)
名字解析:
1 Fully qualified names (e.g. “com.mypackage.MyMapper.selectAllThings”) are looked up directly and used if found.
2 Short names (e.g. “selectAllThings”) can be used to reference any unambiguous entry.(无歧义时可以使用)
mapper映射的替换方案 - 注解(尽量少用):
@Select("select * from Student")
List<Student> selectAll();
生命周期:
SqlSessionFactoryBuilder 使用完后可以立即释放,以便释放xml资源
SqlSessionFactory 应用程序执行SQL一直需要
SqlSession 会话级别,并且多线程不安全
Mapper Instances 同SqlSession的生命周期一样
com.mysql.jdbc.Connection 默认配置连接池(POOLED)
defaultTransactionIsolationLevel 使用java.sql.Connection定义的值(0,1,2,4,8)
五、xml配置
1 properties(可指定配置文件)
优先级:函数参数 > 配置文件 > properties元素体内定义
2 settings(控制行为)
<setting name="cacheEnabled" value="true" />
<setting name="lazyLoadingEnabled" value="true" />
<setting name="multipleResultSetsEnabled" value="true" />
<setting name="useColumnLabel" value="true" />
<setting name="useGeneratedKeys" value="false" />
<setting name="autoMappingBehavior" value="PARTIAL" />
<setting name="defaultExecutorType" value="SIMPLE" />
<setting name="defaultStatementTimeout" value="5" /> //单位是秒
<setting name="callSettersOnNulls" value="false" />
3 mybatis日志配置
1 自动寻找顺序:SLF4J, Apache Commons Logging, Log4j 2, Log4j, JDK logging
2 手动指定:<setting name="logImpl" value="LOG4J"/>
3 trace显示sql和结果,debug只显示sql。
4 日志显示范围(log4j配置)
系统日志 log4j.logger.org.apache.ibatis=debug
所有mapper log4j.logger.com.webank.mapper=debug
单个mapper log4j.logger.com.webank.mapper.StudentMapper=debug
单个mapper方法 log4j.logger.com.webank.mapper.StudentMapper.selectByPrimaryKey=debug
5 指定日志名称前缀(一般不用):<setting name="logPrefix" value="dao." />
所有mapper log4j.logger.dao.com.webank.mapper=debug
4 typeAliases(简化代码编写)
<typeAliases>
<typeAlias alias="Blog" type="domain.blog.Blog" /> //mapper文件使用alias简化代码编写
<package name="domain.blog" /> //指定在哪个包下面查找bean(类)
</typeAliases>
5 typeHandlers(PreparedStatement、ResultSet和Java类型之间的转换)
可以重定义或者创建新的type handler:
1 需要实现org.apache.ibatis.type.TypeHandler接口
2 或继承org.apache.ibatis.type.BaseTypeHandler类
6 environments(开发、测试、生产)
1 One SqlSessionFactory instance per database:SqlSessionFactoryBuilder.build(reader, environment);
2 transactionManager(JDBC、MANAGED、自定义)
JDBC:利用java.sql.Connection的事务机制
MANAGED:什么也不做,但默认关闭连接,但可以配置<property name="closeConnection" value="false"/>
如使用mybatis-spring,则不用配置,因为mybatis-spring会覆盖以上配置
openSession():关闭autoCommit,需要调用commit(提交)、close(提交)、rollback(回滚)
openSession(boolean autoCommit):指定是否autoCommit
3 dataSource(UNPOOLED、POOLED、JNDI、自定义)
UNPOOLED(每session每连接):
driver, url, username, password, defaultTransactionIsolationLevel, driver.encoding=UTF8(默认已经支持中文了)
POOLED(所有session共用,openSession时获取),获取顺序:空闲队列、是否可以新建、强制回收(超过最大签出时间)
poolMaximumActiveConnections 默认10
poolMaximumIdleConnections 默认5
poolMaximumCheckoutTime 默认20000ms(20秒) 最大签出时间(connection被抢占后session失效)
poolTimeToWait 默认20000ms(20秒) 无法获取连接时单次等待时间,由于一定可以获取到连接,所以这个会调用多次
PING机制:每次取连接后会执行PING SQL,失败后重取连接,连续失败poolMaximumIdleConnections + 3次后才会抛出异常
1 ping机制保证取到的连接有效(超时或网络问题产出的无效连接)。
2 conn.isClosed()为false,即使连接已经断开。
3 执行异常SQL会抛出异常,但pingConnection进行了捕获。
PING参数:
poolPingQuery 一般设置为SELECT 1
poolPingEnabled 一般设置为true
poolPingConnectionsNotUsedFor ping间隔时间,单位为毫秒
1 conn.getTimeElapsedSinceLastUse() > poolPingConnectionsNotUsedFor
2 新建和强制回收的getTimeElapsedSinceLastUse为0
4 典型dataSource配置
<property name="driver" value="com.mysql.jdbc.Driver" />
<property name="url" value="jdbc:mysql://211.149.156.144:3306/test" />
<property name="username" value="${username}" />
<property name="password" value="${password}" />
<property name="poolMaximumCheckoutTime" value="20000" />
<property name="poolTimeToWait" value="500" />
<property name="poolPingEnabled" value="true" />
<property name="poolPingQuery" value="SELECT 1" />
<property name="poolPingConnectionsNotUsedFor" value="20000" />
7 mapper文件指定
<mapper resource="org/mybatis/builder/AuthorMapper.xml"/>
<mapper url="file:///var/mappers/AuthorMapper.xml"/>
<mapper class="org.mybatis.builder.AuthorMapper"/>
<package name="org.mybatis.builder"/>