Mybatis学习笔记——Mybatis简单介绍

Mybatis的核心组件

  • SqlSessionFactoryBuild(构造器):它会根据配置或者代码来生成SqlSessionFactory,采用的是分布构建Builder模式。
    这部分代码返回一个 SqlSessionFactory对象
  • SQLSessionFactory(工厂接口):依靠他来生成SqlSession,使用的是工厂模式。
  • SqlSession(会话):一个既可以发送SQL执行返回结果,也可以获取Mapper的接口。在现有的技术中,一般我们会让其在业务逻辑代码中“消失”,而使用的是Mybatis提供的SQL Mapper接口编程技术,它能提高代码的可阅性和可维护性。
  • SQL Mapper(映射器):Mybatis新设计存在的组件,它有一个Java接口和XML文件构成(还可以由注解完成,个人用的都是XML),需要给出对应的SQL和映射规则。它赋值发送SQL执行,并返回结果。
  • 运行流程 SqlSessionFactoryBuild(构造器)—>(通过配置或者代码)—>SqlSessionFactory(工厂接口)—>SqlSession(会话)---->(发送SQL语句)—>SQL Mapper(映射器)----->数据库

这里附上代码,来自于书《Java EE互联网轻量型级框架整合开发》
链接:https://pan.baidu.com/s/1X6-NlcybWaXTA0Gl0jVJlw
提取码:zswh

SqlSessionFactory(工厂接口)

在Mybatis中,可以通过xml文件生成SqlSession,也可以通过Java代码形式去生成SqlSessionFactory。

XMl构建SqlSessionFactory

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>
  <typeAliases><!-- 别名 -->
      <typeAlias alias="role" type="com.learn.ssm.chapter3.pojo.Role"/>
  </typeAliases>
  <!-- 数据库环境 -->
  <environments default="development">
    <environment id="development">
      <transactionManager type="JDBC"/>
      <dataSource type="POOLED">
        <property name="driver" value="com.mysql.jdbc.Driver"/>
        <property name="url" value="jdbc:mysql://localhost:3306/chapter3"/>
        <property name="username" value="root"/>
        <property name="password" value="123456"/>
      </dataSource>
    </environment>
  </environments>
  <!-- 映射文件 -->
  <mappers>
    <mapper resource="com/learn/ssm/chapter3/mapper/RoleMapper.xml"/>
    <mapper class="com.learn.ssm.chapter3.mapper.RoleMapper2"/> 
  </mappers>
</configuration>

Mybatis基础配置文件:

  • < typeAlias>元素定义了一个别名role,它代表着com.learn.ssm.chapter3.pojo.Role这个类。定义完以后,可以在Mybatis的上下文使用别名去替代全限定名了。
  • < environment>元素的定义,这里描述的是数据库。它里面的元素是配置事务管理器.
    dataSource元素配置数据库,其中属性type=“POOLED”代表采用Mybatis内部提供了连接池方式。最后定义了一些JDBC的属性信息。
  • < mapper> 元素代表引入的那些映射器

通过读取配置文件mybatis-config.xml然后通过SqLSessionFactoryBuilder的Builder方法去创建SqlSessionFactory。在Mybatis中,采用Builder模式为开发者隐藏了这部分细节,只需重点SqlSessionFactory被创建出来,就好了。

SqlSession

在使用XML配置免去了我们创建SQLSessionFactory,下一步我们去创建SqlSession。我们先去了解一下SqLSession
在Mybatis中,SqlSession是其中核心接口。在Mybatis中有两个实现类,DefaultSqlSession和SqlSessionManager。DefaultSqlSession是单线程使用的,而SqlSessionManager在多线程环境下使用。SqlSession的作用类似于一个JDBC中的Connection对象,代表着一个连接资源的启用,具体功能有3个:

  • 获取Mapper接口
  • 发送SQL给数据库
  • 控制数据库事务

映射器

映射器是Mybatis中最重要、最复杂的组件,它由一个接口对应的XML文件或注解组成。提供以下功能

  • 描述映射规则
  • 提供SQL语句,并可以配置SQL参数类型、返回类型、缓存刷新等信息
  • 配置缓存
  • 提供动态SQL

写一个例子来实现,pojo类 Role

public class Role{
	private Long id;
	private String roleName;
	private String note;
}

