Mybatis—(核心文件概述,常用配置解析,核心配置文件常用配置,API概述,dao层开发,基于接口代理方式)

Mybatis核心文件概述

  1. MyBatis 的配置文件包含了会深深影响 MyBatis 行为的设置和属性信息。
  2. 配置文档的顶层结构如下:

这里是引用

在这里插入图片描述

MyBatis常用配置解析

  1. environments标签:数据库环境的配置,支持多环境配置

    <!--环境配置-->
    <environments default="development">
        <!--使用MySQL环境-->
        <environment id="development">
            <!--使用JDBC类型事务管理器-->
            <transactionManager type="JDBC"></transactionManager>
            <!--使用连接池-->
            <dataSource type="POOLED">
                <property name="driver" value="${jdbc.driver}"/>
                <property name="url" value="${jdbc.url}"/>
                <property name="username" value="${jdbc.username}"/>
                <property name="password" value="${jdbc.password}"/>
            </dataSource>
        </environment>
    </environments>
    
    1. 事务管理器(transactionManager)类型有两种:
      1. JDBC:这个配置就是直接使用了JDBC 的提交和回滚设置,它依赖于从数据源得到的连接来管理事务作用域。
      2. MANAGED:这个配置几乎没做什么。它从来不提交或回滚一个连接,而是让容器来管理事务的整个生命周期。
    2. 数据源(dataSource)常用类型有三种:
      1. UNPOOLED:这个数据源的实现只是每次被请求时打开和关闭连接。
      2. POOLED:这种数据源的实现利用“池”的概念将 JDBC 连接对象组织起来。
      3. JNDI :这个数据源实现是为了能在如 EJB 或应用服务器这类容器中使用,容器可以集中或在外部配置数据源,然后放置一个 JNDI 上下文的数据源引用
  2. properties标签:通常将数据源的配置信息单独抽取成一个properties文件,该标签可以加载额外配置的properties:

    jdbc.driver=com.mysql.jdbc.Driver
    jdbc.url=jdbc:mysql:///数据库名
    jdbc.username=用户名
    jdbc.password=密码
    
  3. typeAliases标签:使用typeAliases标签可以为使用别名。

    <!--设置别名-->
    <typeAliases>
        <!--方式一:给单个实体起别名-->
        <!-- <typeAlias type="com.code.entity.User" alias="user"></typeAlias>-->
        <!--方式二:批量起别名 别名就是类名,且不区分大小写-->
        <package name="com.code.entity"/>
    </typeAliases>
    
  4. mappers标签:该标签的作用是加载映射的,加载方式有如下几种:

1. 使用相对于类路径的资源引用,例如:
<mappers>
   <mapper resource="mapper/UserMapper.xml"></mapper>
</mappers>
2. 使用完全限定资源定位符(URL),例如:
<mapper url="file:///var/mappers/userMapper.xml"/>

Mybatis核心配置文件常用配置

  1. properties标签:该标签可以加载外部的properties文件

    <properties resource="jdbc.properties"></properties>
    
  2. typeAliases标签:设置类型别名

    <typeAlias type="com.lagou.domain.User" alias="user"></typeAlias>
    
  3. mappers标签:加载映射配置

    <mapper resource="com/lagou/mapper/UserMapping.xml"></mapper>
    
  4. environments标签:数据源环境配置

<environments default="development">
	<environment id="development">
		<transactionManager type="JDBC"/>
		<dataSource type="POOLED">
			<property name="driver" value="${jdbc.driver}"/>
			<property name="url" value="${jdbc.url}"/>
			<property name="username" value="${jdbc.username}"/>
			<property name="password" value="${jdbc.password}"/>
		</dataSource>
	</environment>
</environments>

MybatisAPI概述

SqlSession工厂构建器SqlSessionFactoryBuilder

  1. 常用API:SqlSessionFactory build(InputStream inputStream),通过加载mybatis的核心文件的输入流的形式构建一个SqlSessionFactory对象

    // 加载核心配置文件
    InputStream resourceAsStream = Resources.getResourceAsStream("SqlMapConfig.xml");
    // 获取SqlSessionFactory工厂对象
    SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(resourceAsStream);
    // 获取SqlSession会话对象
    SqlSession sqlSession = sqlSessionFactory.openSession();
    
  2. Resources 工具类,这个类在 org.apache.ibatis.io 包中。Resources 类可以从类路径下、文件系统或一个 web URL 中加载资源文件。

