MyBatis(一)(mybatis一对多映射)

  本篇文章为你整理了MyBatis(一)(mybatis一对多映射)的详细内容,包含有mybatis一级缓存和二级缓存 mybatis一对多映射 mybatis一对一 一对多 多对一 多对多 mybatis一对一和一对多标签 MyBatis(一),希望能帮助你了解 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

  指定mybatis的核心配置文件 “mybatis-config.xml”;

  使用mybatis提供的Resources 工具类读取核心配置文件,转为输入流对象;

  使用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语句)

  


//将实例化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 ,中间的分隔符要使用反斜杠,不能用点;

  创建接口xxxMapper.java(注意路径要与xxxMapper.xml的包名结构一致;)

  通过session.getMapper(xxxMapper.class); 获取接口代理类

  使用接口代理类,调用接口方法

  

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:///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.1 所有配置 和 顺序

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

  configuration(配置)

  properties(属性)

  settings(设置)

  typeAliases(类型别名)

  typeHandlers(类型处理器)

  objectFactory(对象工厂)

  plugins(插件)

  environments(环境配置)

  environment(环境变量)

  transactionManager(事务管理器)

  dataSource(数据源)

  
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="[JDBCMANAGED]");
 

  JDBC – 这个配置直接使用了 JDBC 的提交和回滚设施,它依赖从数据源获得的连接来管理事务作用域。

  MANAGED – 这个配置几乎没做什么。它从不提交或回滚一个连接,而是让容器来管理事务的整个生命周期(比如 JEE 应用服务器的上下文)。 默认情况下它会关闭连接。然而一些容器并不希望连接被关闭,因此需要将 closeConnection 属性设置为 false 来阻止默认的关闭行为

  如果使用Spring + mybatis :事务管理,交给Spring处理;

  

 transactionManager type="JDBC"/ 

 

  

 

  2.5.2 dataSource 数据源

  数据源配置:有三种内建的数据源类型(也就是 type="[UNPOOLEDPOOLEDJNDI]")
 

  以后由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 /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 总结

  以上就是MyBatis(一)(mybatis一对多映射)的详细内容,想要了解更多 MyBatis(一)的内容,请持续关注盛行IT软件开发工作室。

郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。

留言与评论(共有 条评论)
   
验证码: