【SSM-Mybatis(一)】java持久层框架-Mybatis!本文涵盖介绍Mybatis和基本使用,分析Mybatis核心配置文件
Mybatis 简介
问题与解决方案
- 原始jdbc开发存在的问题:
- 数据库连接、创建、释放频繁造成系统资源浪费从而影响系统性能
- sql语句在代码中硬编码,造成代码不易维护,实际应用sql变化的可能较大,sql变动需要改变java代码
- 查询操作时,需要手动将结果集中的数据手动封装到实体中。查询操作时,需要手动将实体的数据设置到sql语句的占位符位置
- 应对上述问题给出的解决方案:
- 使用数据库连接池初始化连接资源
- 将sql语句抽取到xml配置文件
- 使用反射、内省等底层技术,自动将实体与表进行属性与字段的自动映射
什么是Mybatis?
- mybatis 是一个优秀的基于java的持久层(Dao)框架,它内部封装了jdbc,使开发者只需要关注sql语句本身,而不需要花费精力去处理加载驱动、创建连接、创建statement等繁杂的过程
- mybatis 通过 xml 或注解的方式将要执行的各种 statement 配置起来,并通过java对象和statement中sql的动态参数进行映射生成最终执行的sql语句
- 最后 mybatis 框架执行sql 并将结果映射为java对象并返回。采用ORM(对象关系映射)思想解决了实体和数据库映射问题,对jdbc进行了封装,屏蔽了jdbc api 底层访问细节,使我们不用与jdbc api 打交道,就可以完成对数据库的持久化操作
Mybatis快速入门
开发步骤:
- 添加Mybatis的坐标(不用maven,直接添加Mybatis相关jar包)
- 创建数据表(数据库中的表格,已有不用创建)
- 编写实体类(需要一个实体类来接收数据,有则需要)
- 编写映射文件xxxMapper.xml
- 编写核心文件SqlMapConfig.xml
- 编写测试类
映射文件xxxMapper.xml
<?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 namespace="userMapper"><!--id:设置命名空间中的id,每个id代表着一个方法resultType:指定返回对象的类型,该类型应为实体类
--><select id="findAll" resultType="com.DemoTestNode.entityClass.User"><!-- 存放该方法中包含的sql语句 -->select * from person</select>
</mapper>
核心文件SqlMapConfig.xml
<?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><environments default="developemnt"><!-- 配置标识名 --><environment id="developemnt"><!-- 事务类型管理设置 --><transactionManager type="JDBC"></transactionManager><!-- 配置数据源 --><dataSource type="POOLED"><property name="driver" value="com.mysql.cj.jdbc.Driver"/><property name="url" value="jdbc:mysql://localhost:3306/test_1"/><property name="username" value="root"/><property name="password" value="root"/></dataSource></environment></environments><!-- 设置映射文件路径,这样在配置核心文件时也能够一并将映射文件配置 --><mappers><mapper resource="com/DemoTestNode/mapper/UserMapper.xml"></mapper></mappers></configuration>
编写测试类
@Test
public void test1() throws IOException {// 获取核心配置文件InputStream resourceAsStream = Resources.getResourceAsStream("sqlMapConfig.xml");// 获得session工厂对象SqlSessionFactory build = new SqlSessionFactoryBuilder().build(resourceAsStream);// 获得session回话对象SqlSession sqlSession = build.openSession();// 执行操作 。 参数:namespace . idList<User> userList = sqlSession.selectList("userMapper.findAll");System.out.println(userList);// 释放SessionsqlSession.close();}
Mybatis 上手
插入操作
@Test
public void test2() throws IOException {// 编写实体类User user = new User();user.setName("张老三");user.setSex(19);InputStream resourceAsStream = Resources.getResourceAsStream("sqlMapConfig.xml");SqlSessionFactory build = new SqlSessionFactoryBuilder().build(resourceAsStream);SqlSession sqlSession = build.openSession();// 在执行更新操作时,需要传递类int changeRows = sqlSession.insert("userMapper.addUser", user);// 当 mybatis 执行更新操作时 必须提交事务才可以对数据库的结果产生影响sqlSession.commit();sqlSession.close();}
<select id="addUser" parameterType="com.DemoTestNode.entityClass.User">insert into person values(null ,#{name},#{sex})
</select>
插入操作注意问题
- 插入语句使用insert标签
- 在映射文件中使用parmeterType属性指定要插入的数据类型
- sql 语句中使用#{实体属性名}方式引用实体中的属性值
- 插入操作使用的api是sqlSession.insert(“命名空间.id”,实体类型对象);
- 插入操作涉及数据库数据变化,所以要使用sqlSession对象显示的提交事务
- 即:sqlSession.commit();
修改操作
@Test
public void test3() throws IOException {User user = new User();user.setId(104);user.setName("王老吉");user.setSex(80);// 获取核心配置文件InputStream resourceAsStream = Resources.getResourceAsStream("sqlMapConfig.xml");SqlSessionFactory build = new SqlSessionFactoryBuilder().build(resourceAsStream);SqlSession sqlSession = build.openSession();int changeRows = sqlSession.update("userMapper.updateUser",user);// 当 mybatis 执行更新操作时 必须提交事务才可以对数据库的结果产生影响sqlSession.commit();System.out.println(changeRows);sqlSession.close();
}
<update id="updateUser" parameterType="com.DemoTestNode.entityClass.User">update person set name=#{name},sex=#{sex} where id=#{id}
</update>
修改操作需要注意的问题
- 修改语句使用update标签
- 修改操作使用的API是sqlSession(“命名空间.id”,实体对象);
删除操作
@Test
public void test4() throws IOException {// 获取核心配置文件InputStream resourceAsStream = Resources.getResourceAsStream("sqlMapConfig.xml");SqlSessionFactory build = new SqlSessionFactoryBuilder().build(resourceAsStream);SqlSession sqlSession = build.openSession();int changeRows = sqlSession.delete("userMapper.delUser",104);// 当 mybatis 执行更新操作时 必须提交事务才可以对数据库的结果产生影响sqlSession.commit();System.out.println(changeRows);sqlSession.close();
}
<delete id="delUser" parameterType="java.lang.Integer">delete from person where id=#{id}<!-- 因为只有一个参数,所以#{}中的内容写什么都可以 -->
</delete>
删除操作需要注意的问题:
- 删除语句使用delete标签
- sql语句使用#{任意字符串}方式引用传递的单个参数
- 删除操作使用的API是sqlSession.delete(“命名空间.id”,Object)
查询操作
// 查询全部
@Test
public void test1() throws IOException {// 获取核心配置文件InputStream resourceAsStream = Resources.getResourceAsStream("sqlMapConfig.xml");// 获得session工厂对象SqlSessionFactory build = new SqlSessionFactoryBuilder().build(resourceAsStream);// 获得session回话对象SqlSession sqlSession = build.openSession();// 执行操作 。 参数:namespace . idList<User> userList = sqlSession.selectList("userMapper.findAll");System.out.println(userList);sqlSession.close();
}// 查询单个
@Test
public void test0() throws IOException {InputStream resourceAsStream = Resources.getResourceAsStream("sqlMapConfig.xml");SqlSessionFactory build = new SqlSessionFactoryBuilder().build(resourceAsStream);SqlSession sqlSession = build.openSession();User user = sqlSession.selectOne("userMapper.findOne", 1);System.out.println(user.getName());sqlSession.close();
}
配置文件概述:
MyBatis核心配置文件层级关系:
- configuration 配置:
- properties 属性
- settings 设置
- typeAllases 类型别名
- typeHandlers 类型处理器
- objectFactory 对象工厂
- plugins 插件
- environments 环境
- environment 环境变量
- transactionManager 事务管理器
- dataSource 数据源
- environment 环境变量
- databaseIdProvider 数据库厂商表示
- mappers 映射器
environments 标签
- 数据库环境的配置,支持多环境配置
<environments default="developemnt"><!-- 指定默认环境名称 --><environment id="developemnt"><!-- 指定当前环境的名称 --><transactionManager type="JDBC"></transactionManager><!--指定事务管理类型--><dataSource type="POOLED"><!-- 指定当前数据源类型是链接池 --><!-- 数据源配置 --> <property name="driver" value="com.mysql.cj.jdbc.Driver"/><property name="url" value="jdbc:mysql://localhost:3306/test_1"/><property name="username" value="root"/><property name="password" value="root"/></dataSource></environment>
</environments>
environment 标签
- 其中事务管理器(transactionManager)类型有两种:
- JDBC:这个配置就是直接使用JDBC回滚设置,它依赖于从数据源得到的连接来管理事务作用域。
- MANAGED:这个配置几乎没做什么。它从来不提交或回滚一个连接,而是让容器来管理事务的整个声明周期(比如JEE应用服务器的上下文)。默认情况它会关闭连接,因此需要将closeConnection属性设置为false来阻止它的关闭行为
- 其中,数据源(dataSource)类型有三种:
- UNPOOLED:这个数据源的实现知识每次被请求时打开和关闭连接
- POOLED:这种数据源的实现利用 “池” 的概念将JDBC连接对象组织起来
- JNDI:这个数据源的实现是为了能在如 EJB 或应用服务器这类容器中使用,容器可以集中或在外部配置数据源,然后放置在 JNDI 上下文的引用
Mappers 标签
- 该标签的作用是加载映射的。
<mappers><mapper resource="com/DemoTestNode/mapper/UserMapper.xml"></mapper>
</mappers>
- 加载方式有如下几种:
- 使用相对于类路径的资源引用,例如:
<mapper resource="">
- 使用完全限定资源定位符(URL),例如:
<mapper url="">
- 使用映射器接口实现类的完全限定类名,例如:
<mapper class="">
- 将包内的映射器接口实现全部注册为映射器,例如:
<package name="">
- 使用相对于类路径的资源引用,例如:
properties 标签
<properties resource="指定properties文件"></properties>
typeAliases 标签
-
设置别名
-
在Mybatis中,已经存在了很多别名,例如基本的数据类型
<typeAliases><typeAlias type="com.DemoTestNode.entityClass.User" alias="user"></typeAlias>
</typeAliases>
SqlSession工厂构建器 SqlSessionFactoryBuilder
-
常用API:SqlSessionFactory build(InputStream inputStream)
-
通过加载mybatis的核心文件的输入流的形式构建一个SqlSessonFactory对象
-
其中,Resource工具类,这个类在org.apache.ibatis.io包中。
- Resource类帮助你从类路径下、文件兄台那个或一个web URL中加载资源文件
-
SqlSessionFactory有多个方法创建SqlSession实例。常用有如下两个:
方法 解释 openSession() 会默认开启一个事务,但事务不会自动提交,也就意味着需要手动提交该事务,更新操作数据才会持久化到数据库中 openSession(boolean autoCommit) 参数为是否自动提交,如果设置为true,那么不需要手动提交事务 代理开发方式
代理开发方式介绍:
- 采用Mybaits的代理开发方式实现DAO层的开发,这种方式是我们后面进入企业的主流
- Mapper接口开发方法只需要程序员编写Mapper接口(相等于Dao接口),由Mybatis框架根据接口定义创建接口的动态代理对象,代理对象的方法体同上边Dao接口实现类方法
- Mapper接口开发需要遵循以下规范
- Mapper.xml 文件中的namespace与mapper接口的全限定名相同
- Mapper接口方法名和Mapper.xml中定义的每个statement的id相同
- Mapper接口方法的输入参数类型和mapper.xml中定义的每个sql的parameterType的类型相同
- Mapper接口方法的输出参数类型和mapper.xml中定义的每个sql的resultType的类型相同
😍❤️SSM 专栏前篇
- 【SSM-Spring(一)】初上手Spring?别急!从最底部开始学习Spring吧!从Bean开始!本文介绍Spring程序的开发、Bean的声明周期与依赖注入概念
- 【SSM-Spring(二)】初上手Spring?别急!从最底部开始学习Spring吧!Spring连接数据库、注解开发、Junit测试
- 【SSM-SpringMVC(一)】Spring接入Web环境!本篇开始研究SpringMVC的使用!本文介绍了SpringMVC,以及SpringMVC的执行流程和常用注解解析
- 【SSM-SpringMVC(二)】Spring接入Web环境!本篇开始研究SpringMVC的使用!SpringMVC数据响应和获取请求数据
- 【SSM-Spring(三)】初上手Spring?别急!从最底部开始学习Spring吧!详细介绍SpringAOP切面编程操作和Spring编程式事务控制操作
💕👉博客专栏
-
英语专栏-涵盖绝大多数的英语语法~~基于B站英语兔视频所作的学习笔记
-
Golang专栏-包含基础、Gin、Goam等知识
-
云原生专栏-包含k8s、docker等知识
-
从0开始学习云计算-华为HCIP证书
-
JUC专栏-带你快速领悟JUC的知识!
-
JVM专栏-深入Java虚拟机,理解JVM的原理
-
基于Java研究 数据结构与算法-包含贪心算法、加权图、最短路径算法等知识
-
Docker专栏-上手热门容器技术Docker
-
SpringBoot专栏-学习SpringBoot快速开发后端
-
项目管理工具的学习-设计技术:Maven、Git、Gradle等相关管理工具
-
JavaSE-全面了解Java基础
-
JS专栏-使用JS作的一部分实例~
-
使用CSS所作的一部分案例