Mybatis
Ⅰ、Mybatis简介 0
mybatis——持久层(javaWeb dao层)、轻量级、操作数据库的框架,将数据库中的表与javaBean一 一 映射起来,查询结果自动封装起来不需要处理结果集。JDBC中自动提交sql语句,完成持久化;但是mybatis默认关闭自动提交,所以需要手动提交,完成持久化。
持久化——就是将瞬时数据(比如内存中的数据,是不能永久保存的)持久化为持久数据(比如持久化至数据库中,能够长久保存)。
引用百度百科——

MyBatis 是一款优秀的持久层框架,它支持定制化 SQL、存储过程以及高级映射。MyBatis 避免了几乎所有的 JDBC 代码和手动设置参数以及获取结果集。MyBatis 可以使用简单的 XML 或注解来配置和映射原生信息,将接口和 Java 的 POJOs(Plain Ordinary Java Object,普通的 Java对象)映射成数据库中的记录。Mybatis是一个半自动的ORM(object relation mapping对象关系映射)框架,指的是mybatis支持自定义sql语句,并且可以将数据库中的表和java中的bean对象做一一映射。
框架——框架的本质就是一系列的工具类,能够实现部分功能,使用框架做开发,可以大量的简化开发。
把Mybatis的功能架构分为三层:

Ⅱ、入门案例
👉点击👈https://blog.youkuaiyun.com/Today_He/article/details/109313654
Ⅲ、主配置文件
链接:https://www.w3cschool.cn/mybatis/7zy61ilv.html
主配置文件:
<?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>
<environments default="development">
<environment id="development">
<transactionManager type="JDBC"/>
<dataSource type="POOLED">
<property name="driver" value="com.mysql.cj.jdbc.Driver"/>
<property name="url" value="jdbc:mysql://127.0.0.1:3306/school?characterEncoding=utf-8&serverTimezone=UTC"/>
<property name="username" value="root"/>
<property name="password" value="123456"/>
</dataSource>
</environment>
</environments>
<mappers>
<mapper resource="StudentMapper.xml"/>
</mappers>
</configuration>
一、properties标签 0
1、在properties标签中使用propertie子标签进行赋值,例如:
<properties resource="">
<property name="username" value="root"/>
</properties>
2、常用,获取配置文件的值,完成属性赋值
配置文件db.properties
db.driver=com.mysql.cj.jdbc.Driver
db.url=jdbc:mysql://localhost:3306/school?characterEncoding=utf-8&serverTimezone=UTC
db.username=root
db.password=123456

3、在通过方法参数传递处赋值,例如:
<dataSource type="POOLED">
<property name="username" value="root"/>
</dataSource>
通过方法参数传递的属性具有最高优先级(最后读取),resource / url属性中指定的配置文件次之(中间读取),最低优先级的是properties属性中指定的属性(最先读取)。 name同名时,后读取的value会覆盖先读取的value
二、settings标签
一些特殊设置,比如延迟加载、开启缓存、开启懒加载等
【待补充】
三、typeAliases标签
类型别名——类型别名是为Java类型设置一个短的名字(注意是为bean包下的实体类取别名) 。它只和XML配置有关,存在的意义仅在于减少类别完全限定名的冗余。
1、单一取别名
<!--取别名-->
<typeAliases>
<typeAlias type="com.hbw.bean.Student" alias="ss"></typeAlias>
</typeAliases>
<!--比如需要使用com.hbw.bean.Student全类名,那么我就可是使用ss(随便取的)来代替它-->
2、常用,批量取别名
<!--那么当使用com.hbw.bean下面的其他实体类时,使用首字母小写的实体类名即可-->
<!--例如:student就代表com.hbw.bean.Student-->
<!--当然这是没有注解的情况,当有注解时,注解的值优先。@Alias("stu")-->
<typeAliases>
<package name="com.hbw.bean"/>
</typeAliases>
3、jdk常见数据类型
基本数据类型,在其前面加下划线(_int)
引用类型,使用首字母小写(integer)

