Mybatis框架

Mybatis

背景

Mybatis原本是apache的一个开源项目iBatis,2010年这个项目由apache software foundation迁移到了google code,并且改名为MyBatis。

技术

Mybatis是一个持久性框架(dao层,数据访问层,数据持久层)。

对jcbc进行了封装,几乎避免了jdbc中需要未我们手动设置参数和手动映射结果的操作;

将jdbc中的接口进行封装,提供了自己的类的接口实现;

也可以使用xml配置和注解的方式,将数据库中的记录自动映射到java对象中;

一种ORM实现(对象关系映射)是自动将数据映射到对象中的框架;

还提供了动态sql和数据缓存

环境搭建

1.创建maven项目

2.导入Mybatis依赖的jar包

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
​
    <groupId>org.example</groupId>
    <artifactId>Mybatispro</artifactId>
    <version>1.0-SNAPSHOT</version>
​
    <dependencies>
        <!-- 配置mysql -->
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>8.0.16</version>
        </dependency>
​
        <!--  Mybatis  -->
        <dependency>
            <groupId>org.mybatis</groupId>
            <artifactId>mybatis</artifactId>
            <version>3.4.2</version>
        </dependency>
​
        <!--  junit  -->
        <!--  java单元测试框架  -->
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>4.12</version>
            <scope>provided</scope>
        </dependency>
​
​
    </dependencies>
​
</project>

3.创建一个全局的Mybatis配置文件

<?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>
​
    <!--  mybatis全局核心配置文件  -->
    <settings>
        <setting name="logImpl" value="STDOUT_LOGGING"/>
​
        <!--  开启二级缓存  -->
        <setting name="cacheEnabled" value="true"/>
​
    </settings>
​
    <!--  为类配置别名  -->
    <typeAliases>
        <!--<typeAlias type="com.xhz.mybatis.model.Admin" alias="Admin"></typeAlias>-->
        <package name="com.xhz.mybatis.model"/>
    </typeAliases>
​
​
    <!--  配置数据库链接相关信息  -->
    <environments default="development">
        <environment id="development">
            <transactionManager type="JDBC"/>
            <!--  type="POOLED" 使用数据库链接池  -->
            <dataSource type="POOLED">
                <!--   连接配置   -->
                <property name="driver" value="com.mysql.cj.jdbc.Driver"/>
                <property name="url" value="jdbc:mysql://127.0.0.1:3306/ssmdb?serverTimezone=Asia/Shanghai"/>
                <property name="username" value="root"/>
                <property name="password" value="root"/>
            </dataSource>
        </environment>
    </environments>
​
    <!--  注册映射文件  -->
    <mappers>
​
    </mappers>
​
​
​
</configuration>

4.创建数据库、表

5.创建访问接口,定义方法

import com.xhz.mybatis.model.Admin;
import org.apache.ibatis.annotations.Param;
​
public interface AdminDao {
​
    //定义抽象方法
}
​

6.创建接口对应的映射文件

<?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映射实现 主要写sql语句 -->
​
<mapper namespace="com.xhz.mybatis.dao.AdminDao">
    <!-- 在此处进行增删改查sql编写 -->
</mapper>

7、进行测试

//1、读取配置文件
        Reader resourceAsReader= Resources.getResourceAsReader("mybatis.xml");
        //2、创建sqlSessionFactory   负责创建sqlSession对象(数据库的会话对象)
        SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(resourceAsReader);
        //3、创建sqlSession对象
        SqlSession sqlSession = sqlSessionFactory.openSession();
        AdminDao adminDao = sqlSession.getMapper(AdminDao.class);
​
        //让代理对象帮助我们调用映射文件中与此接口中相同名称额方法
       
        /*
            调用方法
        */
​
        sqlSession.commit();
        //关闭会话对象
        sqlSession.close();

补充:

1、在idea中安装mybatisx插件,增加了代码的可读性

2、数据库连接池:

每次访问数据库时,需要创建一个Connection对象,用完后关闭。但是访问量增大后,每次连接都要创建新对象,太耗费资源。

如果使用数据库连接池,在池(集合)中事先创建一些对象,当用户访问时,就取出一个,用完但不销毁,放回池中。这样就能节约不少的资源。

流程图

操作

