MyBatis简介
Mybatis以前的名称叫ibatis(internet abatis),后被apache 托管后改名为Mybatis.
MyBatis 是一款优秀的持久层框架,半自动化的ORM映射。
mybatis 与 Hibernate 对比
Mybatis | Hibernate | |
---|---|---|
安全性 | 低 | 高 |
学习成本 | 低 | ORM,hsql |
程序解耦 | 解耦 | 不解耦 |
跨数据库 | 差 | 优良 |
运行速度 | 快 | 比较快 |
使用场景 | 中小企业 | 银行、保险 |
MyBatis的主要成员
描述 | |
---|---|
Configuration | MyBatis所有的配置信息都保存在Configuration对象之中,配置文件中的大部分配置都会存储到该类中 |
SqlSession | 作为MyBatis工作的主要顶层API,表示和数据库交互时的会话,完成必要数据库增删改查功能 |
Executor | MyBatis执行器,是MyBatis 调度的核心,负责SQL语句的生成和查询缓存的维护 |
StatementHandler | 封装了JDBC Statement操作,负责对JDBC statement 的操作,如设置参数等 |
ParameterHandler | 负责对用户传递的参数转换成JDBC Statement 所对应的数据类型 |
ResultSetHandler | 负责将JDBC返回的ResultSet结果集对象转换成List类型的集合 |
TypeHandler | 负责java数据类型和jdbc数据类型(也可以说是数据表列类型)之间的映射和转换 |
MappedStatement | MappedStatement维护一条<select|update|delete|insert>节点的封装 |
SqlSource | 负责根据用户传递的parameterObject,动态地生成SQL语句,将信息封装到BoundSql对象中,并返回 |
BoundSql | 表示动态生成的SQL语句以及相应的参数信息 |
缓存机制
MyBatis缓存,SqlSession实例缓存来缓存数据,从而达到提高查询性能的要求。
一级缓存
样例代码
User user1 = userMapper.selectById(1L);
System.out.println("user1:" + user1);
User user2 = userMapper.selectById(1L);
System.out.println("user2:" + user2);
结果:
Preparing: SELECT id,`name`,sex FROM user where id = ?
Parameters: 1(Long)
Total: 1
二级缓存
UserMapper userMapper1 = sqlSessionFactory.openSession().getMapper(UserMapper.class);
UserMapper userMapper2 = sqlSessionFactory.openSession().getMapper(UserMapper.class);
User user1 = userMapper1.selectById(1L);
System.out.println(user1);
User user2 = userMapper2.selectById(1L);
System.out.println(user2);
事务管理机制
-
JdbcTransaction
-
ManagedTransaction
<!-- 事务管理 --> <bean name="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager"> <property name="dataSource" ref="yunyingDataSource"/> </bean> <!-- 事务注解 --> <tx:annotation-driven transaction-manager="transactionManager" />
连接池管理机制
-
UNPOOLED,不使用连接池的数据源
org.springframework.jdbc.datasource.DriverManagerDataSource
-
POOLED,使用连接池的数据源
- dbcp
- c3p0
- druid
-
JNDI,使用JNDI实现的数据源
- <TOMCAT_HOME>/conf/context.xml配置JNDI方式
<Resource name="jdbc/mmcDB" //指定的jndi名称,会用于spring数据源bean的配置和ResourceLink的配置
auth="Container"//认证方式,一般默认这个
type="javax.sql.DataSource" //数据源床型,使用标准的javax.sql.DataSource
driverClassName="com.mysql.jdbc.Driver" //JDBC驱动器
url="jdbc:mysql://localhost:3306/test" //数据库URL地址
username="test" //数据库用户名
password="test" //数据库密码
maxIdle="40" //最大的空闲连接数
maxWait="4000" //当池的数据库连接已经被占用的时候,最大等待时间
maxActive="250" //连接池当中最大的数据库连接
removeAbandoned="true"
removeAbandonedTimeout="180"
logAbandoned="true" //被丢弃的数据库连接是否做记录,以便跟踪
factory="org.apache.tomcat.dbcp.dbcp.BasicDataSourceFactory" />
- java spring.xml配置
<bean id="dataSource" class="org.springframework.jndi.JndiObjectFactoryBean">
<property name="jndiName">
<value>jdbc/mmcDB</value>
</property>
</bean>