四、plugins标签
插件。
MyBatis允许您在已映射语句执行过程中的某些点进行拦截调用。有时情况下,MyBatis允许使用插件来拦截的方法调用包括:
- 执行程序(更新,查询,flushStatements,提交,回滚,getTransaction,关闭,isClosed)
- ParameterHandler(getParameterObject,setParameters)
- ResultSetHandler(handleResultSets,handleOutputParameters)
- StatementHandler(准备,参数化,批处理,更新,查询)
以分页插件举例:
1、导入分页插件的jar包
<dependency>
<groupId>com.github.pagehelper</groupId>
<artifactId>pagehelper</artifactId>
<version>5.1.3</version>
</dependency>
2、在mybatis主配置文件中引入插件
通过 MyBatis 提供的强大机制,使用插件是非常简单的,只需实现 Interceptor 接口,并指定想要拦截的方法签名即可。

3、使用插件
@Test
public void testStu() throws IOException {
//读取核心配置文件
InputStream inputStream = Resources.getResourceAsStream("mybatiesConfig.xml");
//构建SqlSessionFactory
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
//构建SqlSession
SqlSession sqlSession = sqlSessionFactory.openSession();
//从1开始,查询5条
PageHelper.startPage(1,5);
//将查询结果集封装在list集合中
List<Student> list = sqlSession.selectList("com.hbw.dao.StudentDao.selectStudent");
for(Student stu : list){
System.out.println(stu);
}
//统计总条数
PageInfo<Student> pageCount = new PageInfo<>(list);
System.out.println(pageCount.getTotal());
sqlSession.commit();
sqlSession.close();
}
五、environments标签 0
必备,配置环境。
MyBatis可以配置成适应多种环境,这种机制有助于将SQL映射到多种数据库之中,现实情况下有多种理由需要这样做。例如,开发,测试和生产环境需要有不同的配置;或者共享相同Schema的多个生产数据库,想使用相同的SQL映射。许多类似的用例。
不过,如果你想连接两个数据库,就需要创建两个SqlSessionFactory实例,每个数据库对应一个。而如果是三个数据库,就需要三个实例,依此类推,记起来很简单:
每个数据库对应一个SqlSessionFactory实例
<!--用于配置数据库操作环境,通过default属性指定要使用的具体数据库环境,其值对应的是数据库环境id-->
<environments default="development">
<!--定义某个数据库环境-->
<environment id="development">
<!--数据库事务管理,type取值:
JDBC:表示使用jdbc的方式来管理事务
MANAGED:表示使用其他容器例如spring提供的事务管理-->
<transactionManager type="JDBC"/>
<!--数据源配置,属性type表示获取连接的方式:
POOLED:表示从mybatis默认的数据库连接池中获取连接;
UNPOOLED:表示每次获取连接都会去新建一个连接;
JNDI:java naming directory interface表示java命名注册接口,将数据源提取出来配置到tomcat容器中,通过固定API获取连接,
目的:让数据源彻底和项目解耦-->
<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>
六、mappers标签 0
必备,映射器——Java在自动查找这方面没有提供一个很好的方法,所以最佳的方式是告诉MyBatis到哪里去找映射文件
这里的resource、url、class都是指的主程序配置文件夹Resouces,所以需要注意路径问题。比如,我需要使用StudentMapper.xml那么直接填写resource、url、class=“StudentMapper.xml”

