MyBatis(一)-入门

打印 上一主题 下一主题

主题 862|帖子 862|积分 2601

==>>MyBatis中文网
1、第一个 mybastis程序

1.1 导入jar包
  1. <mybatis.version>3.4.1</mybatis.version>
  2. <mysql.version>5.1.47</mysql.version>
  3. <dependency>
  4.     <groupId>org.mybatis</groupId>
  5.     <artifactId>mybatis</artifactId>
  6.     <version>${mybatis.version}</version>
  7. </dependency>
  8. <dependency>
  9.     <groupId>mysql</groupId>
  10.     <artifactId>mysql-connector-java</artifactId>
  11.     <version>${mysql.version}</version>
  12. </dependency>
复制代码
1.2 jdcb.properties
  1. driver=com.mysql.jdbc.Driver
  2. url=jdbc:mysql://localhost:3306/animedb?useUnicode=true&characterEncoding=utf8&useSSL=false&serverTimezone=GMT%2b8
  3. username=root
  4. password=root
复制代码
1.3 mybatis-config.xml

数据配置信息可以直接在mybatis-config.xml中填写,也可以引入外部数据库配置信息文件;
  1. <?xml version="1.0" encoding="UTF-8" ?>
  2. <!DOCTYPE configuration
  3.         PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
  4.         "http://mybatis.org/dtd/mybatis-3-config.dtd">
  5. <configuration>
  6.    
  7.     <properties resource="jdbc.properties"></properties>
  8.     <typeAliases>
  9.         
  10.         <package name="com.kgc.mybatis.bean"/>
  11.     </typeAliases>
  12.    
  13.     <environments default="development">
  14.         <environment id="development">
  15. <typeAliases>
  16.    
  17.    
  18.   <package name="com.kgc.mybatis.bean"/>
  19. </typeAliases>  <transactionManager type="JDBC"/>
  20. <typeAliases>
  21.    
  22.    
  23.   <package name="com.kgc.mybatis.bean"/>
  24. </typeAliases>  <dataSource type="POOLED">
  25. <settings>
  26.    
  27.    <setting name="mapUnderscoreToCamelCase" value="true" />
  28.    
  29.    
  30. </settings> <property name="driver" value="${driver}"/>
  31. <settings>
  32.    
  33.    <setting name="mapUnderscoreToCamelCase" value="true" />
  34.    
  35.    
  36. </settings> <property name="url" value="${url}"/>
  37. <settings>
  38.    
  39.    <setting name="mapUnderscoreToCamelCase" value="true" />
  40.    
  41.    
  42. </settings> <property name="username" value="${username}"/>
  43. <settings>
  44.    
  45.    <setting name="mapUnderscoreToCamelCase" value="true" />
  46.    
  47.    
  48. </settings> <property name="password" value="${password}"/>
  49. <typeAliases>
  50.    
  51.    
  52.   <package name="com.kgc.mybatis.bean"/>
  53. </typeAliases>  </dataSource>
  54.         </environment>
  55.     </environments>
  56.     <mappers>
  57.         <package name="com.kgc.mybatis.mapper"/>
  58.     </mappers>
  59. </configuration>
复制代码
1.4 xxxMapper.xml

SQL映射文件;
  1. <?xml version="1.0" encoding="UTF-8" ?>
  2. <!DOCTYPE mapper
  3.         PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
  4.         "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
  5.    
  6. <mapper namespace="com.kgc.mybatis.mapper.AnimeMapper">  
  7.    
  8.   <select id="selectAnime" parameterType="int" resultType="com.kgc.mybatis.bean.Anime">
  9.     select * from animes where id = #{id}
  10.   </select>
  11.    
  12. </mapper>
复制代码
1.5 获取 SqlSession 并执行SQL

1.5.1  获取 SqlSessionFactory


  • 指定mybatis的核心配置文件 “mybatis-config.xml”
  • 使用mybatis提供Resources 工具类读取核心配置文件,转为输入流对象
  • 使用SqlSessionFactoryBuilder对象的build方法,获取到DefaultSqlSessionFactory
  1. //指定mybatis的核心配置文件路径
  2. String resource = "mybatis-config.xml";
  3. //使用mybatis提供的Resources 工具类读取核心配置文件,转为输入流对象
  4. InputStream inputStream = Resources.getResourceAsStream(resource);
  5. //使用SqlSessionFactoryBuilder对象的build方法,基于上一步的输入流对象
  6. SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
  7. //获取到的是 DefaultSqlSessionFactory
  8. System.out.println(sqlSessionFactory);
  9. //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语句的参数值
  1. //将实例化SqlSession放在 try()中,会自动关闭资源
  2. try (SqlSession session  = sqlSessionFactory.openSession()) {
  3. //通过获取的SqlSession的实例,执行查询操作
  4. //根据动漫编号,查询动漫详情
  5. //<mapper namespace="huayu">单独使用SqlSession的方法,namespace可以随意的定义
  6. //namespace.方法名,通过sql语句唯一标识字符串,找到执行SQL
  7. Anime anime = (Anime) session.selectOne("huayu.selectAnime", 101);
  8.    
  9. System.out.println(anime);
  10.    
  11. }