<insert id="唯一标识" parameterType="参数类型">
    admin(account,password)values(#{account},#{password})
</insert>

<delete id="唯一标识" parameterType="参数类型">
    delete from admin where id= #{id}
</delete>

<update id="唯一标识" parameterType="参数类型">
    update admin set account= #{account},password= #{password} where id= #{id}
</update>

<select id="唯一标识" resultType="返回结果集类型">
	select * from admin where id= #{id}
</select>

事务

  • 数据库事务:是数据库的一种管理机制,对每次连接数据库过程继续管理

  • 保证再一次操作中,执行的多条qdl,要么都成功,要么都不成功

  • 最后提交事务,数据库才会真正执行sql

  • 当insert、update、delete完毕后都需要手动提交事务

  • sqlSession.commit();当程序代码逻辑没有问题时,提交数据库事务执行sql。出现异常则不执行

占位符

#{}:是采用预编译的编译方式向sql传值,可以防止sql注入,是安全的。

当我们需要往sql传值时,使用#{}

${}:采用字符串拼接,将内容直接拼接到sql内容中。

向sql动态传递列名时,使用${}

区别:这两个占位符的底层逻辑不同,使用场景不同

eg:使用order by进行排序时 后面的列名是可以改变的,select同理

参数传递

单个参数直接传递:方法类型 方法名 (参数类型 参数);

多个参数:使用@Param进行绑定

eg:方法类型 方法名 (@Param(参数1)参数类型 参数1,@Param(参数类型 参数2));

映射封装

简单映射

返回单个值,查询单张表,会将结果指自动映射到对象中

对象映射

返回多个值,多表联查,使用resultMap进行自定义映射

resultMap
定义
<!-- <resultMap></resultMap> id是唯一标识符 -->
<resultMap id="findResultMap" type="对象类型">
    <!-- <id></id> 标签是主键映射  -->
	<id column="数据库列名" property="映射对象的属性"/>
     <!-- <result></result> 标签是非主键映射  -->
	<result property="数据库列名" column="映射对象的属性" />
	<result property="数据库列名" column="映射对象的属性" />
</resultMap>
使用
<select id="唯一标识符" resultMap="findResultMap">
    <!-- sql语句 -->
</select>

注解标签

@Insert // 插入 sql , 和 xml insert sql 语法完全一样
@Select // 查询 sql, 和 xml select sql 语法完全一样
@Update // 更新 sql, 和 xml update sql 语法完全一样
@Delete // 删除 sql, 和 xml delete sql 语法完全一样
@Param // 入参
@Results // 设置结果集合
@Result // 结果

动态SQL

动态SQL是Mybatis的一个强大的特性,可以在sql语句中添加逻辑判断。

<!-- 其中常用的动态元素有 -->
1、<where>
    where 其中有if条件成立时,就会自动添加where关键字,还可以删除后面的关键字例如and or
	2、<if test="">
	if-test属性条件成立 执行标签体 否则不执行
	</if>
</where>

3、<trim prefix="where" prefixOverrides="and|or">
	当条件判断有成立时,可以自定义前缀关键字和后缀
    <if test="">
	if-test属性条件成立 执行标签体 否则不执行
	</if>
</trim>

4、<set>
	会删掉额外的逗号
</set>

5、<choose>
    与switch类似
	6、<when>
    传入那个用那个查。可以有多个
    </when>
    7、<otherwise>
    当when都没传入则按照otherwise执行。只能有一个
    </otherwise>
</choose>

8、<foreach>
	对集合进行遍历(尤其是在构建 IN 条件语句的时候)
    
</foreach>

缓存

概述

缓存(cache)分为一级缓存和二级缓存。

一级:默认是SqlSession类型,同时在同一个SqlSession,先将数据缓存到SqlSession对象中;

二级:SqlSessioonFactory级别,可以让多个SqlSession共享数据,默认是没有开启的。若开启了二级缓存,当SqlSession关闭时,会将一级缓存的数据存储到二级缓存中,其他的SqlSession就可以在二级缓存中查询到之前的数据。

1、需要在全局xml文件配置:<setting name="cacheEnabled" value="true"/>

2、同时给POLO类实现序列化接口 Java.io. Serializable

3、在Mapper映射文件中添加<cache>标签,开启二级缓存

流程

先从缓存中查,若没有则去数据库,查询后存到缓存中,返回给服务器

生命周期

开始于SqlSession对象创建;

结束于SqlSession关闭,如果期间进行了增删改,等提交事务后会清空缓存中的数据,以防止脏读;

也可以调用sqlSession.clesrCache()-->强制清空cache

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值