1、最常用的映入方式 0
<!-- 使用相对于类路径的资源引用 -->
<mappers>
<mapper resource="org/mybatis/builder/AuthorMapper.xml"/>
<mapper resource="org/mybatis/builder/BlogMapper.xml"/>
<mapper resource="org/mybatis/builder/PostMapper.xml"/>
</mappers>
2、通过文件名称引入,基本不用
<!-- 使用完全限定资源定位符(URL) -->
<mappers>
<mapper url="file:///var/mappers/AuthorMapper.xml"/>
<mapper url="file:///var/mappers/BlogMapper.xml"/>
<mapper url="file:///var/mappers/PostMapper.xml"/>
</mappers>
3、这种使用方式要求映射配置文件和接口同名且在同一个包下
<!-- 使用映射器接口实现类的完全限定类名 -->
<mappers>
<mapper class="org.mybatis.builder.AuthorMapper"/>
<mapper class="org.mybatis.builder.BlogMapper"/>
<mapper class="org.mybatis.builder.PostMapper"/>
</mappers>
<!-- 将包内的映射器接口实现全部注册为映射器 -->
<mappers>
<package name="org.mybatis.builder"/>
</mappers>
Ⅳ、映射配置文件 0
主配置文件与映射配置文件的关系:主配置文件通过映射器mappers,找到映射配置文件
映射配置文件:
<?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">
<!--namespace命名空间,xml映射配置文件的唯一标识-->
<mapper namespace="com.hbw.dao.StudentDao">
<select id="selectStudent" resultType="ss">
select sid,sname,sage,ssex,semail from student
</select>
</mapper>
1、cache标签
映射配置文件中的缓存标签,用于设置二级缓存配置;
cache-ref标签
用于缓存配置,应用其他映射配置文件中的缓存配置;
2、resultMap标签 0
结果集映射标签,通常用于定义结果集映射。-
<resultMap id="studentResult" type="student">
<!--
标签:
id标签通常用于主键字段映射
属性:
column:指的是数据库表中字段名称;
jdbcType:指的是数据库表中字段数据类型;
property:指的是返回数据类型中的属性名称;
javaType:指的是返回数据类型中的属性名称对应的数据类型(查询才需要)
-->
<id column="sid" jdbcType="BIGINT" property="sid" javaType="_int"></id>
<!--result标签表示普通字段映射,属性同id标签相同-->
<result column="sname" property="sname"></result>
<result column="sage" property="sage"></result>
<result column="ssex" property="ssex"></result>
</resultMap>
<!--
所有查询语句必须指定返回数据类型,返回数据类型指定属性:
resultType:当查询数据库字段名称和返回数据类型属性名称一致时,使用resultType指定返回数据类型
resultMap:当查询数据库字段名称和返回数据类型属性名称不一致时,和当做多表查询时,需要使用resultMap指定返回数据类型
-->
<select id="selectStudent" resultMap="studentResult">
select sid,sname,sage,ssex from student where sid = #{id}
</select>
3、sql标签
当需要使用重复的sql语句时,给这个sql语句片段取个别名,需要使用时,引入即可(封装)
<!--用于定义sql片段-->
<sql id="StudentSql">
select sid,sname,sage,ssex from student
</sql>
<!--在需要的地方引用sql片段:-->
<include refid="StudentSql"></include>
4、insert标签(update标签、delete标签)
1)新增返回主键值
常用属性:useGeneratedKeys指定是否返回新增主键值,keyProperty指定新增返回属性值的具体位置(指的是返回到传入参数中的位置)
<insert id="insertStudent" useGeneratedKeys="true" keyProperty="sid">
insert into student(sid,sname,sage,ssex)value (#{sid},#{sname},#{sage},#{ssex})
</insert>
2)新增返回主键值
使用mysql自带函数last_lnsert_id()
【好丑,待修改】

