mybatis-01
- mybatis概述
1.1、mybatis简介
MyBatis 是支持定制化 SQL、存储过程以及高级映射的优秀的持久层框架。
MyBatis 避免了几乎所有的 JDBC 代码和手动设置参数以及获取结果集。
MyBatis可以使用简单的XML或注解用于配置和原始映射,将接口和Java的POJO(Plain Old Java Objects,普通的Java对象)映射成数据库中的记录.
1.2、mybatis历史
原是apache的一个开源项目iBatis, 2010年6月这个项目由apache software foundation 迁移到了google code,随着开发团队转投Google Code旗下,ibatis3.x正式更名为Mybatis ,代码于2013年11月迁移到Github(下载地址见后)。
iBATIS一词来源于“internet”和“abatis”的组合,是一个基于Java的持久层框架。iBATIS提供的持久层框架包括SQL Maps和Data Access Objects(DAO)
1.3、为什么要使用mybatis。
MyBatis是一个半自动化的持久化层框架。
jdbc编程---当我们使用jdbc持久化的时候,sql语句被硬编码到java代码中。这样耦合度太高。代码不易于维护。在实际项目开发中会经常添加sql或者修改sql,这样我们就只能到java代码中去修改。
Hibernate和JPA
长难复杂SQL,对于Hibernate而言处理也不容易
内部自动生产的SQL,不容易做特殊优化。
基于全映射的全自动框架,javaBean存在大量字段时无法只映射部分字段。导致数据库性能下降。
对开发人员而言,核心sql还是需要自己优化
sql和java编码分开,功能边界清晰,一个专注业务、一个专注数据。
可以使用简单的XML或注解用于配置和原始映射,将接口和Java的POJO映射成数据库中的记录。成为业务代码+底层数据库的媒介
2、mybatis的Hello 示例程序
2.1、创建一个数据库和一个单表
drop database if exists mybatis;
create database mybatis;
use mybatis;
##############################################################################
################################### 单表 ######################################
##############################################################################
## 创建单表
create table t_user(
`id` int primary key auto_increment,
`last_name` varchar(50),
`sex` int
);
insert into t_user(`last_name`,`sex`) values('wzg168',1);
select * from t_user;
2.2、搭建mybatis开发环境
2.2.1、创建一个java工程
添加mybatis的核心jar
添加mysql数据库连接驱动
添加log4j日记需要的核心jar
2.2.2、在src目录下添加 log4j.properties 日记配置文件
# Global logging configuration
log4j.rootLogger=DEBUG, stdout
# Console output...
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern=%5p [%t] - %m%n
注意:有一点,需要说明一下。在开发的时候我们需要把日记的级别设置为DEBUG级别。这样可以查看到更多详细和有用的信息。
等项发布的时候再把日记的级别由为INFO。
2.3、创建Pojo对象User
public class User {
private int id;
private String lastName;
private int sex;
2.4、创建UserMapper.xml配置文件
然后在Pojo对象User所在的包下,创建一个UserMapper.xml配置文件。这个配置文件用来配置对User对象所对应的表的增,删,改,查的语句。
一般这个配置文件的命名规则为:类名Mapper.xml
如果是User类,那么对应的配置文件名为UserMapper.xml
如果是Teacher类,那么对应的配置文件名为TeacherMapper.xml
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<!--
namespace属性是名称空间的意思。
功能相当于 给配置文件定义一个包名。
一般情况下。可以写两种值,一种是对应类的全类名
一种情况是。对应类的处理接口全类名(后面讲)。
-->
<mapper namespace="com.atguigu.mybatis.bean.User">
<!--
select 标签用于定义一个select查询语句
id属性,又称之为statementId
id属性可以给select语句定义一个唯一的标识
parameterType 属性定义参数的类型,int 表示基本的Integer类型
resultType 属性定义返回值的数据类型
-->
<select id="selectUserById" parameterType="int" resultType="com.atguigu.mybatis.bean.User">
select id, last_name lastName, sex from t_user where id = #{value}
</select>
</mapper>
2.5、在src目录创建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>
<!-- environments 是配置多个jdbc环境
default表示使用的默认环境
-->
<environments default="development">
<!--
environment 标签用来配置一个环境
id 是环境的标识
-->
<environment id="development">
<!--
transactionManager 配置使用什么样类型的数据库事务管理
type="JDBC" 表示启用事务,有commit和rollback操作
type="MANAGED" 表示不直接控制事务。交给容器处理---几乎不用。
-->
<transactionManager type="JDBC" />
<!--
dataSource标签配置连接池
type="POOLED" 表示启用数据库连接池
type="UNPOOLED" 表示不启用数据库连接池
-->
<dataSource type="POOLED">
<!-- 连接数据库的驱动类 -->
<property name="driver" value="com.mysql.jdbc.Driver" />
<!-- 数据库访问地址 -->
<property name="url" value="jdbc:mysql:///mybatis" />
<!-- 数据库用户名 -->
<property name="username" value="root" />
<!-- 数据库密码 -->
<property name="password" value="root" />
</dataSource>
</environment>
</environments>
<mappers>
<!-- 导入mapper配置文件 -->
<mapper resource="com/atguigu/mybatis/bean/UserMapper.xml" />
</mappers>
</configuration>
2.6、传统mybatis的hello world 示例代码
@Test
public void test1() throws IOException {
// 读取mybatis的核心配置文件
InputStream is = Resources.getResourceAsStream("mybatis-config.xml");
// 通过SqlSessionFactoryBuilder创建一个SqlSessionFactory对象
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(is);
// 创建一个sqlSession对象
SqlSession sqlSession = sqlSessionFactory.openSession();
try {
User user = sqlSession.selectOne("com.atguigu.mybatis.bean.User.selectUserById", 1);
System.out.println(user);
} finally {
sqlSession.close();
}
}
- 传统方式mybatis的增,删,改,查实现
3.1、创建一个UserDao接口
public interface UserDao {
// 保存用户
public int saveUser(User user);
// 更新用户
public int updateUser(User user);
// 根据id删除用户
public int deleteUserById(int id);
// 根据id搜索用户
public User findUserById(int id);
// 搜索全部用户
public List<User> findUsers();
}
3.2、编写UserMapper.xml中的配置
3.2.1、保存用户
<!-- 插入用户
parameterType 属性设置参数类型
id 为使用的标识
-->
<insert id="saveUser" parameterType="com.atguigu.pojo.User">
insert into t_user(last_name,sex) values(#{lastName},#{sex})
</insert>
3.2.2、更新用户
<!-- 更新用户
parameterType 属性设置参数类型
id 为使用的标识
-->
<update id="updateUser" parameterType="com.atguigu.pojo.User">
update t_user
set
last_name = #{lastName},
sex = #{sex}
where
id = #{id}
</update>
3.2.3、根据id删除用户
<!-- 根据id删除用户
parameterType 属性设置参数类型
id 为使用的标识
-->
<delete id="deleteUserById" parameterType="int">
delete from t_user where id = #{id}
</delete>
3.2.4、根据id搜索用户
<!-- 根据id搜索用户
parameterType 属性设置参数类型
id 为使用的标识
resultType 属性是返回的类型
-->
<select id="findUserById" parameterType="int" resultType="com.atguigu.pojo.User">
select id,last_name lastName,sex from t_user where id = #{id}
</select>
3.2.5、搜索全部用户
<!-- 搜索全部用户
id 为使用的标识
resultType 属性是返回的类型
-->
<select id="findUsers" resultType="com.atguigu.pojo.User">
select id,last_name lastName,sex from t_user
</select>
3.3、实现UserDao接口
public class UserDaoImpl implements UserDao {
SqlSessionFactory sqlSessionFactory;
public UserDaoImpl(SqlSessionFactory sqlSessionFactory) {
this.sqlSessionFactory = sqlSessionFactory;
}
@Override
public int saveUser(User user) {
SqlSession sqlSession = sqlSessionFactory.openSession();
int result = 0;
try {
result = sqlSession.insert("com.atguigu.mybatis.bean.User.saveUser", user);
//提交事务
sqlSession.commit();
} finally {
sqlSession.close();
}
return result;
}
@Override
public int updateUser(User user) {
SqlSession sqlSession = sqlSessionFactory.openSession();
int result = 0;
try {
result = sqlSession.update("com.atguigu.mybatis.bean.User.updateUser", user);
//提交事务
sqlSession.commit();
} finally {
sqlSession.close();
}
return result;
}
@Override
public int deleteUserById(int id) {
SqlSession sqlSession = sqlSessionFactory.openSession();
int result = 0;
try {
result = sqlSession.update("com.atguigu.mybatis.bean.User.deleteUserById", id);
//提交事务
sqlSession.commit();
} finally {
sqlSession.close();
}
return result;
}
@Override
public User findUserById(int id) {
SqlSession sqlSession = sqlSessionFactory.openSession();
User result = null;
try {
result = sqlSession.selectOne("com.atguigu.mybatis.bean.User.findUserById", id);
} finally {
sqlSession.close();
}
return result;
}
@Override
public List<User> findUsers() {
SqlSession sqlSession = sqlSessionFactory.openSession();
List<User> result = null;
try {
result = sqlSession.selectList("com.atguigu.mybatis.bean.User.findUsers");
} finally {
sqlSession.close();
}
return result;
}
}
3.4、编写UserDao测试
package com.atguigu.dao.impl.test;
import java.io.InputStream;
import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
import org.junit.BeforeClass;
import org.junit.Test;
import com.atguigu.dao.UserDao;
import com.atguigu.dao.impl.UserDaoImpl;
import com.atguigu.pojo.User;
public class UserDaoTest {
static UserDao userDao;
/**
* @BeforeClass标注的方法会在所有测试之前执行之前执行一次
* @throws Exception
*/
@BeforeClass
public static void setUpBeforeClass() throws Exception {
String url = "mybatis-config.xml";
InputStream inputStream = Resources.getResourceAsStream(url);
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
userDao = new UserDaoImpl(sqlSessionFactory);
}
@Test
public void testSaveUser() {
User user = new User(0, "bbbbb", 0);
userDao.saveUser(user);
System.out.println(user);
}
@Test
public void testUpdateUser() {
User user = new User(2, "cccccc", 0);
userDao.updateUser(user);
}
@Test
public void testDeleteUserById() {
userDao.deleteUserById(2);
}
@Test
public void testFindUserById() {
System.out.println( userDao.findUserById(1) );
}
@Test
public void testFindUsers() {
System.out.println( userDao.findUsers() );
}
}
3.5、插入记录并返回主键
往数据库插入数据后,返回数据主键信息。有两种方法。
一种:使用insert标签中的useGeneratedKeys属性和keyProperty属性组合使用获取主键信息。
一种:使用子元素selectKey标签执行sql语句获取。
<!-- 插入用户
useGeneratedKeys="true"
表示返回生成的主键
keyProperty 表示把返回的key注入到返回值的哪个属性中
keyProperty="id" 表示把返回的id主键值注入到返回对象的id属性中
-->
<insert id="saveUser" useGeneratedKeys="true" keyProperty="id"
parameterType="com.atguigu.pojo.User">
insert into t_user(last_name,sex) values(#{lastName},#{sex})
</insert>
3.6、<selectKey> 标签的使用
selectKey 通过前置或后置操作,返回数据的 主键值。
插入记录并返回主键主要是在<insert>标签中添加一个<selectKey>
<selectKey>的作用主要就是为了返回插入记录后,自动生成的主键信息
order 表示执行的顺序。
AFTER 表示在插入之后执行。
BEFORE 在插入之前执行。
keyProperty 属性设置对象的哪个属性接收
resultType 属性设置返回值类型。
<!-- 插入用户 -->
<insert id="saveUser" parameterType="com.atguigu.pojo.User">
<!--
selectKey标签主要用于插入数据后,获取生成的主键。
order 表示执行的顺序,AFTER表示在插入之后执行。BEFORE在插入之前执行。
keyProperty属性设置对象的哪个属性接收
resultType属性设置返回值类型。
-->
<selectKey order="AFTER" keyProperty="id" resultType="int">
SELECT LAST_INSERT_ID()
</selectKey>
insert into t_user(last_name,sex) values(#{lastName},#{sex})
</insert>
selectKey 返回Oracle的序列自增主键
<selectKey order="BEFORE" resultType="int" keyProperty="id">
select 序列名.nextval as id from dual
</selectKey>
4、Mapper接口方式的mybatis的增,删,改,查实现
4.1、Mapper接口编程的命名习惯
Mapper接口方式的编程,需要先有一个接口。这个接口的命名一般是xxxxMapper。
比如:
User模块的Mapper,接口命名为UserMapper。
Book模块的Mapper,接口命名为BookMapper。
4.2、Mapper接口开发有四个开发规范**必须遵守**
- 对应的mapper配置文件的namespace属性值必须是Mapper接口的全类名。
- Mapper接口中的方法名必须与mapper配置文件中对应的id值相同。
- Mapper接口的方法的参数类型必须与mapper配置文件中配置的parameterType类型匹配上
- Mapper接口的方法返回值类型必须与mapper配置文件中配置的resultType 类型匹配上
4.3、编写Mapper接口
package com.atguigu.mapper;
import java.util.List;
import com.atguigu.pojo.User;
public interface UserMapper {
// 保存用户
public int saveUser(User user);
// 更新用户
public int updateUser(User user);
// 根据id删除用户
public int deleteUserById(int id);
// 根据id搜索用户
public User findUserById(int id);
// 搜索全部用户
public List<User> findUsers();
}
4.4、修改原来UserMapper.xml配置文件
修改原来UserMapper.xml配置文件的namespace属性值为刚创建的UserMapper的全类名
<mapper namespace="com.atguigu.mapper.UserMapper">
4.5、编写UserMapper测试
package com.atguigu.mapper;
import java.io.InputStream;
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.junit.BeforeClass;
import org.junit.Test;
import com.atguigu.pojo.User;
public class UserMapperTest {
static SqlSessionFactory sqlSessionFactory;
@BeforeClass
public static void setUpBeforeClass() throws Exception {
String url = "mybatis-config.xml";
// 读取配置文件
InputStream inputStream = Resources.getResourceAsStream(url);
// 创建SqlSessionFactory对象
sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
}
@Test
public void testSaveUser() {
SqlSession session = sqlSessionFactory.openSession();
try {
UserMapper userMapper = session.getMapper(UserMapper.class);
User user = new User(0, "ddddd", 1);
userMapper.saveUser(user);
session.commit();
System.out.println(user);
} finally {
session.close();
}
}
@Test
public void testUpdateUser() {
SqlSession session = sqlSessionFactory.openSession();
try {
UserMapper userMapper = session.getMapper(UserMapper.class);
User user = new User(5, "eeeee", 1);
userMapper.updateUser(user);
session.commit();
} finally {
session.close();
}
}
@Test
public void testDeleteUserById() {
SqlSession session = sqlSessionFactory.openSession();
try {
UserMapper userMapper = session.getMapper(UserMapper.class);
userMapper.deleteUserById(5);
session.commit();
} finally {
session.close();
}
}
@Test
public void testFindUserById() {
SqlSession session = sqlSessionFactory.openSession();
try {
UserMapper userMapper = session.getMapper(UserMapper.class);
System.out.println(userMapper.findUserById(7));
} finally {
session.close();
}
}
@Test
public void testFindUsers() {
SqlSession session = sqlSessionFactory.openSession();
try {
UserMapper userMapper = session.getMapper(UserMapper.class);
System.out.println(userMapper.findUsers());
} finally {
session.close();
}
}
}
5、mybatis的核心配置之properties
5.1、创建jdbc.properties
一般在实际的项目中。数据库的连接信息。会存放在一个jdbc.properties的属性配置文件中
username=root
password=root
driverClass=com.mysql.jdbc.Driver
url=jdbc:mysql://localhost:3306/mybatis
5.2、在mybatis-config.xml中修改引入properties资源
<!-- properties 配置一些属性。使用的时候,用${name} 进行输出
resource指定属性的位置
-->
<properties resource="jdbc.properties">
<!-- 也可以在properties配置中定义一些属性。当然并不推荐 -->
<property name="username" value="root"/>
<property name="password" value="root"/>
</properties>
特别说明:引入的jdbc.properties属性文件中的信息,会覆盖掉原来使用property标签定义的属性值。
5.3、修改原来数据库连接的信息。
<environments default="development">
<environment id="development">
<transactionManager type="JDBC" />
<dataSource type="POOLED">
<!-- 配置数据库连接信息 -->
<property name="driver" value="${driverClass}" />
<property name="url" value="${url}" />
<property name="username" value="${username}" />
<property name="password" value="${password}" />
</dataSource>
</environment>
</environments>
6、mybatis的核心配置之settings
这是 MyBatis 中极为重要的调整设置,它们会改变 MyBatis 的运行时行为。下表描述了设置中各项的意图、默认值等。
6.1、所有mybatis的settings设置选项
设置参数 | 描述 | 有效值 | 默认值 |
cacheEnabled | 该配置影响的所有映射器中配置的缓存的全局开关。 | true | false | true |
lazyLoadingEnabled | 延迟加载的全局开关。当开启时,所有关联对象都会延迟加载。 特定关联关系中可通过设置fetchType属性来覆盖该项的开关状态。 | true | false | false |
aggressiveLazyLoading | 当启用时,对任意延迟属性的调用会使带有延迟加载属性的对象完整加载;反之,每种属性将会按需加载。 | true | false | true |
multipleResultSetsEnabled | 是否允许单一语句返回多结果集(需要兼容驱动)。 | true | false | true |
useColumnLabel | 使用列标签代替列名。不同的驱动在这方面会有不同的表现, 具体可参考相关驱动文档或通过测试这两种不同的模式来观察所用驱动的结果。 | true | false | true |
useGeneratedKeys | 允许 JDBC 支持自动生成主键,需要驱动兼容。 如果设置为 true 则这个设置强制使用自动生成主键,尽管一些驱动不能兼容但仍可正常工作(比如 Derby)。 | true | false | False |
autoMappingBehavior | 指定 MyBatis 应如何自动映射列到字段或属性。 NONE 表示取消自动映射;PARTIAL 只会自动映射没有定义嵌套结果集映射的结果集。 FULL 会自动映射任意复杂的结果集(无论是否嵌套)。 | NONE, PARTIAL, FULL | PARTIAL |
autoMappingUnknownColumnBehavior | Specify the behavior when detects an unknown column (or unknown property type) of automatic mapping target.
| NONE, WARNING, FAILING | NONE |
defaultExecutorType | 配置默认的执行器。SIMPLE 就是普通的执行器;REUSE 执行器会重用预处理语句(prepared statements); BATCH 执行器将重用语句并执行批量更新。 | SIMPLE REUSE BATCH | SIMPLE |
defaultStatementTimeout | 设置超时时间,它决定驱动等待数据库响应的秒数。 | Any positive integer | Not Set (null) |
defaultFetchSize | Sets the driver a hint as to control fetching size for return results. This parameter value can be override by a query setting. | Any positive integer | Not Set (null) |
safeRowBoundsEnabled | 允许在嵌套语句中使用分页(RowBounds)。 If allow, set the false. | true | false | False |
safeResultHandlerEnabled | 允许在嵌套语句中使用分页(ResultHandler)。 If allow, set the false. | true | false | True |
mapUnderscoreToCamelCase | 是否开启自动驼峰命名规则(camel case)映射,即从经典数据库列名 A_COLUMN 到经典 Java 属性名 aColumn 的类似映射。 | true | false | False |
localCacheScope | MyBatis 利用本地缓存机制(Local Cache)防止循环引用(circular references)和加速重复嵌套查询。 默认值为 SESSION,这种情况下会缓存一个会话中执行的所有查询。 若设置值为 STATEMENT,本地会话仅用在语句执行上,对相同 SqlSession 的不同调用将不会共享数据。 | SESSION | STATEMENT | SESSION |
jdbcTypeForNull | 当没有为参数提供特定的 JDBC 类型时,为空值指定 JDBC 类型。 某些驱动需要指定列的 JDBC 类型,多数情况直接用一般类型即可,比如 NULL、VARCHAR 或 OTHER。 | JdbcType enumeration. Most common are: NULL, VARCHAR and OTHER | OTHER |
lazyLoadTriggerMethods | 指定哪个对象的方法触发一次延迟加载。 | A method name list separated by commas | equals,clone,hashCode,toString |
defaultScriptingLanguage | 指定动态 SQL 生成的默认语言。 | A type alias or fully qualified class name. | org.apache.ibatis.scripting.xmltags.XMLDynamicLanguageDriver |
callSettersOnNulls | 指定当结果集中值为 null 的时候是否调用映射对象的 setter(map 对象时为 put)方法,这对于有 Map.keySet() 依赖或 null 值初始化的时候是有用的。注意基本类型(int、boolean等)是不能设置成 null 的。 | true | false | false |
logPrefix | 指定 MyBatis 增加到日志名称的前缀。 | Any String | Not set |
logImpl | 指定 MyBatis 所用日志的具体实现,未指定时将自动查找。 | SLF4J | LOG4J | LOG4J2 | JDK_LOGGING | COMMONS_LOGGING | STDOUT_LOGGING | NO_LOGGING | Not set |
proxyFactory | 指定 Mybatis 创建具有延迟加载能力的对象所用到的代理工具。 | CGLIB | JAVASSIST | JAVASSIST (MyBatis 3.3 or above) |
vfsImpl | Specifies VFS implementations | Fully qualified class names of custom VFS implementation separated by commas. | Not set |
useActualParamName | Allow referencing statement parameters by their actual names declared in the method signature. To use this feature, your project must be compiled in Java 8 with -parameters option. (Since: 3.4.1) | true | false | true |
7、mybatis的核心配置之typeAliases
类型别名是为 Java 类型设置一个短的名字。它只和 XML 配置有关,存在的意义仅在于用来减少类完全限定名的冗余。
7.1.系统提示的预定义别名
已经为许多常见的 Java 类型内建了相应的类型别名。它们都是大小写不敏感的,需要注意的是由基本类型名称重复导致的特殊处理。
别名 | 映射的类型 |
_byte | byte |
_long | long |
_short | short |
_int | int |
_integer | int |
_double | double |
_float | float |
_boolean | boolean |
string | String |
byte | Byte |
long | Long |
short | Short |
int | Integer |
integer | Integer |
double | Double |
float | Float |
boolean | Boolean |
date | Date |
decimal | BigDecimal |
bigdecimal | BigDecimal |
object | Object |
map | Map |
hashmap | HashMap |
list | List |
arraylist | ArrayList |
collection | Collection |
iterator | Iterator |
8、mybatis的核心配置之typeHandlers
类型处理器 | Java 类型 | JDBC 类型 |
BooleanTypeHandler | java.lang.Boolean, boolean | 数据库兼容的 BOOLEAN |
ByteTypeHandler | java.lang.Byte, byte | 数据库兼容的 NUMERIC 或 BYTE |
ShortTypeHandler | java.lang.Short, short | 数据库兼容的 NUMERIC 或 SHORT INTEGER |
IntegerTypeHandler | java.lang.Integer, int | 数据库兼容的 NUMERIC 或 INTEGER |
LongTypeHandler | java.lang.Long, long | 数据库兼容的 NUMERIC 或 LONG INTEGER |
FloatTypeHandler | java.lang.Float, float | 数据库兼容的 NUMERIC 或 FLOAT |
DoubleTypeHandler | java.lang.Double, double | 数据库兼容的 NUMERIC 或 DOUBLE |
BigDecimalTypeHandler | java.math.BigDecimal | 数据库兼容的 NUMERIC 或 DECIMAL |
StringTypeHandler | java.lang.String | CHAR, VARCHAR |
ClobReaderTypeHandler | java.io.Reader | - |
ClobTypeHandler | java.lang.String | CLOB, LONGVARCHAR |
NStringTypeHandler | java.lang.String | NVARCHAR, NCHAR |
NClobTypeHandler | java.lang.String | NCLOB |
BlobInputStreamTypeHandler | java.io.InputStream | - |
ByteArrayTypeHandler | byte[] | 数据库兼容的字节流类型 |
BlobTypeHandler | byte[] | BLOB, LONGVARBINARY |
DateTypeHandler | java.util.Date | TIMESTAMP |
DateOnlyTypeHandler | java.util.Date | DATE |
TimeOnlyTypeHandler | java.util.Date | TIME |
SqlTimestampTypeHandler | java.sql.Timestamp | TIMESTAMP |
SqlDateTypeHandler | java.sql.Date | DATE |
SqlTimeTypeHandler | java.sql.Time | TIME |
ObjectTypeHandler | Any | OTHER 或未指定类型 |
EnumTypeHandler | Enumeration Type | VARCHAR-任何兼容的字符串类型,存储枚举的名称(而不是索引) |
EnumOrdinalTypeHandler | Enumeration Type | 任何兼容的 NUMERIC 或 DOUBLE 类型,存储枚举的索引(而不是名称)。 |
Type Handlers for JSR 310: Date and Time API
JDK8,新特性,时间的处理。类型处理器。
<typeHandlers>
<typeHandler handler="org.apache.ibatis.type.InstantTypeHandler" />
<typeHandler handler="org.apache.ibatis.type.LocalDateTimeTypeHandler" />
<typeHandler handler="org.apache.ibatis.type.LocalDateTypeHandler" />
<typeHandler handler="org.apache.ibatis.type.LocalTimeTypeHandler" />
<typeHandler handler="org.apache.ibatis.type.OffsetDateTimeTypeHandler" />
<typeHandler handler="org.apache.ibatis.type.OffsetTimeTypeHandler" />
<typeHandler handler="org.apache.ibatis.type.ZonedDateTimeTypeHandler" />
<typeHandler handler="org.apache.ibatis.type.YearTypeHandler" />
<typeHandler handler="org.apache.ibatis.type.MonthTypeHandler" />
<typeHandler handler="org.apache.ibatis.type.YearMonthTypeHandler" />
<typeHandler handler="org.apache.ibatis.type.JapaneseDateTypeHandler" />
</typeHandlers>
8、mybatis的核心配置之environments
8.1、environments 标签说明
<environments default="development">
<environment id="development">
<transactionManager type="JDBC" />
<dataSource type="POOLED">
<!-- 配置数据库连接信息 -->
<property name="driver" value="${driverClass}" />
<property name="url" value="${url}" />
<property name="username" value="${username}" />
<property name="password" value="${password}" />
</dataSource>
</environment>
</environments>
<environments> 标签可以用来包含多个环境
default 表示默认使用的环境。
一般情况下。在工作的时候。会定义多个环境信息。<environment>
那么定义多个环境有什么用?
比如说:我可以定义一个环境是dev开发环境。可以在自己写代码的时候测试用。连接的是自己的数据库。
又定义一个环境run是实际布暑的数据库连接环境。
那么当我们要发布项目的时候。只需要把default值改为run就好
8.2、transactionManager 标签说明
JDBC (JdbcTransactionFactory) – 这个配置就是直接使用了 JDBC 的提交和回滚设置,它依赖于从数据源得到的连接来管理事务范围。
<transactionManager type="JDBC" />
MANAGED (ManagedTransactionFactory)– 这个配置几乎没做什么。它从来不提交或回滚一个连接,而是让容器来管理事务的整个生命周期(比如 JEE 应用服务器的上下文)。 默认情况下它会关闭连接,然而一些容器并不希望这样,因此需要将 closeConnection 属性设置为 false 来阻止它默认的关闭行为。例如:
<transactionManager type="MANAGED">
<property name="closeConnection" value="false"/>
</transactionManager>
自定义:实现TransactionFactory接口,然后在type=全类名
注意:如果你正在使用 Spring + MyBatis,则没有必要配置事务管理器, 因为 Spring 模块会使用自带的管理器来覆盖前面的配置。
一般情况下,我们都会整合Spring + MyBatis 一起使用。使用的都是Spring的事务管理。
8.3、dataSource 标签说明
<dataSource type="POOLED">
这个标签是配置是否启动数据库连接池配置。
type 属性的值有三种: UNPOOLED 、 POOLED 、 JNDI
UNPOOLED – 这个数据源的实现只是每次被请求时打开和关闭连接。虽然一点慢,它对在及时可用连接方面没有性能要求的简单应用程序是一个很好的选择。 不同的数据库在这方面表现也是不一样的,所以对某些数据库来说使用连接池并不重要,这个配置也是理想的。
POOLED – 这种数据源的实现利用“池”的概念将 JDBC 连接对象组织起来,避免了创建新的连接实例时所必需的初始化和认证时间。 这是一种使得并发 Web 应用快速响应请求的流行处理方式。
JNDI – (Java Naming and Directory Interface) 这个数据源的实现是为了能在如 EJB 或应用服务器这类容器中使用,容器可以集中或在外部配置数据源,然后放置一个 JNDI 上下文的引用。
自定义 - 实现DataSourceFactory接口,定义自己的数据源实现。
注意:一般情况下,我们都全整合Spring + MyBatis 一起使用。所以数据源整合之后都是使用Spring的数据源。
9、mybatis的核心配置之databaseIdProvider
MyBatis 可以根据不同的数据库厂商执行不同的语句,这种多厂商的支持是基于映射语句中的 databaseId 属性。 MyBatis 会加载不带 databaseId 属性和带有匹配当前数据库 databaseId 属性的所有语句。
<databaseIdProvider type="DB_VENDOR">
<property name="SQL Server" value="sqlserver" />
<property name="MySQL" value="mysql" />
<property name="DB2" value="db2" />
<property name="Oracle" value="oracle" />
</databaseIdProvider>
mybatis提供了一个类VendorDatabaseIdProvider,中的getDatabaseId() 方法用于获取数据库的标识。
property 标签name属性是获取数据库ID标识。
property 标签value属性是我们给mybatis定义的一个简短的标识。
9.1、databaseId测试
这样子,我们就可以在mapper的配置文件中,在定义sql语句的时候,添加标识。
<select id="selectUserById" parameterType="int"
resultType="User" databaseId="mysql">
select id , last_name from t_user where id = #{value}
</select>
这样子,当mybaits读取mapper中的sql语句的时候,只会读取和数据库标识对应得上的sql语句。
如果把 databaseId属性改为oracle。而当前的数据库是mysql的话。
<select id="selectUserById" parameterType="int"
resultType="User" databaseId="oracle">
那么 执行selectUserById 语句的时候就会报错。
10、mybatis的核心配置之Mapper
把mapper配置文件注入到mybatis-config.xml核心配置文件中有三种常用方式。
- 在classpath路径下引入
- 使用mapper接口的形式导入配置
- 使用包扫描的方式引入配置文件
<!-- 从classpath路径下导入指定的配置文件 -->
<mappers>
<mapper resource="org/mybatis/builder/AuthorMapper.xml" />
<mapper resource="org/mybatis/builder/BlogMapper.xml" />
<mapper resource="org/mybatis/builder/PostMapper.xml" />
</mappers>
<!-- 使用mapper接口类导入配置文件 -->
<mappers>
<mapper class="org.mybatis.builder.AuthorMapper" />
<mapper class="org.mybatis.builder.BlogMapper" />
<mapper class="org.mybatis.builder.PostMapper" />
</mappers>
<!-- 扫描包下所有的配置文件
1、接口名和Mapper配置文件名必须相同
2、接口文件和Mapper配置文件必须在同一个包下
-->
<mappers>
<package name="org.mybatis.builder" />
</mappers>