使用XML实现映射器

映射器接口:RoleMapper

public interface RoleMaper{
	public int insertRole(Role role);
public int deleteRole(Long id);
public int updateRole(Role role);
public Role getRole(Long id);
public List<Role> findRoles(String roleName);
}

配置XML

<mapper resource="com.sx.Mapper.UserMapper.xml">

实现UserMapper接口,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.learn.ssm.chapter3.mapper.RoleMapper">

	<insert id="insertRole" parameterType="role">
		insert into t_role(role_name, note) values(#{roleName}, #{note})
	</insert>

	<delete id="deleteRole" parameterType="long">
		delete from t_role where id= #{id}
	</delete>

	<update id="updateRole" parameterType="role">
		update t_role set role_name = #{roleName}, note = #{note} where id= #{id}
	</update>

	<select id="getRole" parameterType="long" resultType="role">
		select id,
		role_name as roleName, note from t_role where id = #{id}
	</select>

</mapper>

这样就完成了一个映射器,先看XML属性

  • < mapper >元素中的属性namespace所对应的是一个接口的全限定名,于是Mybatis上下文就可以通它找到相对应的接口。
  • < select >元素表名这是一条查询语句,而属性id标识了这条SQL,属性parameterType="long"说明传递给SQL的是一个long型参数,而resultType=“role”表示了返回的是Role类的对象。而role是之前配置文件mybatis-config.xml配置的别名。
  • 这条SQL语句中的#{id}表示传递进去的参数。

Mybatis基于XML配置文件创建Configuration对象的过程

String resource = "mybatis-config.xml";
InputStream inputStream = Resources.getResourcesAsStream("mybatis-config.xml");
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputstream);
SqlSession sqlSession = sqlSessionFactory.openSession();

1、在这段代码中,SqlSessionFactoryBuild对象先是执行build()
2、根据配置信息创建一个XMLConfigBuilder对象
3、SqlSessionFactoryBuilder调用XMLConfigBuilder对象的parser()方法
4、XMLConfigBuilder对象返回一个Configuration对象
5、SqlSessionFactoryBuilder对象的build(Configuration config)方法返回一个DefaultSqlSessionFactory对象

SqlSessionFactoryBuild代码:

public class SqlSessionFactoryBuilder {
   public SqlSessionFactoryBuilder() {
   }

   public SqlSessionFactory build(Reader reader) {
       return this.build((Reader)reader, (String)null, (Properties)null);
   }

   public SqlSessionFactory build(Reader reader, String environment) {
       return this.build((Reader)reader, environment, (Properties)null);
   }

   public SqlSessionFactory build(Reader reader, Properties properties) {
       return this.build((Reader)reader, (String)null, properties);
   }

   public SqlSessionFactory build(Reader reader, String environment, Properties properties) {
       SqlSessionFactory var5;
       try {
           XMLConfigBuilder parser = new XMLConfigBuilder(reader, environment, properties);
           var5 = this.build(parser.parse());
       } catch (Exception var14) {
           throw ExceptionFactory.wrapException("Error building SqlSession.", var14);
       } finally {
           ErrorContext.instance().reset();

           try {
               reader.close();
           } catch (IOException var13) {
           }

       }

       return var5;
   }

   public SqlSessionFactory build(InputStream inputStream) {
       return this.build((InputStream)inputStream, (String)null, (Properties)null);
   }

   public SqlSessionFactory build(InputStream inputStream, String environment) {
       return this.build((InputStream)inputStream, environment, (Properties)null);
   }

   public SqlSessionFactory build(InputStream inputStream, Properties properties) {
       return this.build((InputStream)inputStream, (String)null, properties);
   }

   public SqlSessionFactory build(InputStream inputStream, String environment, Properties properties) {
       SqlSessionFactory var5;
       try {
           XMLConfigBuilder parser = new XMLConfigBuilder(inputStream, environment, properties);
           var5 = this.build(parser.parse());
       } catch (Exception var14) {
           throw ExceptionFactory.wrapException("Error building SqlSession.", var14);
       } finally {
           ErrorContext.instance().reset();

           try {
               inputStream.close();
           } catch (IOException var13) {
           }

       }

       return var5;
   }

   public SqlSessionFactory build(Configuration config) {
       return new DefaultSqlSessionFactory(config);
   }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值