复制代码
1.5.3 面向接口开发

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

  • 创建接口xxxMapper.java(注意路径要与xxxMapper.xml的包名结构一致;)
  • 通过session.getMapper(xxxMapper.class); 获取接口代理类
  • 使用接口代理类,调用接口方法
  1. try (SqlSession session  = sqlSessionFactory.openSession()) {
  2.     //面向接口开发
  3.     //推荐的方式
  4.     AnimeMapper animeMapper = session.getMapper(AnimeMapper.class);
  5.     System.out.println(animeMapper);
  6.     //代理对象  org.apache.ibatis.binding.MapperProxy@4cc0edeb
  7.     //直接就可以通过调用接口的方法,执行对象的SQl语句,并返回接口,不需要关心mybatis底层是调用那个方法
  8.     Anime anime = animeMapper.selectAnime(101);
  9.     System.out.println(anime);
  10.    
  11. }
复制代码
try()中实例化对象报错问题
https://www.cnblogs.com/xiaoqigui/p/16598100.html
指定maven版本就可以
  1. <plugin>
  2.      <groupId>org.apache.maven.plugins</groupId>
  3.      <artifactId>maven-compiler-plugin</artifactId>
  4.      <configuration>
  5.          <source>8</source>
  6.          <target>8</target>
  7.      </configuration>
  8. </plugin>
复制代码
2、配置

2.1 所有配置 和 顺序

注意:配置的顺序不能错,可以少写,但是不能顺序错
2.2 properties 属性

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

  • resource 属性指定外部配置文件,优先级高于property子标签属性配置,可以以单独使用,如果二者同时存在,优先以外部为主
  1. //resource属性引入的外部配置文件,优先级高于property子标签属性
  2. <properties resource="jdbc.properties">
  3. </properties>
复制代码
2.3 settings 设置

一些设置的开启;
下面是简单举例,设置用很多,可以直接看官网;
  1. <settings>
  2.    
  3.    <setting name="mapUnderscoreToCamelCase" value="true" />
  4.    
  5.    
  6. </settings>
复制代码
2.4 typeAliases 类型别名

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

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

MyBatis 可以配置成适应多种环境;
不过要记住:尽管可以配置多个环境,但每个 SqlSessionFactory 实例只能选择一种环境。
  1. <settings>
  2.    
  3.    <setting name="mapUnderscoreToCamelCase" value="true" />
  4.    
  5.    
  6. </settings><settings>
  7.    
  8.    <setting name="mapUnderscoreToCamelCase" value="true" />
  9.    
  10.    
  11. </settings><settings>
  12.    
  13.    <setting name="mapUnderscoreToCamelCase" value="true" />
  14.    
  15.    
  16. </settings><settings>
  17.    
  18.    <setting name="mapUnderscoreToCamelCase" value="true" />
  19.    
  20.    
  21. </settings><settings>
  22.    
  23.    <setting name="mapUnderscoreToCamelCase" value="true" />
  24.    
  25.    
  26. </settings><settings>
  27.    
  28.    <setting name="mapUnderscoreToCamelCase" value="true" />
  29.    
  30.    
  31. </settings><typeAliases>
  32.    
  33.    
  34.   <package name="com.kgc.mybatis.bean"/>
  35. </typeAliases>......<settings>
  36.    
  37.    <setting name="mapUnderscoreToCamelCase" value="true" />
  38.    
  39.    
  40. </settings>     .......   
复制代码
2.5.1 transactionManager 事务管理

environment 标签的子标签 transactionManager;

  • transactionManager:事务管理,使用的是jdbc的数据管理,以后框架整合会个Spring处理;
  • MyBatis 中有两种类型的事务管理器(也就是 type="[JDBC|MANAGED]");
    JDBC – 这个配置直接使用了 JDBC 的提交和回滚设施,它依赖从数据源获得的连接来管理事务作用域。
  • MANAGED – 这个配置几乎没做什么。它从不提交或回滚一个连接,而是让容器来管理事务的整个生命周期(比如 JEE 应用服务器的上下文)。 默认情况下它会关闭连接。然而一些容器并不希望连接被关闭,因此需要将 closeConnection 属性设置为 false 来阻止默认的关闭行为
  • 如果使用Spring + mybatis :事务管理,交给Spring处理;
  1. [/code][size=3]2.5.2  dataSource 数据源[/size]
  2. [list]
  3. [*]数据源配置:有三种内建的数据源类型(也就是 type="[UNPOOLED|POOLED|JNDI]")
  4. 以后由Spring处理;
  5. [/list][code]<settings>
  6.    
  7.    <setting name="mapUnderscoreToCamelCase" value="true" />
  8.    
  9.    
  10. </settings>
复制代码
2.6 mappers 映射器


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


  • resource
  1. <mappers>
  2. <mappers>
  3. <mappers>
  4.         <package name="com.kgc.mybatis.mapper"/>
  5. </mappers><mapper ></mapper>
  6. </mappers><mapper resource="com/kgc/mybatis/AnimeMapper.xml"></mapper>
  7. </mappers>
