Mybatis-详解1
1、mybatis概述
2、mybatis的Hello 示例程序
3、传统方式mybatis的增,删,改,查实现
4、Mapper接口方式的mybatis的增,删,改,查实现
5、mybatis的核心配置之properties
6、mybatis的核心配置之settings
7、mybatis的核心配置之typeAliases
8、mybatis的核心配置之environments
9、mybatis的核心配置之databaseIdProvider
10、mybatis的核心配置之Mapper
1、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('mxx',1);
select * from t_user;
2.2、搭建mybatis开发环境
需要导入jar包:
log4j-1.2.17.jar
mybatis-3.4.1.jar
mysql-connector-java-5.1.7-bin.jar
添加配置文件:
mybatis-config.xml
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
2.3、创建Pojo对象User
public class User {
private int id;
private String lastName;
private int sex;
2.4、在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 default="development">
<environment id="development">
<transactionManager type="JDBC" />
<!-- dataSource 数据源
POOLED 表示使用数据库连接池
-->
<dataSource type="POOLED">
<property name="driver" value="com.mysql.jdbc.Driver" />
<property name="url" value="jdbc:mysql://localhost:3306/mybatis" />
<property name="username" value="root" />
<property name="password" value="root" />
</dataSource>
</environment>
</environments>
<!-- 引入sql语句对应的配置文件 -->
<mappers>
<mapper resource="com/tcent/pojo/UserMapper.xml" />
</mappers>
</configuration>
2.5、创建UserMapper.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 属性一般情况下。
一种定义规则:
一种是使用对应的javaBean的全类名
一种是使用Mapper接口的全类名
-->
<mapper namespace="com.tcent.pojo.User">
<!--
select 定义select查询语句
id 给你要定义的sql语句,设置一个唯一的id值。
resultType 查询完返回的类型
#{id} 这是一个占位符
-->
<select id="selectUserById" resultType="com.tcent.pojo.User">
select id,last_name lastName,sex from t_user where id = #{id}
</select>
</mapper>
2.6、传统mybatis的hello world 示例代码
@Test
public void testQueryUserById() throws IOException {
// 读取mybatis的核心配置文件
InputStream is = Resources.getResourceAsStream("mybatis-config.xml");
// 通过SqlSessionFactoryBuilder创建一个SqlSessionFactory实例(只有一个实例)
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(is);
is.close();
// session相当于Connection对象
SqlSession session = sqlSessionFactory.openSession();
try {
// selectOne 执行select查询语句,返回一个对象
// sql语句是由 namespance+"."+select标签的id值
User user = session.selectOne("com.tcent.pojo.User.selectUserById", 1);
System.out.println( user );
} catch (Exception e) {
e.printStackTrace();
} finally {
session.close();
}
}
在mapper.xml中和核心配置文件中mybatis-config.xml中Alt+/会没有提示,只需要按照如下的方式,将鼠标放在对应的xml页面,并window下preferences,找到对应的文件dtd,导进去就可以了(mybatis-3-config.dtd,mybatis-3-mapper.dtd),下面给出文件,配置mybatis配置文件的提示:
3、传统方式mybatis的增,删,改,查实现
3.2、编写UserMapper.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 属性一般情况下。
一种定义规则:
一种是使用对应的javaBean的全类名
一种是使用Mapper接口的全类名
-->
<mapper namespace="com.tcent.pojo.User">
<!--
select 定义select查询语句
id 给你要定义的sql语句,设置一个唯一的id值。
resultType 查询完返回的类型
#{id} 这是一个占位符
-->
<select id="selectUserById" resultType="com.tcent.pojo.User">
select id,last_name lastName,sex from t_user where id = #{id}
</select>
<!--
id 定义一个唯一标识
resultType 定义查询返回的类型
-->
<select id="queryUsers" resultType="com.tcent.pojo.User">
select id,last_name lastName,sex from t_user
</select>
<!--
delete标签定义delete语句
parameterType 设置参数的类型(可选)
-->
<delete id="deleteUserById" parameterType="int">
delete from t_user where id = #{id}
</delete>
<!--
update标签定义一个update语句
-->
<update id="updateUser" parameterType="com.tcent.pojo.User">
update t_user set last_name = #{lastName},sex = #{sex} where id = #{id}
</update>
<!--
insert标签定义insert语句
-->
<insert id="saveUser" parameterType="com.tcent.pojo.User">
insert into t_user(`last_name`,`sex`) values(#{lastName},#{sex})
</insert>
</mapper>
3.2.1、保存用户
@Override
public int saveUser(User user) {
SqlSession session = sqlSessionFactory.openSession();
try {
// 执行插入
int result = session.insert("com.tcent.pojo.User.saveUser", user);
session.commit();
return result;
} catch (Exception e) {
e.printStackTrace();
} finally {
session.close();
}
return 0;
}
<!--
insert标签定义insert语句
-->
<insert id="saveUser" parameterType="com.tcent.pojo.User">
insert into t_user(`last_name`,`sex`) values(#{lastName},#{sex})
</insert>
3.2.2、更新用户
@Override
public int updateUser(User user) {
SqlSession session = sqlSessionFactory.openSession();
try {
int result = session.update("com.tcent.pojo.User.updateUser", user);
session.commit();
return result;
} catch (Exception e) {
e.printStackTrace();
} finally {
session.close();
}
return 0;
}
<!--
update标签定义一个update语句
-->
<update id="updateUser" parameterType="com.tcent.pojo.User">
update t_user set last_name = #{lastName},sex = #{sex} where id = #{id}
</update>
3.2.3、根据id删除用户
@Override
public int deleteUserById(int id) {
SqlSession session = sqlSessionFactory.openSession();
try {
int result = session.delete("com.tcent.pojo.User.deleteUserById", id);
session.commit();
return result;
} catch (Exception e) {
e.printStackTrace();
} finally {
session.close();
}
return 0;
}
<!--
delete标签定义delete语句
parameterType 设置参数的类型(可选)
-->
<delete id="deleteUserById" parameterType="int">
delete from t_user where id = #{id}
</delete>
3.2.4、根据id搜索用户
@Override
public User queryUserById(int id) {
SqlSession session = sqlSessionFactory.openSession();
try {
return session
.selectOne("com.tcent.pojo.User.selectUserById", id);
} catch (Exception e) {
e.printStackTrace();
} finally {
session.close();
}
return null;
}
<!--
select 定义select查询语句
id 给你要定义的sql语句,设置一个唯一的id值。
resultType 查询完返回的类型
#{id} 这是一个占位符
-->
<select id="selectUserById" resultType="com.tcent.pojo.User">
select id,last_name lastName,sex from t_user where id = #{id}
</select>
3.2.5、搜索全部用户
@Override
public List<User> queryUsers() {
SqlSession session = sqlSessionFactory.openSession();
try {
return session.selectList("com.tcent.pojo.User.queryUsers");
} catch (Exception e) {
e.printStackTrace();
} finally {
session.close();
}
return null;
}
<!--
id 定义一个唯一标识
resultType 定义查询返回的类型
-->
<select id="queryUsers" resultType="com.tcent.pojo.User">
select id,last_name lastName,sex from t_user
</select>
3.3、实现UserDao接口
public class UserDaoImpl implements UserDao {
private SqlSessionFactory sqlSessionFactory;
public UserDaoImpl(SqlSessionFactory sqlSessionFactory) {
super();
this.sqlSessionFactory = sqlSessionFactory;
}
public void setSqlSessionFactory(SqlSessionFactory sqlSessionFactory) {
this.sqlSessionFactory = sqlSessionFactory;
}
@Override
public int saveUser(User user) {
SqlSession session = sqlSessionFactory.openSession();
try {
// 执行插入
int result = session.insert("com.tcent.pojo.User.saveUser", user);
session.commit();
return result;
} catch (Exception e) {
e.printStackTrace();
} finally {
session.close();
}
return 0;
}
@Override
public User queryUserById(int id) {
SqlSession session = sqlSessionFactory.openSession();
try {
return session
.selectOne("com.tcent.pojo.User.selectUserById", id);
} catch (Exception e) {
e.printStackTrace();
} finally {
session.close();
}
return null;
}
@Override
public List<User> queryUsers() {
SqlSession session = sqlSessionFactory.openSession();
try {
return session.selectList("com.tcent.pojo.User.queryUsers");
} catch (Exception e) {
e.printStackTrace();
} finally {
session.close();
}
return null;
}
@Override
public int deleteUserById(int id) {
SqlSession session = sqlSessionFactory.openSession();
try {
int result = session.delete("com.tcent.pojo.User.deleteUserById", id);
session.commit();
return result;
} catch (Exception e) {
e.printStackTrace();
} finally {
session.close();
}
return 0;
}
@Override
public int updateUser(User user) {
SqlSession session = sqlSessionFactory.openSession();
try {
int result = session.update("com.tcent.pojo.User.updateUser", user);
session.commit();
return result;
} catch (Exception e) {
e.printStackTrace();
} finally {
session.close();
}
return 0;
}
}
3.4、编写UserDao测试
public class UserDaoTest {
@Test
public void testSaveUser() throws IOException {
// 读取mybatis的核心配置文件
InputStream is = Resources.getResourceAsStream("mybatis-config.xml");
// 通过SqlSessionFactoryBuilder创建一个SqlSessionFactory实例(只有一个实例)
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder()
.build(is);
is.close();
UserDao userDao = new UserDaoImpl(sqlSessionFactory);
userDao.saveUser(new User(0, "aaaaa", 1));
}
@Test
public void testQueryUserById() throws IOException {
// 读取mybatis的核心配置文件
InputStream is = Resources.getResourceAsStream("mybatis-config.xml");
// 通过SqlSessionFactoryBuilder创建一个SqlSessionFactory实例(只有一个实例)
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder()
.build(is);
is.close();
UserDao userDao = new UserDaoImpl(sqlSessionFactory);
User user = userDao.queryUserById(1);
System.out.println( user );
}
@Test
public void testQueryUsers() throws IOException {
// 读取mybatis的核心配置文件
InputStream is = Resources.getResourceAsStream("mybatis-config.xml");
// 通过SqlSessionFactoryBuilder创建一个SqlSessionFactory实例(只有一个实例)
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder()
.build(is);
is.close();
UserDao userDao = new UserDaoImpl(sqlSessionFactory);
System.out.println( userDao.queryUsers() );
}
@Test
public void testDeleteUserById() throws IOException {
// 读取mybatis的核心配置文件
InputStream is = Resources.getResourceAsStream("mybatis-config.xml");
// 通过SqlSessionFactoryBuilder创建一个SqlSessionFactory实例(只有一个实例)
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder()
.build(is);
is.close();
UserDao userDao = new UserDaoImpl(sqlSessionFactory);
userDao.deleteUserById(3);
}
@Test
public void testUpdateUser() throws IOException {
// 读取mybatis的核心配置文件
InputStream is = Resources.getResourceAsStream("mybatis-config.xml");
// 通过SqlSessionFactoryBuilder创建一个SqlSessionFactory实例(只有一个实例)
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder()
.build(is);
is.close();
UserDao userDao = new UserDaoImpl(sqlSessionFactory);
userDao.updateUser(new User(3, "bbbbb", 0));
}
}
3.5、插入记录并返回主键
<!--
insert标签定义insert语句
useGeneratedKeys="true" 表示插入之后返回数据库生成的主键id值。
keyProperty="id" 表示把返回的数据库的id值,注入到 bean对象的哪个属性中(id属性)
-->
<insert id="saveUser" useGeneratedKeys="true" keyProperty="id" parameterType="com.tcent.pojo.User">
insert into t_user(`last_name`,`sex`) values(#{lastName},#{sex})
</insert>
3.6、<selectKey> 标签的使用
selectKey标签可以用来定义sql语句,在其他语句之前或之后执行。
<insert id="saveUser" parameterType="com.tcent.pojo.User">
<!-- selectKey 标签定义sql语句,在父标签sql的前后或后面执行。
order 属性设置selectKey语句执行的顺序
BEFORE 之前
AFTER 之后
keyProperty="id" 属性设置返回的主键值注入到bean对象的id属性中
-->
<selectKey order="AFTER" keyProperty="id" resultType="int">
SELECT LAST_INSERT_ID()
</selectKey>
insert into t_user(`last_name`,`sex`) values(#{lastName},#{sex})
</insert>
4、Mapper接口方式的mybatis的增,删,改,查实现
4.1、Mapper接口编程的命名习惯
一般你的实体bean对象叫 User,
你的接口叫 UserMapper
你的配置文件命名,一般也叫 UserMapper.xml
4.2、Mapper接口开发有四个开发规范**必须遵守**
1、mapper.xml配置文件的名称空间,必须是接口的全类名
2、mapper.xml配置文件中sql语句的id定义的值。必须跟方法名一致。
3、mapper.xml配置文件,参数类型必须和方法的参数类型一致。
4、mapper.xml配置文件,返回类型必须与接口方法的返回值类型一致。
4.3、编写Mapper接口
public interface UserMapper {
public int saveUser(User user);
public User queryUserById(int id);
public List<User> queryUsers();
public int deleteUserById(int id);
public int updateUser(User user);
}
4.5、编写UserMapper.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 属性一般情况下。
一种定义规则:
一种是使用对应的javaBean的全类名
一种是使用Mapper接口的全类名
-->
<mapper namespace="com.tcent.dao.UserMapper">
<!--
select 定义select查询语句
id 给你要定义的sql语句,设置一个唯一的id值。
resultType 查询完返回的类型
#{id} 这是一个占位符
-->
<!--
使用Mapper接口的方式需要遵守四个规范:
1、mapper配置文件名称空间值必须是mapper接口的全类名
2、id的值必须和方法名一致。
3、参数类型必须一致。
4、返回值的类型也必须一致。
-->
<select id="queryUserById" parameterType="int" resultType="com.tcent.pojo.User">
select id,last_name,sex from t_user where id = #{id}
</select>
<!--
id 定义一个唯一标识
resultType 定义查询返回的类型
-->
<select id="queryUsers" resultType="com.tcent.pojo.User">
select id,last_name lastName,sex from t_user
</select>
<!--
delete标签定义delete语句
parameterType 设置参数的类型(可选)
-->
<delete id="deleteUserById" parameterType="int">
delete from t_user where id = #{id}
</delete>
<!--
update标签定义一个update语句
-->
<update id="updateUser" parameterType="com.tcent.pojo.User">
update t_user set last_name = #{lastName},sex = #{sex} where id = #{id}
</update>
<!--
insert标签定义insert语句
useGeneratedKeys="true" 表示插入之后返回数据库生成的主键id值。
keyProperty="id" 表示把返回的数据库的id值,注入到 bean对象的哪个属性中(id属性)
-->
<!-- <insert id="saveUser" useGeneratedKeys="true" keyProperty="id" parameterType="com.tcent.pojo.User"> -->
<!-- insert into t_user(`last_name`,`sex`) values(#{lastName},#{sex}) -->
<!-- </insert> -->
<insert id="saveUser" parameterType="com.tcent.pojo.User">
<!-- selectKey 标签定义sql语句,在父标签sql的前后或后面执行。
order 属性设置selectKey语句执行的顺序
BEFORE 之前
AFTER 之后
keyProperty="id" 属性设置 返回的主键值 注入到bean对象的id属性中
-->
<selectKey order="AFTER" keyProperty="id" resultType="int">
SELECT LAST_INSERT_ID()
</selectKey>
insert into t_user(`last_name`,`sex`) values(#{lastName},#{sex})
</insert>
</mapper>
4.6、Mapper接口的测试:
public class UserMapperTest {
@Test
public void testSaveUser() throws IOException {
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder()
.build(Resources.getResourceAsStream("mybatis-config.xml"));
// 创建Session对象
SqlSession session = sqlSessionFactory.openSession();
try {
// 从Session中获取到UserMapper实例类
UserMapper userMapper = session.getMapper(UserMapper.class);
User user = new User(0, "bbbb32222", 0);
userMapper.saveUser(user);
System.out.println(user);
session.commit();
} catch (Exception e) {
e.printStackTrace();
} finally {
session.close();
}
}
@Test
public void testQueryUserById() throws IOException {
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder()
.build(Resources.getResourceAsStream("mybatis-config.xml"));
// 创建Session对象
SqlSession session = sqlSessionFactory.openSession();
try {
// 从Session中获取一上UserMapper实例类
UserMapper userMapper = session.getMapper(UserMapper.class);
User user = userMapper.queryUserById(1);
System.out.println(user);
} catch (Exception e) {
e.printStackTrace();
} finally {
session.close();
}
}
@Test
public void testQueryUsers() throws IOException {
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder()
.build(Resources.getResourceAsStream("mybatis-config.xml"));
// 创建Session对象
SqlSession session = sqlSessionFactory.openSession();
try {
// 从Session中获取一上UserMapper实例类
UserMapper userMapper = session.getMapper(UserMapper.class);
List<User> users = userMapper.queryUsers();
System.out.println(users);
} catch (Exception e) {
e.printStackTrace();
} finally {
session.close();
}
}
@Test
public void testDeleteUserById() throws IOException {
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder()
.build(Resources.getResourceAsStream("mybatis-config.xml"));
SqlSession session = sqlSessionFactory.openSession();
try {
UserMapper userMapper = session.getMapper(UserMapper.class);
userMapper.deleteUserById(7);
session.commit();
} catch (Exception e) {
e.printStackTrace();
} finally {
session.close();
}
}
@Test
public void testUpdateUser() throws IOException {
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder()
.build(Resources.getResourceAsStream("mybatis-config.xml"));
// 创建Session对象
SqlSession session = sqlSessionFactory.openSession();
try {
// 从Session中获取一上UserMapper实例类
UserMapper userMapper = session.getMapper(UserMapper.class);
User user = new User(7, "aaaa2222", 0);
userMapper.updateUser(user);
session.commit();
} catch (Exception e) {
e.printStackTrace();
} finally {
session.close();
}
}
}
5、mybatis的核心配置之properties
mybatis-config.xml配置文件
需要有一个单独的jdbc.properties属性配置文件:
username=root
password=root
url=jdbc:mysql://localhost:3306/mybatis
driver=com.mysql.jdbc.Driver
<!-- properties 可以配置键值对经常配置jdbc四个连接属性
properties标签主要是用来引入单独的属性配置文件(主要是jdbc属性配置文件)。
如果properties标签中定义的键值对和引入的属性配置文件的键名相同,引入属性值就会覆盖掉子标签propery中定义的值
-->
<properties resource="jdbc.properties">
<property name="username" value="root"/>
<property name="password" value="root"/>
<property name="url" value="jdbc:mysql://localhost:3306/mybatis1234121"/>
<property name="driver" value="com.mysql.jdbc.Driver"/>
</properties>
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: Do nothing · WARNING: Output warning log (The log level of'org.apache.ibatis.session.AutoMappingUnknownColumnBehavior'must be set to WARN) · FAILING: Fail mapping (Throw SqlSessionException) |
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 配置有关,存在的意义仅在于用来减少类完全限定名的冗余。
①、
<typeAliases>
<!-- typeAlias标签一个一个别名去注册 -->
<!-- <typeAlias type="com.tcent.pojo.User" alias="User"/> -->
</typeAliases>
<!-- 定义了一个别名,以后User在配置文件就表示com.tcent.pojo.User类型
一般别名,就使用类名。在使用的时候,首字母可以大小都可以
-->
②、
//当一个项目很大,指定包下由几十个类,不可能一个个取别名,这里就用到包别名,即直接引用该包下的类名即可
<typeAliases>
<!-- 自动搜索指定包下的所有类,注册别名。那么别名默认是类名。首字母小写 -->
<package name="com.tcent.pojo"/>
<package name="com.tcent.pojo.a"/>
</typeAliases>
如果别名有冲突。使用注解,如上面两个包冲突 @Alias
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 |
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 类型,存储枚举的索引(而不是名称)。 |
8、mybatis的核心配置之environments
8.1、environments 标签说明
<!-- environments可以配置多个数据库环境
default属性表示默认使用哪个环境
-->
<environments default="development">
<!-- environment可以配置一个数据库环境
id 定义这个数据库环境的唯一标识
-->
<environment id="development">
8.2、transactionManager 标签说明
在 MyBatis 中有两种类型的事务管理器(也就是 type=”[JDBC|MANAGED]”):
· JDBC – 这个配置就是直接使用了 JDBC 的提交和回滚设置,它依赖于从数据源得到的连接来管理事务范围。
· MANAGED – 这个配置几乎没做什么。它从来不提交或回滚一个连接,而是让容器来管理事务的整个生命周期(比如 JEE 应用服务器的上下文)。 默认情况下它会关闭连接,然而一些容器并不希望这样,因此需要将 closeConnection 属性设置为 false 来阻止它默认的关闭行为。例如:
<transactionManager type="MANAGED">
<property name="closeConnection" value="false"/>
</transactionManager>
这两种事务管理器类型都不需要任何属性。它们不过是类型别名,换句话说,你可以使用 TransactionFactory 接口的实现类的完全限定名或类型别名代替它们。
8.3、dataSource 标签说明
type 属性的值有三种: UNPOOLED 、 POOLED 。自定义(实现DataSourceFactory接口)
有三种内建的数据源类型(也就是 type=”[UNPOOLED|POOLED|JNDI]”):
UNPOOLED– 这个数据源的实现只是每次被请求时打开和关闭连接。虽然一点慢,它对在及时可用连接方面没有性能要求的简单应用程序是一个很好的选择。 不同的数据库在这方面表现也是不一样的,所以对某些数据库来说使用连接池并不重要,这个配置也是理想的。UNPOOLED 类型的数据源仅仅需要配置以下
POOLED– 这种数据源的实现利用“池”的概念将 JDBC 连接对象组织起来,避免了创建新的连接实例时所必需的初始化和认证时间。 这是一种使得并发 Web 应用快速响应请求的流行处理方式。
JNDI-已归入黄土
如果需要自定义数据库连接池,需要实现通过需要实现接口 org.apache.ibatis.datasource.DataSourceFactory接口
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测试
<select id="queryUserById" parameterType="int" resultType="user">
select id,last_name,sex from t_user where id = #{id}
</select>
<select id="queryUserById" parameterType="int" resultType="user" databaseId="mysql">
select id,last_name,sex from t_user where id = #{id} and 1 = 1
</select>
<select id="queryUserById" parameterType="int" resultType="user" databaseId="oracle">
select id,last_name,sex from t_user where id = #{id}
</select>
10、mybatis的核心配置之Mapper
<!-- 一个一个mapper配置文件引入 -->
<mappers>
<mapper resource="org/mybatis/builder/AuthorMapper.xml"/>
<mapper resource="org/mybatis/builder/BlogMapper.xml"/>
<mapper resource="org/mybatis/builder/PostMapper.xml"/>
</mappers>
<!-- 使用接口类名搜索配置文件 -->
<mappers>
<mapper class="org.mybatis.builder.AuthorMapper"/>
<mapper class="org.mybatis.builder.BlogMapper"/>
<mapper class="org.mybatis.builder.PostMapper"/>
</mappers>
<!-- 按照指定的包名去搜索,所有mapper配置文件
注意:
1、你的接口名和mapper配置文件名,必须一致
2、你的mapper接口和mapper配置文件必须在同一个包下
-->
<mappers>
<package name="org.mybatis.builder"/>
</mappers>
其实有四种方式,只不过那种方式是绝对路径,只能在自己服务器中使用,没有了解的必要
...