目录
一、mybatis概述
1、mybatis简介
-
MyBatis 是支持定制化 SQL、存储过程以及高级映射的优秀的持久层框架。
-
MyBatis 避免了几乎所有的 JDBC 代码和手动设置参数以及获取结果集。
-
MyBatis可以使用简单的XML或注解用于配置和原始映射,将接口和Java的POJO(Plain Old Java Objects,普通的Java对象)映射成数据库中的记录.
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)
3、为什么要使用mybatis
-
MyBatis是一个半自动化的持久化层框架。
-
jdbc编程—当我们使用jdbc持久化的时候,sql语句被硬编码到java代码中。这样耦合度太高。代码不易于维护。在实际项目开发中会经常添加sql或者修改sql,这样我们就只能到java代码中去修改。
-
Hibernate和JPA
长难复杂SQL,对于Hibernate而言处理也不容易
内部自动生产的SQL,不容易做特殊优化。
基于全映射的全自动框架,javaBean存在大量字段时无法只映射部分字段。导致数据库性能下降。 -
对开发人员而言,核心sql还是需要自己优化
sql和java编码分开,功能边界清晰,一个专注业务、一个专注数据。
可以使用简单的XML或注解用于配置和原始映射,将接口和Java的POJO映射成数据库中的记录。成为业务代码+底层数据库的媒介
二、mybatis的Hello 示例程序
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、搭建mybatis开发环境
2.1、创建一个java工程
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。
3、创建Pojo对象User
public class User {
private int id;
private String lastName;
private int sex;
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类型。可以省略,但是如果 类型是javabean类型的话,一般不推荐省略,方便查看。
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>
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>
6、传统mybatis的hello world 示例代码
import com.atguigu.mybatis.bean.User;
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.Test;
import java.io.IOException;
import java.io.InputStream;
public class TestDemo {
@Test
public void test1() throws IOException {
// 读取mybatis的核心配置文件
InputStream is = Resources.getResourceAsStream("mybaits-config.xml");
// 通过SqlSessionFactoryBuilder创建一个SqlSessionFactory对象
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(is);
// 创建一个sqlSession对象
SqlSession sqlSession = sqlSessionFactory.openSession();
try {
//第一个参数是你要执行的sql 语句(名称空间+id)
//第二个参数 是你要执行sql 的对应参数
User user = sqlSession.selectOne("com.atguigu.mybatis.bean.User.selectUserById", 1);
System.out.println(user);
} finally {
sqlSession.close();
}
}
}
三、传统方式mybatis的增,删,改,查实现
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();
2、编写UserMapper.xml中的配置
2.1、保存用户
<!-- 插入用户
parameterType 属性设置参数类型
id 为使用的标识
-->
<insert id="saveUser" parameterType="com.atguigu.pojo.User">
insert into t_user(last_name,sex) values(#{lastName},#{sex})
</insert>
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>
2.3、根据id删除用户
<!-- 根据id删除用户
parameterType 属性设置参数类型
id 为使用的标识
-->
<delete id="deleteUserById" parameterType="int">
delete from t_user where id = #{id}
</delete>
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>
2.5、搜索全部用户
<!-- 搜索全部用户
id 为使用的标识
resultType 属性是返回的类型
-->
<select id="findUsers" resultType="com.atguigu.pojo.User">
select id,last_name lastName,sex from t_user
</select>
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;
}
}
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() );
}
}
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>
6、 标签的使用
6.1 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>
6.2 selectKey 返回Oracle的序列自增主键
<selectKey order="BEFORE" resultType="int" keyProperty="id">
select 序列名.nextval as id from dual
</selectKey>
四、Mapper接口方式的mybatis的增,删,改,查实现
1、Mapper接口编程的命名习惯
Mapper接口方式的编程,需要先有一个接口。这个接口的命名一般是xxxxMapper。
比如:
User模块的Mapper,接口命名为UserMapper。
Book模块的Mapper,接口命名为BookMapper。
2、Mapper接口开发有四个开发规范必须遵守
- 对应的mapper配置文件的namespace属性值必须是Mapper接口的全类名。
- Mapper接口中的方法名必须与mapper配置文件中对应的id值相同。
- Mapper接口的方法的参数类型必须与mapper配置文件中配置的parameterType类型匹配上
- Mapper接口的方法返回值类型必须与mapper配置文件中配置的resultType 类型匹配上
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、修改原来UserMapper.xml配置文件
修改原来UserMapper.xml配置文件的namespace属性值为刚创建的UserMapper的全类名
<?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.mybaits.mapper.UserMapper">
<!--
select 标签用于定义一个select查询语句
id属性,又称之为statementId
id属性可以给select语句定义一个唯一的标识
parameterType 属性定义参数的类型,int 表示基本的Integer类型
resultType 属性定义返回值的数据类型
-->
<insert id="saveUser" useGeneratedKeys="true" keyProperty="id">
insert into t_user (last_name,sex) values (#{lastName},#{sex});
</insert>
<delete id="deleteUserById">
delete from t_user where id = #{id}
</delete>
<update id="updateUser">
update t_user set last_name = #{lastName} , sex = #{sex} where id = #{id}
</update>
<select id="findUserById" resultType="com.atguigu.mybaits.bean.User">
select id ,last_name lastName , sex from t_user where id = #{id}
</select>
<select id="findUsers" resultType="com.atguigu.mybaits.bean.User">
select id ,last_name lastName , sex from t_user
</select>
</mapper>
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();
}
}
}
五、mybatis的核心配置之properties
1、创建jdbc.properties
一般在实际的项目中。数据库的连接信息。会存放在一个jdbc.properties的属性配置文件中
username=root
password=root
driverClass=com.mysql.jdbc.Driver
url=jdbc:mysql://localhost:3306/mybatis
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标签定义的属性值。
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>
六、mybatis的核心配置之settings
这是 MyBatis 中极为重要的调整设置,它们会改变 MyBatis 的运行时行为。下表描述了设置中各项的意图、默认值等。
1、所有mybatis的settings设置选项
<!-- properties 配置一些属性。使用的时候,用${name} 进行输出
resource指定属性的位置
-->
<properties resource="jdbc.properties">
<!-- 也可以在properties配置中定义一些属性。当然并不推荐 -->
<property name="driverClass" value="driverClass"/>
<property name="url" value="url"/>
<property name="username" value="root"/>
<property name="password" value="root"/>
</properties>
<!-- 开启驼峰 的 自动转换-->
<settings>
<setting name="mapUnderscoreToCameICase" value="true"/>
</settings>
七、mybatis的核心配置之typeAliases
类型别名是为 Java 类型设置一个短的名字。它只和 XML 配置有关,存在的意义仅在于用来减少类完全限定名的冗余。
1.系统提示的预定义别名
已经为许多常见的 Java 类型内建了相应的类型别名。它们都是大小写不敏感的,需要注意的是由基本类型名称重复导致的特殊处理。
2、自定义别名
类别名
<!-- 别名 设置
type 具体类型
alias 别名
-->
<typeAliases>
<typeAlias type="com.atguigu.mybaits.bean.User" alias="user" />
</typeAliases>
包别名
<typeAliases>
<!-- <typeAlias type="com.atguigu.mybaits.bean.User" alias="user" />-->
<!-- package标签设置通过包名来扫描 ,所有的类 。自动的配置上别名
默认的别名是类名 ,而且首字母小写
如 下面 bean 下边的有 User 的实体类。别名为 user.效果 和上面注释类别名的一样
-->
<package name="com.atguigu.mybaits.bean" />
</typeAliases>
包别名 特殊例子
<typeAliases>
<package name="com.atguigu.mybaits.bean" />
<package name="com.atguigu.mybaits.domain" />
</typeAliases>
如上 有两个 包别名。如果 两个包下有相同名的 一个类 :User.运行 会报错。如下图
- 解决 在 domain 的类上 添加 别名注解
package com.atguigu.mybaits.domain ;
import org.apache.ibatis.type.Alias;
@Alias("user2")
public class User {
八、mybatis的核心配置之typeHandlers
无论是Mybatis 在预处理语句(PerpateStatement)中设置 一个参数 是,还是从结果集中取出一个值时,都会用类型处理器将获取的值一合适的方式转换成Java类型,下表描述了一些默认的类型处理器。。
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>
九、mybatis的核心配置之environments
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>
标签可以用来包含多个环境
default 表示默认使用的环境。
一般情况下。在工作的时候。会定义多个环境信息。
那么定义多个环境有什么用?
比如说:我可以定义一个环境是dev开发环境。可以在自己写代码的时候测试用。连接的是自己的数据库。
又定义一个环境run是实际布暑的数据库连接环境。
那么当我们要发布项目的时候。只需要把default值改为run就好
2、transactionManager 标签说明
JDBC (JdbcTransactionFactory) – 这个配置就是直接使用了 JDBC 的提交和回滚设置,它依赖于从数据源得到的连接来管理事务范围。
MANAGED (ManagedTransactionFactory)– 这个配置几乎没做什么。它从来不提交或回滚一个连接,而是让容器来管理事务的整个生命周期(比如 JEE 应用服务器的上下文)。 默认情况下它会关闭连接,然而一些容器并不希望这样,因此需要将 closeConnection 属性设置为 false 来阻止它默认的关闭行为。例如:
自定义:实现TransactionFactory接口,然后在type=全类名
注意
:如果你正在使用 Spring + MyBatis,则没有必要配置事务管理器, 因为 Spring 模块会使用自带的管理器来覆盖前面的配置。
一般情况下,我们都会整合Spring + MyBatis 一起使用。使用的都是Spring的事务管理。
3、dataSource 标签说明
这个标签是配置是否启动数据库连接池配置。
type 属性的值有三种: UNPOOLED 、 POOLED 、 JNDI
- UNPOOLED – 这个数据源的实现只是每次被请求时打开和关闭连接。虽然一点慢,它对在及时可用连接方面没有性能要求的简单应用程序是一个很好的选择。 不同的数据库在这方面表现也是不一样的,所以对某些数据库来说使用连接池并不重要,这个配置也是理想的。
- POOLED – 这种数据源的实现利用“池”的概念将 JDBC 连接对象组织起来,避免了创建新的连接实例时所必需的初始化和认证时间。 这是一种使得并发 Web 应用快速响应请求的流行处理方式。
- JNDI – (Java Naming and Directory Interface) 这个数据源的实现是为了能在如 EJB 或应用服务器这类容器中使用,容器可以集中或在外部配置数据源,然后放置一个 JNDI 上下文的引用。
- 自定义 - 实现DataSourceFactory接口,定义自己的数据源实现。
注意
:一般情况下,我们都全整合Spring + MyBatis 一起使用。所以数据源整合之后都是使用Spring的数据源。
十、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定义的一个简短的标识。
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的话。
那么 执行selectUserById 语句的时候就会报错。
十一、mybatis的核心配置之 mappers
- 把mapper配置文件注入到mybatis-config.xml核心配置文件中有三种常用方式。
1、在classpath路径下引入
2、使用mapper接口的形式导入配置
3、使用包扫描的方式引入配置文件
<mappers>
<!-- 1、在classpath路径下引入
从classpath路径下导入指定的配置文件 -->
<mapper resource="com/atguigu/mybaits/bean/UserMapper.xml" />
<!-- 2、使用mapper接口的形式导入配置,同一个 AuthorMapper AuthorMapper.xml同一个目录下
使用mapper接口类导入配置文件 -->
<mapper class="com.atguigu.mybaits.bean.UserMapper" />
<!-- 3 使用包扫描的方式引入配置文件
扫描包下所有的配置文件
a、接口名和Mapper配置文件名必须相同
b、接口文件和Mapper配置文件必须在同一个包下 -->
<package name="com.atguigu.mybaits.bean" />
</mappers>