复制代码

  • 通过接口
  1. <mappers>
  2. <mappers>
  3. <mappers>
  4.         <package name="com.kgc.mybatis.mapper"/>
  5. </mappers><mapper ></mapper>
  6. </mappers><mapper resource="com/kgc/mybatis/AnimeMapper.xml"></mapper>
  7. </mappers>
复制代码
2.6.2  批量SQL映射文件加载

只需要指定mapper接口的所在包;
  1. <mappers>
  2. <mappers>
  3. <mappers>
  4.         <package name="com.kgc.mybatis.mapper"/>
  5. </mappers><mapper ></mapper>
  6. </mappers><mapper resource="com/kgc/mybatis/AnimeMapper.xml"></mapper>
  7. </mappers>
复制代码
3、MyBatis 执行过程

3.1 代码分析执行过程
  1. //1、加载全局配置文件
  2. InputStream inputStream = Resources.getResourceAsStream("mybatis-config.xml");
  3. //2、实例化 SqlSessionFactoryBuilder 构建器
  4. SqlSessionFactoryBuilder sqlSessionFactoryBuilder = new SqlSessionFactoryBuilder();
  5. //3、解析 配置信息文件流,并返回  defaultSessionFactory
  6. SqlSessionFactory defaultSessionFactory = sqlSessionFactoryBuilder.build(inputStream);
  7. //4、实例化 SqlSession
  8. SqlSession sqlSession = defaultSessionFactory.openSession();
  9. System.out.println(sqlSession);
  10. //org.apache.ibatis.session.defaults.DefaultSqlSession@20398b7c
  11. //5、获取接口的代理实现类
  12. AnimeMapper animeMapper = sqlSession.getMapper(AnimeMapper.class);
  13. //调用接口的 代理类,执行方法
  14. Anime anime = animeMapper.selectAnimeById(101);
  15. System.out.println(anime);
  16. //Anime(id=101, cid=1, name=斗破苍穹, author=土豆, actor=萧炎, produce=玄机科技, createDate=Sun Aug 07 00:00:00 CST 2022)
复制代码
3.2 源码分析执行过程分析

3.2.1 Resources 加载全局配置文件
  1. //加载全局配置文件
  2. InputStream inputStream = Resources.getResourceAsStream("mybatis-config.xml");
复制代码
3.2.2 SqlSessionFactoryBuilder 构建器
  1. //实例化 SqlSessionFactoryBuilder 构建器
  2. SqlSessionFactoryBuilder sqlSessionFactoryBuilder = new SqlSessionFactoryBuilder();
复制代码
3.2.3  sqlSessionFactoryBuilder.build(inputStream);

解析 配置信息文件流,并返回  defaultSessionFactory;
  1. //解析 配置信息文件流,并返回  defaultSessionFactory
  2. SqlSessionFactory defaultSessionFactory = sqlSessionFactoryBuilder.build(inputStream);
复制代码
手动实现,体验实例化Configuration;
  1. //手动解析配置文件流,实例化Configuration,体验Mybatsi自动实例化Configuration;
  2. //实例化 XMLConfigBuilder  参数:配置文件流,环境名字,Properties实例
  3. //XMLConfigBuilder xmlConfigBuilder = new XMLConfigBuilder(inputStream, "development_dev", new Properties());
  4. //解析配置文件流
  5. //Configuration configuration = xmlConfigBuilder.parse();
复制代码
`SqlSessionFactoryBuilder源码分析:
sqlSessionFactoryBuilder.build(inputStream)方法,首先进入sqlSessionFactoryBuilder类
调用当前类的SqlSessionFactory build(InputStream inputStream, String environment, Properties properties)方法;

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

3.2.4 defaultSessionFactory.openSession();
  1. //实例化 SqlSession
  2. SqlSession sqlSession = defaultSessionFactory.openSession();
  3. //org.apache.ibatis.session.defaults.DefaultSqlSession@20398b7c
复制代码
DefaultSqlSessionFactory源码分析:
openSession方法调用openSessionFromConnection;

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

3.2.5 sqlSession.getMapper(xxx.class);
  1. //获取到接口的代理实现类
  2. AnimeMapper animeMapper = sqlSession.getMapper(AnimeMapper.class);
  3. //org.apache.ibatis.binding.MapperProxy@5abca1e0
  4. //也可以通过,解析配置文件流 创建配置对象,并通过配置对象直接getMapper,前提是获得了sqlSession
  5. //Configuration configuration = xmlConfigBuilder.parse();
  6. //AnimeMapper animeMapper = configuration.getMapper(AnimeMapper.class, sqlSession);
复制代码
3.2.6 animeMapper.selectAnimeById(101);
  1. //调用接口代理类,执行方法
  2. Anime anime = animeMapper.selectAnimeById(101);
  3. //Anime(id=101, cid=1, name=斗破苍穹, author=土豆, actor=萧炎, produce=玄机科技, createDate=Sun Aug 07 00:00:00 CST 2022)
复制代码
3.2.7 总结



免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

大连全瓷种植牙齿制作中心

金牌会员
这个人很懒什么都没写!

标签云

快速回复 返回顶部 返回列表