Mybatis详细教程
文章目录
- 1.mybatis概述
- 2.mybatis快速入门
- 2.1创建maven工程
- 2.1.1打包方式:jar
- 2.1.2引入依赖
- 2.2创建mybatis的核心配置文件
- 2.3创建mapper接口
- 2.4创建mybatis的映射文件
- 2.4.1相关概念
- 2.5测试
- 3.mybatis核心配置文件
- 3.1初识核心配置文件
- 3.2细究各个配置
- 3.2.1属性(properties)
- 3.2.2类型别名(typeAliases)
- 3.2.3设置(settings)
- 3.2.4映射器(mappers)
- 3.2.5生命周期和作用域
- 4.mybatis增删改查
- 5.动态sql
1.mybatis概述
2.mybatis快速入门
1.需求:查询User表中所有数据
2.步骤:
(1)创建user表,添加数据
(2)创建模块,导入坐标
(3)编写mybatis核心配置文件----->替换连接信息,解决编码问题
(4)编写sql映射文件---->统一管理sql语句,解决硬编码问题
(5)编码
①定义POJO类
②加载核心配置文件,获取sqlsessionfactory对象
③获取sqlsession对象,执行sql语句
④释放资源
2.1创建maven工程
2.1.1打包方式:jar
2.1.2引入依赖
<dependencies><!--mybatis核心配置文件--><dependency><groupId>org.mybatis</groupId><artifactId>mybatis</artifactId><version>3.5.7</version></dependency><!--mysql驱动--><dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId><version>5.1.3</version></dependency><!--测试类--><dependency><groupId>junit</groupId><artifactId>junit</artifactId><version>4.11</version><scope>test</scope></dependency> </dependencies>
2.2创建mybatis的核心配置文件
习惯命名为mybatis-config.xml,这个命名仅仅是建议,将来整合spring之后,这个配置文件可以省略,所以大家操作时可以直接复制,粘贴。
核心配置文件主要用于配置连接数据库的环境及Mybatis的全局配置。
核心配置文件放在src/main/resource目录下
<configuration><!-- 1.设置数据库文件--><environments default="development"><environment id="development"><transactionManager type="JDBC"></transactionManager><dataSource type="POOLED"><property name="driver" value="com.mysql.jdbc.Driver"/><property name="url" value="jdbc:mysql://localhost:3306/mybatis"/><property name="username" value="root"/><property name="password" value="123456"/></dataSource></environment></environments><!-- 2.引入映射文件--><mappers><mapper resource="mappers/UserMapper.xml" /></mappers>
</configuration>
2.3创建mapper接口
mybatis中的mapper接口相当于一档的到,但是区别在于mapper仅仅是接口,不需要提供实现类
public interface UserMapper {//1.添加用户信息int insertUser();
}
2.4创建mybatis的映射文件
2.4.1相关概念
ORM(Object Relationship Mapping)对象映射。
对象:代表Java的实体类对象
关系:关系型数据库
映射:二者之间的关系
JAVA概念 | 数据库概念 |
---|---|
类 | 表 |
属性 | 字段/列 |
对象 | 记录/行 |
1.映射文件的命名规则
表所对应的实体类名+Mapper.xml
例如:t_user,映射的实体类为User,所对应的映射文件为UserMapper.xml,因此一个映射文件对应一个实体类,对应一张表的操作,Mybatis映射文件用户编写sql,访问以及操作表中的数据。
2.mybatis中可以面向接口操作数据库,要保证两个一致
①mapper接口的全类名和映射文件的命名空间(namespace)保持一致
②mapper接口中方法的方法名和映射文件中便携的Sql的标签id数学保持一致。
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapperPUBLIC "-//mybatis.org//DTD Mapper 3.0//EN""http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper><insert id="insertUser" >insert into t_user values (null,'xiaoming','123',23,'woman');</insert>
</mapper>
2.5测试
3.mybatis核心配置文件
3.1初识核心配置文件
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configurationPUBLIC "-//mybatis.org//DTD Config 3.0//EN""http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration><!--导入外部配置文件--><properties resource="db.properties"/><!--可以给实体类起别名--><typeAliases><package name="com.gs.pojo"/></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}"/></dataSource></environment></environments><mappers><!-- <mapper resource="com/com.com.gs/dao/UserMapper.xml"/>--><!--<mapper class="com.com.com.gs.dao.UserMapper"/>--><package name="com.gs.dao"/></mappers></configuration>
1.我们可以从例子中发现configuration的标签中是enviroments,我们不妨推断Mybatis可以配置多套环境。注意点:尽管可以配置多个环境,但每个SqlSessionFactory实例只能选择一种环境。
2.接着观察transactionManager标签,这是配置我们的事务处理器,Mybatis默认使用的是JDBC,而dataSource表示我们使用的数据源,默认类型为 POOLED
3.2细究各个配置
3.2.1属性(properties)
作用:我们可以通过properties属性来实现音容配置文件,这些属性可以在外部进行设置,并可以进行动态替换,也就是说我们进行properties有两种方式,一种是外部引入,另一种是嵌套使用,更推荐使用外部数据源引入
(1)方式一:嵌套使用
<environments default="development"><environment id="development"><transactionManager type="JDBC"></transactionManager><dataSource type="POOLED"><property name="driver" value="com.mysql.jdbc.Driver"/><property name="url" value="jdbc:mysql://localhost:3306/mybatis"/><property name="username" value="root"/><property name="password" value="123456"/></dataSource></environment>
</environments>
(2)方式二:引入外部数据源
①在resource目录下编写一个配置文件db.properties
db.driver = com.mysql.jdbc.Driver
db.url= jdbc:mysql://localhost:3306/mybatis
db.username = root
db.password =123456
②在mybatis-config.xml配置文件中引入数据源
<!-- properties属性来实现引用配置文件-->
<properties resource="db.properties"/>
<!-- 设置数据库文件-->
<environments default="development"><environment id="development"><transactionManager type="JDBC"/><dataSource type="POOLED"><property name="driver" value="${db.driver}"/><property name="url" value="${db.url}"/><property name="username" value="${db.username}"/><property name="password" value="${db.password}"/></dataSource></environment>
</environments>
3.2.2类型别名(typeAliases)
若我们没有配置该属性,编写xml文件的实体类时要使用全类名
例如: resultType=“com.tz.bean.User”>
<select id="getUserList" resultType="com.tz.bean.User">select * from t_user;
</select>
为了简化上面的写法,我们可以在核心配置文件中进行别名的是设置,
(1)方式1:直接在mybatis-config.xml中进行相关实体类的全类名胚子
<!--可以给实体类起别名-->
<typeAliases><typeAlias type="com.tz.bean.User" alias="User"/>
</typeAliases>
在相应的Mapper.xml文件中引用
<select id="getUserList" resultType="User">select * from t_user;</select>
(2)方式2:我们也可以只指定一个包名,MyBatis会在包名下面搜索需要的JavaBen(扫描是实体类的包中,这个类的别名,引用时推荐使用首字母小写,不过没有强制要求)
<!-- 给实体类起别名--><typeAliases><package name="com.tz.bean"/></typeAliases>
在相应的Mapper.xml文件中引用
<!-- resultType="user" --><select id="getUserList" resultType="user">select * from t_user;</select>
使用场景:
1.在实体类比较少时,建议使用第一种
2.如果实体类比较多,建议使用第二种
3.第一种可以DIY别名,第二种则不行; 如果非要修改,需要在实体类上增加注解
@Alias("user") public class User {}
3.2.3设置(settings)
这是Mybatis中极为重要的调整设置,它们会改变Mybatis的运行时行为,官方中的配置项解释的十分清楚,可以进行相关查阅:https://mybatis.net.cn/configuration.html#environments
这里介绍两种开发中经常使用的设置
(1)驼峰命名(mapUnderscoreToCamelCase),用来解决我们实体类中属性名与数据库中的列名不一致问题
例如:数据库名字为user_id,实体类名字为userId,这时候我们需要配置该项,否则取不到值
(2)配置日志工厂logImpl,这里方便我们查看输出日志排查错误,可以理解成我们平常使用的System.out;
下面使用的值为STDOUT_LOGGING则为我们标准的日志输出,比较常用的还有Log4j;
<setting name="logImpl" value="STDOUT_LOGGING"/>
3.2.4映射器(mappers)
(1)使用类路径的资源引用(在mybatis-config.xml核心配置文件中配置)(推荐)
<mappers><mapper resource="com/tz/dao/UserMapper.xml"/>
</mappers>
这种方式对类名和Mapper.xml文件的位置没有任何限制
(2)使用class文件绑定注册(在mybatis-config.xml核心配置文件中配置)
<!-- 使用映射器接口实现类的完全限定类名 -->
<mappers><mapper class="com.tz.dao.UserMapper"/>
</mappers>
注意:
①接口和他的Mapper配置文件必须同名
②接口和他的Mapper配置文件必须在同一个包下
(3)使用扫描包进行注入绑定(在mybatis-config.xml核心配置文件中配置)
<mappers><package name="com.tz.dao"/>
</mappers>
注意:
①接口和他的Mapper配置文件必须同名
②接口和他的Mapper配置文件必须在同一个包下
这三种方式各有各的优势,使用上也没有所谓的优劣之分,只不过第一种对我们配置文件的命名和它所放的位置没有特殊限定,相对比较灵活。
3.2.5生命周期和作用域
不同作用域和生命周期类别是至关重要,因此错误的使用会导致非常严重的并发问题,下面以一张图简单描述一下我们mybatis开发的流程
记住这里的每一个mapper就对应我们编写的一个具体接口,即我们具体业务
这里我们创建Mybatis相关对象的工具类
import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;import java.io.IOException;
import java.io.InputStream;public class MybatisUtil {private static SqlSessionFactory sqlSessionFactory;static {try {String resource = "mybatis-config";InputStream resourceAsStream = Resources.getResourceAsStream(resource);SqlSessionFactoryBuilder sqlSessionFactoryBuilder = new SqlSessionFactoryBuilder();sqlSessionFactory = sqlSessionFactoryBuilder.build(resourceAsStream);} catch (IOException e) {e.printStackTrace();}}public static SqlSession getSqlSession(){return sqlSessionFactory.openSession(true);}
}
解析:
①SqlSessionFactoryBuilder:
一旦创建了SqlSessionFactory,就不再需要Builder这个对象了,所以我们可以把它设置为局部变量或使用静态代码块(也就是我们只需实例化出一个SqlSessionFactoryBuilder:对象)
如上面所写的
private static SqlSessionFactory sqlSessionFactory;static {try {String resource = "mybatis-config.xml";InputStream resourceAsStream = Resources.getResourceAsStream(resource);SqlSessionFactoryBuilder sqlSessionFactoryBuilder = new SqlSessionFactoryBuilder();sqlSessionFactory = sqlSessionFactoryBuilder.build(resourceAsStream);} catch (IOException e) {e.printStackTrace();}}
②SqlSessionFactory
可以通俗理解为我们的数据库连接池
SqlSessionFactory一旦创建就应该在运行期间一直存在,没有任何理由丢弃它或者重新创建另一个实例
SqlSessionFactory的最佳作用域是应用层上的,这种实现可以通过使用单例或静态单例模式
③SqlSession
相当于连接池的一个请求
SqlSession的实例不是线程安全的,因此不能被共享,所以最佳作用与是请求或方法作用域
用完知乎需要关闭,否则资源会被占用
4.mybatis增删改查
后续更新
5.动态sql
qlSessionFactoryBuilder.build(resourceAsStream);
} catch (IOException e) {e.printStackTrace();}
}
②SqlSessionFactory> 可以通俗理解为我们的数据库连接池
>
> SqlSessionFactory一旦创建就应该在运行期间一直存在,没有任何理由丢弃它或者重新创建另一个实例
>
> SqlSessionFactory的最佳作用域是应用层上的,这种实现可以通过使用单例或静态单例模式③SqlSession> 相当于连接池的一个请求
>
> SqlSession的实例不是线程安全的,因此不能被共享,所以最佳作用与是请求或方法作用域
>
> 用完知乎需要关闭,否则资源会被占用# 4.mybatis增删改查后续更新# 5.动态sql后续更新
Mybatis详细教程相关推荐
- springboot整合mysql5.7_详解SpringBoot整合MyBatis详细教程
1. 导入依赖 首先新建一个springboot项目,勾选组件时勾选Spring Web.JDBC API.MySQL Driver 然后导入以下整合依赖 org.mybatis.spring.boo ...
- SpringBoot整合MyBatis详细教程~
目录 1. 导入依赖 2. 连接数据库 3. 编写数据库配置信息 4. 编写pojo实体类 5. 编写mapper接口 6. 编写mapper.xml 7. 编写controller 8. 测试 1. ...
- idea 配置mysql逆向_IDEA中Mybatis的MGB使用逆向工程配置的详细教程
添加依赖 添加generatorConfig.xml文件 在maven的plugins中运行mybatis-generator插件 注意事项: (1).generatorConfig.xml文件需要放 ...
- mybatis实战教程(mybatis in action),mybatis入门到精通
目录(?) [-] mybatis实战教程mybatis in action之一开发环境搭建 mybatis实战教程mybatis in action之二以接口的方式编程 mybatis实战教程 ...
- SpringCloud详细教程(上)
[订阅专栏合集,关注公众号,作者所有付费文章都能看(持续更新)] 推荐[SpringCloud教程]https://blog.csdn.net/hellozpc/article/details/836 ...
- mybatis-generator生成带中文注释POJO类的超详细教程含代码和图解
mybatis-generator生成带中文注释POJO类的超详细教程含代码和图解 mybatis-generator自动生成带中文注释POJO类和增删改查,idea和eclipes都可以使用 MyC ...
- 手把手从零开始搭建k8s集群超详细教程
本教程根据B站课程云原生Java架构师的第一课K8s+Docker+KubeSphere+DevOps同步所做笔记教程 k8s集群搭建超详细教程 1. 基本环境搭建 1. 创建私有网络 2. 创建服务 ...
- win10系统优化计算机,全面优化win10电脑系统详细教程 | 专业网吧维护
全面优化win10电脑系统详细教程 以下针对win10系统的电脑全面优化的步骤: 步骤1:禁止开机启动项 1.首先我们先来优化开机速度,拖慢开机速度的首先是开机自启动项,Ctrl + Shift + ...
- GPU运行Tensorflow详细教程及错误解决
GPU运行Tensorflow详细教程及错误解决 前提条件 配置GPU运行 确认是否成功配置 出现的错误及解决方案 前提条件 最重要的一点:CUDA与tensorflow的版本一点要对应,不然用不了! ...
- VMware虚拟机安装黑苹果MacOS Mojave系统详细教程
更多资源请百度搜索:前端资源网 欢迎关注我的博客:www.w3h5.com 最近遇到一个H5页面的 iPhone X 刘海兼容问题.查到一个 XCode 编辑器,可以模拟 iPhone X 环境运行. ...
最新文章
- 怎么把项目推到gitlab上_将本地项目添加到 GitLab 上管理
- jdk官方版 v1.7+安装教程
- 安徽大学计算机考研失败,回馈:2014年安徽大学计算机初试回忆题,我是雷锋,低调...
- vux 组件库首次使用安装
- Surging1.0发布在即,.NET开发者们,你们还在等什么?
- charles请求转发_Charles安装与基本操作
- Python调用C函数的方法以及如何编写Python的C扩展
- 缓存LruCache简单创建和使用
- Centos 下Nginx 自启动脚本
- c#连接kafka_c#操作kafka(上)搭建kafka环境
- 并发(concurrent)、并行(parallel)、顺序(sequential)、串行(serial)是什么 区别
- VM虚拟机手动配置IP地址
- Spring Framework 官方文档学习(二)之IoC容器与bean lifecycle
- 求1+2阶乘+3阶乘+ 省略 +20阶乘的和
- Tcl 语言 ——表达式篇
- 二项式分布(Binomial Distribution)
- 如何为摇滚音乐选择吉他音箱,创作原创音乐
- python的数据与matlab互通:SciPy
- 什么是企业微信scrm系统?企业微信SCRM系统有什么功能?企业微信SCRM系统推荐。
- 申请CSC公派访问学者的常见问题