==>>MyBatis中文网
1、第一个 mybastis程序
1.1 导入jar包
- <mybatis.version>3.4.1</mybatis.version>
- <mysql.version>5.1.47</mysql.version>
- <dependency>
- <groupId>org.mybatis</groupId>
- <artifactId>mybatis</artifactId>
- <version>${mybatis.version}</version>
- </dependency>
- <dependency>
- <groupId>mysql</groupId>
- <artifactId>mysql-connector-java</artifactId>
- <version>${mysql.version}</version>
- </dependency>
复制代码 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">
- <typeAliases>
-
-
- <package name="com.kgc.mybatis.bean"/>
- </typeAliases> <transactionManager type="JDBC"/>
- <typeAliases>
-
-
- <package name="com.kgc.mybatis.bean"/>
- </typeAliases> <dataSource type="POOLED">
- <settings>
-
- <setting name="mapUnderscoreToCamelCase" value="true" />
-
-
- </settings> <property name="driver" value="${driver}"/>
- <settings>
-
- <setting name="mapUnderscoreToCamelCase" value="true" />
-
-
- </settings> <property name="url" value="${url}"/>
- <settings>
-
- <setting name="mapUnderscoreToCamelCase" value="true" />
-
-
- </settings> <property name="username" value="${username}"/>
- <settings>
-
- <setting name="mapUnderscoreToCamelCase" value="true" />
-
-
- </settings> <property name="password" value="${password}"/>
- <typeAliases>
-
-
- <package name="com.kgc.mybatis.bean"/>
- </typeAliases> </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">
-
- <mapper namespace="com.kgc.mybatis.mapper.AnimeMapper">
-
-
- <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语句)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 ,中间的分隔符要使用反斜杠,不能用点;
- 创建接口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://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 所有配置 和 顺序
注意:配置的顺序不能错,可以少写,但是不能顺序错
2.2 properties 属性
1、properties 属性:自定义核心属性配置,也可以引入外部的属性文件,比如jdbc.properties;
- resource 属性:指定外部配置文件,优先级高于property子标签属性配置,可以以单独使用,如果二者同时存在,优先以外部为主
- //resource属性引入的外部配置文件,优先级高于property子标签属性
- <properties resource="jdbc.properties">
- </properties>
复制代码 2.3 settings 设置
一些设置的开启;
下面是简单举例,设置用很多,可以直接看官网;- <settings>
-
- <setting name="mapUnderscoreToCamelCase" value="true" />
-
-
- </settings>
复制代码 2.4 typeAliases 类型别名
在SQL的xml文件中,resultType 可以使用 别名,不区分大小写;
- 单个取别名,在SQL的xml文件中,resultType 可以使用 别名,不区分大小写
- 批量取别名 :指定实体所在的父包路径,自动指定包及子包中所有的实体批量取别名,默认的类名是首字母小写,不区分大小写;
- 建议,如果没有安装插件,从SQL映射xml文件中,无法自动定位到目标实体,不利于代码的可读性;
- mybatis对 Java 的基本数据类型 有 内建的类型别名;
- <typeAliases>
-
-
- <package name="com.kgc.mybatis.bean"/>
- </typeAliases>
复制代码 2.5 environments 环境配置
MyBatis 可以配置成适应多种环境;
不过要记住:尽管可以配置多个环境,但每个 SqlSessionFactory 实例只能选择一种环境。- <settings>
-
- <setting name="mapUnderscoreToCamelCase" value="true" />
-
-
- </settings><settings>
-
- <setting name="mapUnderscoreToCamelCase" value="true" />
-
-
- </settings><settings>
-
- <setting name="mapUnderscoreToCamelCase" value="true" />
-
-
- </settings><settings>
-
- <setting name="mapUnderscoreToCamelCase" value="true" />
-
-
- </settings><settings>
-
- <setting name="mapUnderscoreToCamelCase" value="true" />
-
-
- </settings><settings>
-
- <setting name="mapUnderscoreToCamelCase" value="true" />
-
-
- </settings><typeAliases>
-
-
- <package name="com.kgc.mybatis.bean"/>
- </typeAliases>......<settings>
-
- <setting name="mapUnderscoreToCamelCase" value="true" />
-
-
- </settings> .......
复制代码 2.5.1 transactionManager 事务管理
environment 标签的子标签 transactionManager;
- transactionManager:事务管理,使用的是jdbc的数据管理,以后框架整合会个Spring处理;
- MyBatis 中有两种类型的事务管理器(也就是 type="[JDBC|MANAGED]");
JDBC – 这个配置直接使用了 JDBC 的提交和回滚设施,它依赖从数据源获得的连接来管理事务作用域。
- MANAGED – 这个配置几乎没做什么。它从不提交或回滚一个连接,而是让容器来管理事务的整个生命周期(比如 JEE 应用服务器的上下文)。 默认情况下它会关闭连接。然而一些容器并不希望连接被关闭,因此需要将 closeConnection 属性设置为 false 来阻止默认的关闭行为
- 如果使用Spring + mybatis :事务管理,交给Spring处理;
- [/code][size=3]2.5.2 dataSource 数据源[/size]
- [list]
- [*]数据源配置:有三种内建的数据源类型(也就是 type="[UNPOOLED|POOLED|JNDI]")
- 以后由Spring处理;
- [/list][code]<settings>
-
- <setting name="mapUnderscoreToCamelCase" value="true" />
-
-
- </settings>
复制代码 2.6 mappers 映射器
- 用于指定SQL文件的加载,作用:告诉MySql 到哪里去找 映射文件;
2.6.1 单个SQL映射文件的加载
- <mappers>
- <mappers>
- <mappers>
- <package name="com.kgc.mybatis.mapper"/>
- </mappers><mapper ></mapper>
- </mappers><mapper resource="com/kgc/mybatis/AnimeMapper.xml"></mapper>
- </mappers>
复制代码- <mappers>
- <mappers>
- <mappers>
- <package name="com.kgc.mybatis.mapper"/>
- </mappers><mapper ></mapper>
- </mappers><mapper resource="com/kgc/mybatis/AnimeMapper.xml"></mapper>
- </mappers>
复制代码 2.6.2 批量SQL映射文件加载
只需要指定mapper接口的所在包;- <mappers>
- <mappers>
- <mappers>
- <package name="com.kgc.mybatis.mapper"/>
- </mappers><mapper ></mapper>
- </mappers><mapper resource="com/kgc/mybatis/AnimeMapper.xml"></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 总结

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