5、select标签 0
用于定义查询sql语句,必须指定返回数据类型,返回数据类型指定:resultType和resultMap
resultType的值指的是返回数据类型的全限定名称或者别名;
resultMap的值指的是自定义结果集映射的id;
见(2、resultMap标签👆)
Ⅴ、基于接口代理的方式操作数据库 0
什么意思?
即,代码访问dao层接口的某个方法,dao层接口中的该方法访问mapper.xml。然后依次返回…
举例:
一、新建dao层StudentDao接口
public interface StudentDao {
public Student getStudentById(int sid);
}
二、新建映射配置文件StudentMapperDao.xml 0
<?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语句如何一一对应的?
1)接口全限定名称(全类名)和映射配置文件命名空间(namespace)的值一致;
2)接口方法名称和sql语句的id值一致
-->
<mapper namespace="com.hbw.dao.StudentDao">
<select id="getStudentById" resultType="ss">
select sid,sname,sage,ssex,semail from student where sid = #{id}
</select>
</mapper>
三、在主配置文件中添加映射
注意,是在mappers标签中新增mapper子标签
<mapper resource="StudentMapperDao.xml"/>
四、测试
注意,有许多赘余的代码,可以将其提取出来,生成工具类,这里省略…
@Test
public void testStuById() throws IOException {
//读取核心配置文件
InputStream inputStream = Resources.getResourceAsStream("mybatiesConfig.xml");
//构建SqlSessionFactory
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
//构建SqlSession
SqlSession sqlSession = sqlSessionFactory.openSession();
//类似接口的实现(自动生成代理类接口实例)
StudentDao sd = sqlSession.getMapper(StudentDao.class);
//传入实参sid=17
Student stu = sd.getStudentById(17);
System.out.println(stu);
//默认关闭自动提交事务,所以这里需要手动提交事务
sqlSession.commit();
//释放资源
sqlSession.close();
}
Ⅵ、模糊查询 0
1、常用,使用#{}传参实现模糊搜索:
select sid,sname,sage,ssesx from student where sname like concat('%',#{sname},'%')
2、使用${}传参实现模糊搜索(必须在传入参数名称处加上注解@param,且注解名称和传入参数名称一致):
@param注解处于Dao层,是为了传递多个参数,解决可读性和直观性。有点像取别名,给形参取个别名,mapper.xml文件再根据注解取的别名获取值
select sid,sname,sage,ssesx from student where sname like '%${sname}%'
#{}和${}的区别:0
#{}相当于jdbc中的占位符(?),做了sql校验,可以防止sql注入;
${}就是字符串,仅仅相当于字符串的拼接,不做任何校验,无法防止sql注入;
Ⅶ、单、多参数传递
1、单个参数传递时,mybatis默认根据参数类型获取参数值,参数名称随意取;
2、多参数传递时,传参方式有以下四种:
*将多个参数封装到对象中传递,保证获取参数名称和对象属性名称一致;(最常用方式)
直接将多个参数传入到方法中,只能通过索引来获取参数设置到sql语句中(argo,arg1或者0,1等等):
直接将多个参数传入方法中,通过在方法参数上添加注解@param来获取多个参数,获取参数名称必须和@Param注解名称一致;
将多个参数封装到map集合中进行传递,根据map集合中的key值来获取参数;
Ⅷ、补充 0
maybatis的常用API
1、Resources:读取主配置文件到输入流;
2、SqlSessionFactroyBuilder:用于构建SqlSessionFactory工厂对象,将配置文件中的所有信息解析后封装到Configuration对象中,并将configuration对象封装到工厂对象中;
3、SqlSession:通过工厂对象SqlSessionFactory可以构建SqlSession,sqlSession中初始化好了Configuration所有配置信息、Excutor执行器、默认开启事务;提供了一系列操作数据库的方法。
mybatis的执行原理 0
1、读取主配置文件以及主配置文件中的映射配置文件;
2、解析配置文件构建工厂对象SqlSessionFactory;
3、根据工厂对象构建SqlSession对象
4、获取接口代理类实例
5、调用接口方法执行数据库操作
6、提交事务(持久化),关闭连接,释放资源
PS:
仅用于学习记录与交流
如有错误,还望指正!!
👉mybatis(中)——操作多表(一对一、一对多、多对多)
👉mybatis(下)——<![CDATA[…]]>、动态sql语句详解、懒加载、缓存、逆向工程、纯注解操作数据库
本文详细介绍了MyBatis框架的基本概念、配置文件结构及其组成部分,包括properties、settings、typeAliases等标签的使用方法,以及映射配置文件的详细解析。
977

被折叠的 条评论
为什么被折叠?



