百木园-与人分享,
就是让自己快乐。

MyBatis(一)-入门

==>>MyBatis中文网

1、第一个 mybastis程序

1.1 导入jar包

<mybatis.version>3.4.1</mybatis.version>
<mysql.version>5.1.47</mysql.version>

<!--  mybatis  begin -->
<dependency>
    <groupId>org.mybatis</groupId>
    <artifactId>mybatis</artifactId>
    <version>${mybatis.version}</version>
</dependency>
<!--  mybatis  end -->
<!--  mysql  begin -->
<dependency>
    <groupId>mysql</groupId>
    <artifactId>mysql-connector-java</artifactId>
    <version>${mysql.version}</version>
</dependency>
<!--  mysql  end -->

1.2 jdcb.properties

driver=com.mysql.jdbc.Driver
url=jdbc:mysql://localhost:3306/animedb?useUnicode=true&characterEncoding=utf8&useSSL=false&serverTimezone=GMT%2b8
username=root
password=root

1.3 mybatis-config.xml

数据配置信息可以直接在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>
    <!-- 外部引入的数据库配置文件 -->
    <properties resource=\"jdbc.properties\"></properties>

    <typeAliases>
        <!-- 给所有的实体类 批量取别名 -->
        <package name=\"com.kgc.mybatis.bean\"/>
    </typeAliases>

    <!-- 是指数据库配置环境,可以直接写值也可以引入外部配置文件 -->
    <environments default=\"development\">
        <environment id=\"development\">
            <transactionManager type=\"JDBC\"/>
            <dataSource type=\"POOLED\">
                <property name=\"driver\" value=\"${driver}\"/>
                <property name=\"url\" value=\"${url}\"/>
                <property name=\"username\" value=\"${username}\"/>
                <property name=\"password\" value=\"${password}\"/>
            </dataSource>
        </environment>
    </environments>

    <mappers>
        <package name=\"com.kgc.mybatis.mapper\"/>
    </mappers>

</configuration>

1.4 xxxMapper.xml

SQL映射文件;

<?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\">
<!--
SQl语句映射文件:
   namespace :名称空间
      1.单独使用SqlSession的方法,可以随意的定义,仅限于全限定名的方式,指定sql语句唯一标识字符串使用
      2.再面向接口开发时,不可以随便写了,必须时某个接口的全类名(全路径名:包名+类名)
 -->
<!-- <mapper namespace=\"huayu\">  随意定义命名空间  -->    
<mapper namespace=\"com.kgc.mybatis.mapper.AnimeMapper\">  <!-- 接口开发 -->
    
 <!--
    select标签:查询标签
    id属性:select标签的唯一标识,再面向开发时,对应的时namespace指定接口的某个方法名
    resultType 属性: 返回值类型
    #{id} :获取调用接口,获取参数值
-->
  <select id=\"selectAnime\" parameterType=\"int\" resultType=\"com.kgc.mybatis.bean.Anime\">
    select * from animes where id = #{id}
  </select>
    
</mapper>

1.5 获取 SqlSession 并执行SQL

1.5.1 获取 SqlSessionFactory

  1. 指定mybatis的核心配置文件 “mybatis-config.xml”
  2. 使用mybatis提供Resources 工具类读取核心配置文件,转为输入流对象
  3. 使用SqlSessionFactoryBuilder对象的build方法,获取到DefaultSqlSessionFactory
//指定mybatis的核心配置文件路径
String resource = \"mybatis-config.xml\";

//使用mybatis提供的Resources 工具类读取核心配置文件,转为输入流对象
InputStream inputStream = Resources.getResourceAsStream(resource);

//使用SqlSessionFactoryBuilder对象的build方法,基于上一步的输入流对象
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);

//获取到的是 DefaultSqlSessionFactory
System.out.println(sqlSessionFactory);
//org.apache.ibatis.session.defaults.DefaultSqlSessionFactory@45c8e616

1.5.2 sqlSessionFactory 获取 SqlSession 实例

SqlSession 提供了在数据库执行 SQL 命令所需的所有方法,拿到SqlSession 就可以执行;