SqlSession工厂对象SqlSessionFactory

  1. SqlSessionFactory 有多个个方法创建SqlSession 实例。常用的有如下两个:
方法描述
openSession()会默认开启一个事务,但是事务不会自动提交,需要手动提交该事务,提交后,数据操作才会持久化到数据库中
openSession(boolean autoCommit)参数为是否自动提交,如果设置为true,那么不需要手动提交事务

SqlSession会话对象

  1. SqlSession 实例在 MyBatis 中是非常强大的一个类。在这里可以看到所有执行语句、提交或回滚事务和获取映射器实例的方法。

  2. 执行语句的方法主要有:

    <T> T selectOne(String statement, Object parameter)
    <E> List<E> selectList(String statement, Object parameter)
    int insert(String statement, Object parameter)
    int update(String statement, Object parameter)
    int delete(String statement, Object parameter)
    
  3. 操作事务的方法主要有:

    void commit()
    void rollback()
    

Mybatis的dao层开发

传统开发方式

  1. UserMapper接口

    public interface UserMapper {
    	// 查询所有用户信息
    	public List<User> findAll() throws Exception;
    }
    
  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">
    <mapper namespace="UserMapper">
    	<!--查询所有-->
    	<select id="findAll" resultType="user">
    		select * from user
    	</select>
    </mapper>
    
  3. UserMapper实现

    public class UserMapperImpl implements UserMapper {
    	@Override
    	public List<User> findAll() throws Exception {
    		// 加载配置文件
    		InputStream is = Resources.getResourceAsStream("SqlMapConfig.xml");
    		// 获取SqlSessionFactory工厂对象
    		SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(is);
    		// 获取SqlSe会话对象
    		SqlSession sqlSession = sqlSessionFactory.openSession();
    		// 执行sql
    		List<User> list = sqlSession.selectList("UserMapper.findAll");
    		// 释放资源
    		sqlSession.close();
    		return list;
    	}
    }
    

代理开发方式

  1. 采用 Mybatis 的基于接口代理方式实现 持久层 的开发

  2. 基于接口代理方式只需要编写 Mapper 接口,Mybatis 框架会为我们动态生成实现类的对象。
    在这里插入图片描述

  3. 基于接口代理方式要求遵循一定的规范:

    1. Mapper.xml映射文件中的namespace与mapper接口的全限定名相同
    2. Mapper接口方法名和Mapper.xml映射文件中定义的每个statement的id相同
    3. Mapper接口方法的输入参数类型和mapper.xml映射文件中定义的每个sql的parameterType的类型相同
    4. Mapper接口方法的输出参数类型和mapper.xml映射文件中定义的每个sql的resultType的类型相同
  4. Mapper 接口开发方法只需要编写Mapper 接口(相当于Dao 接口),由Mybatis 框架根据接口
    定义创建接口的动态代理对象,代理对象的方法体同上边Dao接口实现类方法。

UserMapper接口

public interface UserMapper {
	public List<User> findAll() throws Exception;
}

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">
<mapper namespace="com.code.mapper.UserMapper">
	<!--查询所有-->
	<select id="findAll" resultType="user">
		select * from user
	</select>
</mapper>

测试类

@Test
public void testFindAll() throws Exception {
	// 加载核心配置文件
	InputStream is = Resources.getResourceAsStream("SqlMapConfig.xml");
	// 获得SqlSessionFactory工厂对象
	SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(is);
	// 获得SqlSession会话对象
	SqlSession sqlSession = sqlSessionFactory.openSession();
	// 获得Mapper代理对象
	UserMapper userMapper = sqlSession.getMapper(UserMapper.class);
	// 执行查询
	List<User> list = userMapper.findAll();
	for (User user : list) {
		System.out.println(user);
	}
	// 释放资源
	sqlSession.close();
}

Mybatis基于接口代理方式的内部执行原理

  1. 持久层现在只有一个接口,而接口是不实际干活的,通过Mybatis通过追踪源码可知,我们使用的mapper实际上是一个代理对象,是由MapperProxy代理产生的。在这里插入图片描述
  2. 追踪MapperProxy的invoke方法会发现,其最终调用了mapperMethod.execute(sqlSession, args)在这里插入图片描述
  3. 进入execute方法会发现,最终工作的还是sqlSession

在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值