欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

Mybatis-详解1

程序员文章站 2022-05-18 10:22:27
...

1mybatis概述

2mybatisHello 示例程序

3、传统方式mybatis的增,删,改,查实现

4Mapper接口方式的mybatis的增,删,改,查实现

5mybatis的核心配置之properties

6mybatis的核心配置之settings

7mybatis的核心配置之typeAliases

8、mybatis的核心配置之environments

9、mybatis的核心配置之databaseIdProvider

10mybatis的核心配置之Mapper


1mybatis概述

1.1mybatis简介

MyBatis 是支持定制化 SQL、存储过程以及高级映射的优秀的持久层框架。

 

MyBatis 避免了几乎所有的 JDBC 代码和手动设置参数以及获取结果集。

 

MyBatis可以使用简单的XML或注解用于配置和原始映射,将接口和JavaPOJOPlain Old Java Objects,普通的Java对象)映射成数据库中的记录.

 

 

1.2mybatis历史

原是apache的一个开源项目iBatis, 20106月这个项目由apache software foundation 迁移到了google code,随着开发团队转投Google Code旗下,ibatis3.x正式更名为Mybatis ,代码于201311月迁移到Github(下载地址见后)。

iBATIS一词来源于“internet”和“abatis”的组合,是一个基于Java的持久层框架。iBATIS提供的持久层框架包括SQL MapsData Access ObjectsDAO

 

 

1.3、为什么要使用mybatis

MyBatis是一个半自动化的持久化层框架。

 

jdbc编程---当我们使用jdbc持久化的时候,sql语句被硬编码到java代码中。这样耦合度太高。代码不易于维护。在实际项目开发中会经常添加sql或者修改sql,这样我们就只能到java代码中去修改。

 

HibernateJPA

长难复杂的SQL,对于Hibernate而言处理也不容易

内部自动生产的SQL,不容易做特殊优化。

基于全映射的全自动框架javaBean存在大量字段时无法只映射部分字段。导致数据库性能下降。

 

对开发人员而言,核心sql还是需要自己优化

sqljava编码分开,功能边界清晰,一个专注业务、一个专注数据。

可以使用简单的XML或注解用于配置和原始映射,将接口和JavaPOJO映射成数据库中的记录。成为业务代码+底层数据库的媒介

 

 

2mybatisHello 示例程序

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开发环境

Mybatis-详解1

需要导入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、传统mybatishello 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.xmlAlt+/会没有提示,只需要按照如下的方式,将鼠标放在对应的xml页面,并windowpreferences,找到对应的文件dtd,导进去就可以了(mybatis-3-config.dtd,mybatis-3-mapper.dtd),下面给出文件,配置mybatis配置文件的提示:

Mybatis-详解1

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>

4Mapper接口方式的mybatis的增,删,改,查实现

4.1Mapper接口编程的命名习惯

一般你的实体bean对象叫 User

你的接口叫 UserMapper

你的配置文件命名,一般也叫 UserMapper.xml

4.2Mapper接口开发有四个开发规范**必须遵守**

1mapper.xml配置文件的名称空间,必须是接口的全类名

2mapper.xml配置文件中sql语句的id定义的值。必须跟方法名一致。

3mapper.xml配置文件,参数类型必须和方法的参数类型一致。

4mapper.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.6Mapper接口的测试:

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();
		}
	}

}

5mybatis的核心配置之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>

6mybatis的核心配置之settings

 

这是 MyBatis 中极为重要的调整设置,它们会改变 MyBatis 的运行时行为。下表描述了设置中各项的意图、默认值等。

6.1、所有mybatissettings设置选项

 

设置参数

描述

有效值

默认值

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

7mybatis的核心配置之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

Mybatis-详解1

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.Booleanboolean

数据库兼容的 BOOLEAN

ByteTypeHandler

java.lang.Bytebyte

数据库兼容的 NUMERIC 或 BYTE

ShortTypeHandler

java.lang.Shortshort

数据库兼容的 NUMERIC 或 SHORT INTEGER

IntegerTypeHandler

java.lang.Integerint

数据库兼容的 NUMERIC 或 INTEGER

LongTypeHandler

java.lang.Longlong

数据库兼容的 NUMERIC 或 LONG INTEGER

FloatTypeHandler

java.lang.Floatfloat

数据库兼容的 NUMERIC 或 FLOAT

DoubleTypeHandler

java.lang.Doubledouble

数据库兼容的 NUMERIC 或 DOUBLE

BigDecimalTypeHandler

java.math.BigDecimal

数据库兼容的 NUMERIC 或 DECIMAL

StringTypeHandler

java.lang.String

CHARVARCHAR

ClobReaderTypeHandler

java.io.Reader

-

ClobTypeHandler

java.lang.String

CLOBLONGVARCHAR

NStringTypeHandler

java.lang.String

NVARCHARNCHAR

NClobTypeHandler

java.lang.String

NCLOB

BlobInputStreamTypeHandler

java.io.InputStream

-

ByteArrayTypeHandler

byte[]

数据库兼容的字节流类型

BlobTypeHandler

byte[]

BLOBLONGVARBINARY

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 类型,存储枚举的索引(而不是名称)。

 

8mybatis的核心配置之environments

8.1environments 标签说明

<!-- environments可以配置多个数据库环境
			default属性表示默认使用哪个环境
	 -->
	<environments default="development">
		<!-- environment可以配置一个数据库环境 
				id	定义这个数据库环境的唯一标识
		 -->
		<environment id="development">

8.2transactionManager 标签说明

 

MyBatis 中有两种类型的事务管理器(也就是 type=”[JDBC|MANAGED]”):

· JDBC – 这个配置就是直接使用了 JDBC 的提交和回滚设置,它依赖于从数据源得到的连接来管理事务范围。

· MANAGED – 这个配置几乎没做什么。它从来不提交或回滚一个连接,而是让容器来管理事务的整个生命周期(比如 JEE 应用服务器的上下文)。 默认情况下它会关闭连接,然而一些容器并不希望这样,因此需要将 closeConnection 属性设置为 false 来阻止它默认的关闭行为。例如:

<transactionManager type="MANAGED">
  <property name="closeConnection" value="false"/>
</transactionManager>

这两种事务管理器类型都不需要任何属性。它们不过是类型别名,换句话说,你可以使用 TransactionFactory 接口的实现类的完全限定名或类型别名代替它们。

8.3dataSource 标签说明

type 属性的值有三种: UNPOOLED  POOLED 。自定义(实现DataSourceFactory接口

 

有三种内建的数据源类型(也就是 type=”[UNPOOLED|POOLED|JNDI]”):

UNPOOLED– 这个数据源的实现只是每次被请求时打开和关闭连接。虽然一点慢,它对在及时可用连接方面没有性能要求的简单应用程序是一个很好的选择。 不同的数据库在这方面表现也是不一样的,所以对某些数据库来说使用连接池并不重要,这个配置也是理想的。UNPOOLED 类型的数据源仅仅需要配置以下

 

POOLED– 这种数据源的实现利用“池”的概念将 JDBC 连接对象组织起来,避免了创建新的连接实例时所必需的初始化和认证时间。 这是一种使得并发 Web 应用快速响应请求的流行处理方式。

 

JNDI-已归入黄土

 

如果需要自定义数据库连接池,需要实现通过需要实现接口 org.apache.ibatis.datasource.DataSourceFactory接口

9mybatis的核心配置之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.1databaseId测试

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

10mybatis的核心配置之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>

其实有四种方式,只不过那种方式是绝对路径,只能在自己服务器中使用,没有了解的必要

两个dtd文件和三个jar包下载


















...