mybatis使用介绍

2016-03-16 20:34:00
admin
原创 1979
摘要:mybatis使用介绍

一、数据库准备

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配置

properties(可指定配置文件)

优先级:函数参数 > 配置文件 > properties元素体内定义


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


typeAliases(简化代码编写)

<typeAliases>
<typeAlias alias="Blog" type="domain.blog.Blog" /> //mapper文件使用alias简化代码编写
<package name="domain.blog" /> //指定在哪个包下面查找bean(类)
</typeAliases>


typeHandlers(PreparedStatement、ResultSet和Java类型之间的转换

可以重定义或者创建新的type handler:

1 需要实现org.apache.ibatis.type.TypeHandler接口

2 或继承org.apache.ibatis.type.BaseTypeHandler类


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"/>

发表评论
评论通过审核之后才会显示。