session.selectOne(statement,parameter); 方法参数分析

参数 说明
statement 准备要执行的SQL语句的唯一标识符(mybatis可以识别,目的是可以通过此标识,查找到要执行的SQL语句)
parameter 准备要执行的SQL语句的参数值
//将实例化SqlSession放在 try()中,会自动关闭资源
try (SqlSession session  = sqlSessionFactory.openSession()) {
//通过获取的SqlSession的实例,执行查询操作
//根据动漫编号,查询动漫详情
//<mapper namespace=\"huayu\">单独使用SqlSession的方法,namespace可以随意的定义
//namespace.方法名,通过sql语句唯一标识字符串,找到执行SQL
 Anime anime = (Anime) session.selectOne(\"huayu.selectAnime\", 101);
    
 System.out.println(anime);
    
}

1.5.3 面向接口开发

注意在resource下建立文件夹的时候需要 com/kcg/mybatis ,中间的分隔符要使用反斜杠,不能用点;

  1. 创建接口xxxMapper.java(注意路径要与xxxMapper.xml的包名结构一致;)
  2. 通过session.getMapper(xxxMapper.class); 获取接口代理类
  3. 使用接口代理类,调用接口方法
try (SqlSession session  = sqlSessionFactory.openSession()) {
    //面向接口开发
    //推荐的方式
    AnimeMapper animeMapper = session.getMapper(AnimeMapper.class);
    System.out.println(animeMapper);
    //代理对象  org.apache.ibatis.binding.MapperProxy@4cc0edeb

    //直接就可以通过调用接口的方法,执行对象的SQl语句,并返回接口,不需要关心mybatis底层是调用那个方法
    Anime anime = animeMapper.selectAnime(101);
    System.out.println(anime);
    
}

try()中实例化对象报错问题

https://www.cnblogs.com/xiaoqigui/p/16598100.html

指定maven版本就可以

<plugin>
     <groupId>org.apache.maven.plugins</groupId>
     <artifactId>maven-compiler-plugin</artifactId>
     <configuration>
         <source>8</source>
         <target>8</target>
     </configuration>
</plugin>

2、配置

2.1 所有配置 和 顺序

注意配置的顺序不能错,可以少写,但是不能顺序错

  • configuration(配置)
    • properties(属性)
    • settings(设置)
    • typeAliases(类型别名)
    • typeHandlers(类型处理器)
    • objectFactory(对象工厂)
    • plugins(插件)
    • environments(环境配置)
      • environment(环境变量)
        • transactionManager(事务管理器)
        • dataSource(数据源)
    • databaseIdProvider(数据库厂商标识)
    • mappers(映射器)

2.2 properties 属性

1、properties 属性:自定义核心属性配置,也可以引入外部的属性文件,比如jdbc.properties;

  • resource 属性指定外部配置文件,优先级高于property子标签属性配置,可以以单独使用,如果二者同时存在,优先以外部为主
//resource属性引入的外部配置文件,优先级高于property子标签属性
<properties resource=\"jdbc.properties\">
<!-- <property name=\"driver\" value=\"com.mysql.jdbc.Driver\"/>-->
<!--  <property name=\"url\" value=\"jdbc:mysql://localhost:3306/animedb?useUnicode=true&amp;characterEncoding=utf8&amp;useSSL=false&amp;serverTimezone=GMT%2b8\"/>-->
<!--  <property name=\"username\" value=\"root\"/>-->
<!--  <property name=\"password\" value=\"17585273765\"/>-->
</properties>

2.3 settings 设置

一些设置的开启;

下面是简单举例,设置用很多,可以直接看官网;

<settings>
    <!-- 开启驼峰自动映射 -->
   <setting name=\"mapUnderscoreToCamelCase\" value=\"true\" />
    <!-- mybatis自带日志 -->
<!--  <setting name=\"logImpl\" value=\"STDOUT_LOGGING\"/>   -->
    <!-- LOG4J日志 -->
<!--  <setting name=\"logImpl\" value=\"LOG4J\"/>   -->
</settings>

2.4 typeAliases 类型别名

在SQL的xml文件中,resultType 可以使用 别名,不区分大小写;

  • 单个取别名,在SQL的xml文件中,resultType 可以使用 别名,不区分大小写
  • 批量取别名 :指定实体所在的父包路径,自动指定包及子包中所有的实体批量取别名,默认的类名是首字母小写,不区分大小写;
  • 建议,如果没有安装插件,从SQL映射xml文件中无法自动定位到目标实体,不利于代码的可读性;
  • mybatis对 Java 的基本数据类型 有 内建的类型别名;
<typeAliases>
    <!-- 单个实体类设置别名 -->
<!-- <typeAlias type=\"com.kgc.mybatis.bean.Anime\" alias=\"Anime\"></typeAlias>-->
    <!-- 对整个个实体包下的实体类设置别名 -->
  <package name=\"com.kgc.mybatis.bean\"/>
</typeAliases>

2.5 environments 环境配置

MyBatis 可以配置成适应多种环境;

不过要记住:尽管可以配置多个环境,但每个 SqlSessionFactory 实例只能选择一种环境。

<environments default=\"development_test\">
    <!--   开发环境     -->
    <environment id=\"development_dev\">
        <transactionManager type=\"JDBC\"/>
        <dataSource type=\"POOLED\">
            <property name=\"driver\" value=\"${driver}\"/>
            <property name=\"url\" value=\"${url}\"/>
            <property name=\"username\" value=\"${username}\"/>
            <property name=\"password\" value=\"${password}\"/>
        </dataSource>
    </environment>
    <!--   测试环境     -->
    <environment id=\"development_test\">
        ......
    </environment>
    <!--    生产环境    -->
    <environment id=\"development_prod\">
        .......
    </environment>
</environments>

2.5.1 transactionManager 事务管理

environment 标签的子标签 transactionManager;

  • transactionManager:事务管理,使用的是jdbc的数据管理,以后框架整合会个Spring处理;
  • MyBatis 中有两种类型的事务管理器(也就是 type=\"[JDBC|MANAGED]\");
    JDBC – 这个配置直接使用了 JDBC 的提交和回滚设施,它依赖从数据源获得的连接来管理事务作用域。
  • MANAGED – 这个配置几乎没做什么。它从不提交或回滚一个连接,而是让容器来管理事务的整个生命周期(比如 JEE 应用服务器的上下文)。 默认情况下它会关闭连接。然而一些容器并不希望连接被关闭,因此需要将 closeConnection 属性设置为 false 来阻止默认的关闭行为
  • 如果使用Spring + mybatis :事务管理,交给Spring处理;
<transactionManager type=\"JDBC\"/>

2.5.2 dataSource 数据源

  • 数据源配置:有三种内建的数据源类型(也就是 type=\"[UNPOOLED|POOLED|JNDI]\")
    以后由Spring处理;
<dataSource type=\"POOLED\">
    <property name=\"driver\" value=\"${driver}\"/>
    <property name=\"url\" value=\"${url}\"/>
    <property name=\"username\" value=\"${username}\"/>
    <property name=\"password\" value=\"${password}\"/>
</dataSource>

2.6 mappers 映射器

  • 用于指定SQL文件的加载,作用:告诉MySql 到哪里去找 映射文件

2.6.1 单个SQL映射文件的加载

  • resource
<mappers>
	<mapper resource=\"com/kgc/mybatis/AnimeMapper.xml\"></mapper>
</mappers>
  • 通过接口
<mappers>
	<mapper class=\"com.kgc.mybatis.mapper.AnimeMapper\"></mapper>
</mappers>

2.6.2 批量SQL映射文件加载

只需要指定mapper接口的所在包;

<mappers>
	<package name=\"com.kgc.mybatis.mapper\"/>
</mappers>

3、MyBatis 执行过程

3.1 代码分析执行过程

//1、加载全局配置文件
InputStream inputStream = Resources.getResourceAsStream(\"mybatis-config.xml\");

//2、实例化 SqlSessionFactoryBuilder 构建器
SqlSessionFactoryBuilder sqlSessionFactoryBuilder = new SqlSessionFactoryBuilder();

//3、解析 配置信息文件流,并返回  defaultSessionFactory
SqlSessionFactory defaultSessionFactory = sqlSessionFactoryBuilder.build(inputStream);

//4、实例化 SqlSession
SqlSession sqlSession = defaultSessionFactory.openSession();
System.out.println(sqlSession);
//org.apache.ibatis.session.defaults.DefaultSqlSession@20398b7c

//5、获取接口的代理实现类
AnimeMapper animeMapper = sqlSession.getMapper(AnimeMapper.class);

//调用接口的 代理类,执行方法
Anime anime = animeMapper.selectAnimeById(101);
System.out.println(anime);
//Anime(id=101, cid=1, name=斗破苍穹, author=土豆, actor=萧炎, produce=玄机科技, createDate=Sun Aug 07 00:00:00 CST 2022)

3.2 源码分析执行过程分析

3.2.1 Resources 加载全局配置文件

//加载全局配置文件
InputStream inputStream = Resources.getResourceAsStream(\"mybatis-config.xml\");

3.2.2 SqlSessionFactoryBuilder 构建器

//实例化 SqlSessionFactoryBuilder 构建器
SqlSessionFactoryBuilder sqlSessionFactoryBuilder = new SqlSessionFactoryBuilder();

3.2.3 sqlSessionFactoryBuilder.build(inputStream);

解析 配置信息文件流,并返回 defaultSessionFactory;

//解析 配置信息文件流,并返回  defaultSessionFactory
SqlSessionFactory defaultSessionFactory = sqlSessionFactoryBuilder.build(inputStream);

手动实现,体验实例化Configuration;

//手动解析配置文件流,实例化Configuration,体验Mybatsi自动实例化Configuration;
//实例化 XMLConfigBuilder  参数:配置文件流,环境名字,Properties实例
//XMLConfigBuilder xmlConfigBuilder = new XMLConfigBuilder(inputStream, \"development_dev\", new Properties());

//解析配置文件流
//Configuration configuration = xmlConfigBuilder.parse();

`SqlSessionFactoryBuilder源码分析:

sqlSessionFactoryBuilder.build(inputStream)方法,首先进入sqlSessionFactoryBuilder类

调用当前类的SqlSessionFactory build(InputStream inputStream, String environment, Properties properties)方法;

其中,又调用当前类的一个build方法解析配置文件,并实例化DefaultSqlSessionFactory;

3.2.4 defaultSessionFactory.openSession();

//实例化 SqlSession
SqlSession sqlSession = defaultSessionFactory.openSession();
//org.apache.ibatis.session.defaults.DefaultSqlSession@20398b7c

DefaultSqlSessionFactory源码分析:

openSession方法调用openSessionFromConnection;

openSessionFromDataSource(ExecutorType execType, TransactionIsolationLevel level, boolean autoCommit) 方法:方法:

3.2.5 sqlSession.getMapper(xxx.class);

//获取到接口的代理实现类
AnimeMapper animeMapper = sqlSession.getMapper(AnimeMapper.class);
//org.apache.ibatis.binding.MapperProxy@5abca1e0

//也可以通过,解析配置文件流 创建配置对象,并通过配置对象直接getMapper,前提是获得了sqlSession
//Configuration configuration = xmlConfigBuilder.parse();
//AnimeMapper animeMapper = configuration.getMapper(AnimeMapper.class, sqlSession);

3.2.6 animeMapper.selectAnimeById(101);

//调用接口代理类,执行方法
Anime anime = animeMapper.selectAnimeById(101);
//Anime(id=101, cid=1, name=斗破苍穹, author=土豆, actor=萧炎, produce=玄机科技, createDate=Sun Aug 07 00:00:00 CST 2022)

3.2.7 总结


来源:https://www.cnblogs.com/xiaoqigui/p/16602906.html
本站部分图文来源于网络,如有侵权请联系删除。

未经允许不得转载:百木园 » MyBatis(一)-入门

相关推荐

  • 暂无文章