ToB企服应用市场:ToB评测及商务社交产业平台
标题:
MyBatis(一)-入门
[打印本页]
作者:
大连全瓷种植牙齿制作中心
时间:
2022-9-16 17:18
标题:
MyBatis(一)-入门
==>>
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 所有配置 和 顺序
注意:
配置的顺序不能错
,可以少写,但是不能顺序错
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">
</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映射文件的加载
resource
<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 总结
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!
欢迎光临 ToB企服应用市场:ToB评测及商务社交产业平台 (https://dis.qidao123.com/)
Powered by Discuz! X3.4