IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 大数据 -> 快速上手Mybatis -> 正文阅读

[大数据]快速上手Mybatis

一、Mybatis快速入门

1.添加Mybatis坐标

<!--Mybatis-->
    <dependency>
      <groupId>org.mybatis</groupId>
      <artifactId>mybatis</artifactId>
      <version>3.4.6</version>
    </dependency>
<!--mysql-->
    <dependency>
      <groupId>mysql</groupId>
      <artifactId>mysql-connector-java</artifactId>
      <version>8.0.26</version>
    </dependency>

2.创建数据表

CREATE DATABASE Mybatis;
CREATE TABLE tbl_employee(
id INT(11) PRIMARY KEY AUTO_INCREMENT,
last_name VARCHAR(255),
gender CHAR(1),
email VARCHAR(255)
)

3.编写实体类

package com.mybatis.domain;

public class Employee {
    private Integer id;
    private String lastname;
    private String email;
    public String gender;

    @Override
    public String toString() {
        return "Employee{" +
                "id=" + id +
                ", lastname='" + lastname + '\'' +
                ", email='" + email + '\'' +
                ", gender='" + gender + '\'' +
                '}';
    }

    public Integer getId() {
        return id;
    }

    public void setId(Integer id) {
        this.id = id;
    }

    public String getLastname() {
        return lastname;
    }

    public void setLastname(String lastname) {
        this.lastname = lastname;
    }

    public String getEmail() {
        return email;
    }

    public void setEmail(String email) {
        this.email = email;
    }

    public String getGender() {
        return gender;
    }

    public void setGender(String gender) {
        this.gender = gender;
    }
}

4.编写映射文件

<?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="employeeMapper">

    <select id="findAll" resultType="com.mybatis.domain.Employee">
        select * from tbl_employee
    </select>

</mapper>

5.编写核心文件

<?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="develop">
        <environment id="develop">
            <transactionManager type="JDBC"></transactionManager>
            <dataSource type="POOLED">
                <property name="driver" value="com.mysql.cj.jdbc.Driver"/>
                <property name="url" value="jdbc:mysql://localhost:3306/mybatis"/>
                <property name="username" value="root"/>
                <property name="password" value="root"/>
            </dataSource>
        </environment>
    </environments>

    <!--加载映射文件-->
    <mappers>
        <mapper resource="com/mybatis/mapper/Employee.xml"/>
    </mappers>


</configuration>

6.编写测试类

package com.mybatis.test;

import com.mybatis.domain.Employee;
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;
import java.util.List;

public class TestEmployee {
    public static void main(String[] args) throws IOException {
        //加载核心配置文件
        InputStream is = Resources.getResourceAsStream("sqlMapConfig.xml");
        //获得sqlSession工厂的对象
        SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(is);
        //获得sqlSession对象
        SqlSession session = sqlSessionFactory.openSession();
        //执行sql语句
        List<Employee> employees = session.selectList("employeeMapper.findAll");
        //打印结果
        System.out.println(employees);
        //释放资源
        session.close();
    }
}

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-WyzfIqhQ-1650846482096)(C:\Users\25654\AppData\Roaming\Typora\typora-user-images\image-20211105231814520.png)]

二、Mybatis增删改查

1.增

@Test
    public void insert() throws IOException {
        //加载核心配置文件
        InputStream is = Resources.getResourceAsStream("sqlMapConfig.xml");
        //获得sqlSession工厂的对象
        SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(is);
        //获得sqlSession对象
        SqlSession session = sqlSessionFactory.openSession();

        int i = session.insert("employeeMapper.insert", new Employee(null, "IsLeeBoer", "Is@com", '1'));

        System.out.println(i);
        session.commit();
        session.close();

    }
<insert id="insert" parameterType="com.mybatis.domain.Employee">
        insert into tbl_employee values(#{id},#{last_name},#{email},#{gender})
    </insert>

2.删

@Test
    public void delete() throws IOException {
        //加载核心配置文件
        InputStream is = Resources.getResourceAsStream("sqlMapConfig.xml");
        //获得sqlSession工厂的对象
        SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(is);
        //获得sqlSession对象
        SqlSession session = sqlSessionFactory.openSession();

        session.delete("employeeMapper.delete",1);

        session.commit();
        session.close();

    }
<delete id="delete" parameterType="java.lang.Integer">
        delete from tbl_employee where id = #{id}
    </delete>

3.改

 @Test
    public void update() throws IOException {
        //加载核心配置文件
        InputStream is = Resources.getResourceAsStream("sqlMapConfig.xml");
        //获得sqlSession工厂的对象
        SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(is);
        //获得sqlSession对象
        SqlSession session = sqlSessionFactory.openSession();

        session.update("employeeMapper.update",3);

        session.commit();
        session.close();

    }
<update id="update" parameterType="java.lang.Integer">
        update tbl_employee set last_name = "Lucy" where id = #{int}
    </update>

三、Mybatis核心配置文件概述

configuration配置

? properties属性

? settings设置

? typeAliases类型别名

? typeHandlers类型处理器

? objectFactory对象工厂

? plugins插件

? environments环境

? environment环境变量

? transactionManager事务管理器

? dataSource数据源

? databaseldProvider数据库厂商标识

? mapperss映射器

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

四、Mybatis相应API

SqlSession工厂构造器SqlSessionFactoryBuilder

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-OYepeVFz-1650846482102)(C:\Users\25654\AppData\Roaming\Typora\typora-user-images\image-20211106002857099.png)]

五、Mybatis的Dao层实现

1.传统模式

2.接口代理模式

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-3DMXvpP9-1650846482103)(C:\Users\25654\AppData\Roaming\Typora\typora-user-images\image-20211106003428183.png)]

 @Test
    public void findById() throws IOException {
        //加载核心配置文件
        InputStream is = Resources.getResourceAsStream("sqlMapConfig.xml");
        //获得sqlSession工厂的对象
        SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(is);
        //获得sqlSession对象
        SqlSession session = sqlSessionFactory.openSession();

        EmployeeDao mapper = session.getMapper(EmployeeDao.class);
        List<Employee> empById = mapper.findEmpById(1);

        System.out.println(empById);
        session.close();

    }
<mapper namespace="com.mybatis.dao.EmployeeDao">
    <select id="findEmpById" parameterType="java.lang.Integer" resultType="com.mybatis.domain.Employee">
        select * from tbl_employee where id=#{id}
    </select>
</mapper>

六、Mybatis映射文件深入

1.动态sql-if

<select id="findEmpByCondition" parameterType="Emp" resultType="Emp">
        select * from tbl_employee
        <where>
            <if test="id!=null">
                and id=#{id}
            </if>
        </where>
    </select>

2.动态sql-foreach

<select id="findByIds" parameterType="list" resultType="Emp">
        select * from tbl_employee
        <where>
            <foreach collection="list" open="id in(" close=")" item="id" separator=",">
                #{id}
            </foreach>
        </where>
    </select>

3.sql代码抽取

<sql id="selectEmp">select * from tbl_employee</sql>
<include refid="selectEmp"></include>

七、Mybatis核心配置文件深入

1.typeHandlers

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-pbfMjfjz-1650846482104)(C:\Users\25654\AppData\Roaming\Typora\typora-user-images\image-20211106112359244.png)]

可以重写类型处理器或创建你自己的类型处理器来处理不支持的或非标准的类型。

实现org.apache.ibatis.type.TypeHandler接口或继承org.apache.ibatis.type.BaseTypeHandler,然后可以选择性的将它映射到一个JDBC类型

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-jmdlYi4c-1650846482105)(C:\Users\25654\AppData\Roaming\Typora\typora-user-images\image-20211106112827455.png)]

package com.mybatis.handler;

import org.apache.ibatis.type.BaseTypeHandler;
import org.apache.ibatis.type.JdbcType;

import java.sql.CallableStatement;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.Date;

public class DateHandler extends BaseTypeHandler<Date> {
    //将·java转为数据库需要类型
    @Override
    public void setNonNullParameter(PreparedStatement preparedStatement, int i, Date date, JdbcType jdbcType) throws SQLException {
        preparedStatement.setLong(i,date.getTime());
    }

    //String参数 要转换的字段名称
    //ResultSet 查询出的结果集
    @Override
    public Date getNullableResult(ResultSet resultSet, String s) throws SQLException {
        Date date = new Date(resultSet.getLong(s));
        return date;
    }

    @Override
    public Date getNullableResult(ResultSet resultSet, int i) throws SQLException {
        Date date = new Date(resultSet.getLong(i));
        return date;
    }

    @Override
    public Date getNullableResult(CallableStatement callableStatement, int i) throws SQLException {
        return null;
    }
}

<typeHandlers>
        <typeHandler handler="com.mybatis.handler.DateHandler"/>
    </typeHandlers>

2.plugins标签

PageHelper

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-jJefAMts-1650846482106)(C:\Users\25654\AppData\Roaming\Typora\typora-user-images\image-20211106121219481.png)]

 <!--pageHelper-->
    <dependency>
      <groupId>com.github.pagehelper</groupId>
      <artifactId>pagehelper</artifactId>
      <version>5.2.0</version>
    </dependency>
    <dependency>
      <groupId>com.github.jsqlparser</groupId>
      <artifactId>jsqlparser</artifactId>
      <version>4.0</version>
    </dependency>
<!--pageHelper-->
    <plugins>
        <plugin interceptor="com.github.pagehelper.PageInterceptor"/>
    </plugins>

八、Mybatis多表操作

<mapper namespace="com.mybatis.dao.OrderMapper">

    <resultMap id="orderMap" type="Orders">
        <!--<id column="oid" property="id"/>
        <result column="ordertime" property="ordertime"/>
        <result column="total" property="total"/>-->

        <result column="uid" property="user.id"/>
        <result column="username" property="user.username"/>
        <result column="password" property="user.password"/>

    </resultMap>

    <select id="findAll" resultMap="orderMap">
        select *,o.id oid from orders o,user u where u.id = o.uid
    </select>

</mapper>

九、Mybatis的注解开发

@Insert

@Update

@Delete

@Select

@Result:实现结果集封装

@Results:可以与@Result一起使用,封装多个结果集

@One:实现一对一结果封装

@Many:实现一对多结果封装

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

十、SSM框架整合

十一、番外

#解决字段名和属性名不一致的情况
属性名empName 字段名emp_name
1.为字段起别名,保存属性和字段名一致
select emp_name empName from 
2.设置mybatis的全局配置,将_自动映射为驼峰
<setting name='mapUnderscoreToCamelCase' value='true'/>
3. resultMap设置
<resultMap id='' type=''> #id唯一标识 type实体类型
	<id property='' column=''> </id>  #主键的映射,property属性名,column字段名
 	<result property='' column=''> </result> #普通字段
</resultMap>
4.SpringBoot整合Mybatis
mybatis.configuration.map-underscore-to-camel-case: true
#解决多对一的映射关系
员工 emp 部门 dept 员工实体类里面包含dept
获取员工及部门的信息
1.级联属性赋值(一条sql语句)
<resultMap id='' type=''> #id唯一标识 type实体类型
	<id property='' column=''> </id>  #主键的映射,property属性名,column字段名
 	<result property='' column=''> </result> #普通字段
 	<result property='dept.name' column='dept_name'> </result> 
</resultMap>
2.通过association(一条sql语句)
<resultMap id='' type=''> #id唯一标识 type实体类型
	<id property='' column=''> </id>  #主键的映射,property属性名,column字段名
 	<result property='' column=''> </result> #普通字段
 	<association property='dept' javaType='dept属性类型'>
 		<id property='id' column='id'> </id>  #主键的映射,property属性名,column字段名
 		<result property='deptName' column='dept_name'> </result> #普通字段
 	</association>
</resultMap>
3.通过association(分步查询,多条sql)
<select id='' resultMap='resultMap'>select * from emp</select>
<select id='' resultMap='resultMap'>select * from dept where did = #{did}</select>
<resultMap id='resultMap' type=''> #id唯一标识 type实体类型
	<id property='' column=''> </id>  #主键的映射,property属性名,column字段名
 	<result property='' column=''> </result> #普通字段
 	<association property='dept'
 				select='命名空间.sql语句的id'
 				column='did'  #分步查询的条件
 				>
 	</association>
</resultMap>
分步查询的优点:可以实现延迟加载
lazyLoadingEnabled:延迟加载的全局开关,当开启时,所有关联对象都会延迟加载
aggressiveLazyLoading:当开启时,任何方法的调用都会加载该对象的所有属性
此时就可以实现按需加载,获取的数据是什么,就只会执行相应的sql.此时通过association和collection中的fetchType属性设置当前的分步查询是否使用延迟加载,fetchType = "lazy"(延迟加载)|"eager"(立即加载)
#解决多对一的映射关系
一个部门 dept 多个员工 emp dept里面有List<emp>
获取部门以及部门中所有员工的信息
1.通过collection(一条sql)
<resultMap id='' type=''> #id唯一标识 type实体类型
	<id property='' column=''> </id>  #主键的映射,property属性名,column字段名
 	<result property='' column=''> </result> #普通字段
 	#collection:处理一对多的映射关系
 	#ofType:表示该属性对应的集合中存储数据的类型
 	<collection property='' ofType='emp的类型'>
 		<id property='' column=''> </id>  #主键的映射,property属性名,column字段名
 		<result property='' column=''> </result> #普通字段	   
 	</collection>		   	   
</resultMap>
2.通过collection(分步查询)
<resultMap id='' type=''> #id唯一标识 type实体类型
	<id property='' column=''> </id>  #主键的映射,property属性名,column字段名
 	<result property='' column=''> </result> #普通字段
 	#collection:处理一对多的映射关系
 	#ofType:表示该属性对应的集合中存储数据的类型
 	<collection property='' 
 			   ofType='emp的类型'
 			   select=''
 			   column=''>
 	</collection>		   	   
</resultMap>
#MyBatis的缓存
1.MyBatis的一级缓存(默认开启)
一级缓存级别是SqlSession级别的,通过同一个SqlSession查询的数据会被缓存,下次查询相同的数据,就会从缓存中直接获取,不会从数据库从新访问
使一级缓存失效的四种情况
	1.不同SqlSession对应不同的一级缓存
	2.同一个SqlSession但是查询条件不同
	3.同一个SqlSession两次查询期间执行了一次增删改操作
	4.同一个SqlSession两次查询期间手动清空了缓存
2.MyBatis的二级缓存
二级缓存是SqlSessionFactory级别,通过同一个SqlSessionFactory创建的SqlSession查询的结果会被缓存,下次查询相同的数据,就会从缓存中直接获取,不会从数据库从新访问
二级缓存开启的条件
	1.在配置文件中,设置全局配置属性cacheEnable = "true",默认为true,不需要设置
	2.在映射文件中设置标签<cache/>
	3.二级缓存必须在sqlsession关闭或提交之后有效
	4.查询的数据所转换的实体类型必须实现序列化接口
二级缓存失效情况	
	1.两次查询之间执行了任意的增删改,会使一级和二级缓存同时失效
二级缓存相关配置(<cache/>)
	1.eviction属性:缓存回收策略
		LRU (Least Recently Used)-最近最少使用的:移除最长时间不被使用的对象。
		FIFO (First in First out)-先进先出:按对象进入缓存的顺序来移除它们。
		SOFT-软引用:移除基于垃圾回收器状态和软引用规则的对象。
		WEAK-弱引用:更积极地移除基于垃圾收集器状态和弱引用规则的对象。默认的是 LRU。
	2.flushInterval属性:刷新间隔,单位毫秒
		默认情况是不设置,也就是没有刷新间隔,缓存仅仅调用语句时刷新
	3.size属性:引用数目,正整数
		代表缓存最多可以存储多少个对象,太大容易导致内存溢出
	4.readOnly属性:只读,true/false
		true:只读缓存;会给所有调用者返回缓存对象的相同实例。因此这些对象不能被修改。这提供了很重要			的性能优势。
		false:读写缓存;会返回缓存对象的拷贝(通过序列化)。这会慢一些,但是安全,因此默认是false。
3.MyBatis缓存查询的顺序
	1.先查询二级缓存,因为二级缓存中可能会有其他程序已经查出来的数据,可以拿来直接使用
	2.如果二级缓存没有命中,再查询一级缓存
	3.如果一级缓存也没有命中,则查询数据库
	4.SqlSession关闭之后,一级缓存中的数据会写入二级缓存
  大数据 最新文章
实现Kafka至少消费一次
亚马逊云科技:还在苦于ETL?Zero ETL的时代
初探MapReduce
【SpringBoot框架篇】32.基于注解+redis实现
Elasticsearch:如何减少 Elasticsearch 集
Go redis操作
Redis面试题
专题五 Redis高并发场景
基于GBase8s和Calcite的多数据源查询
Redis——底层数据结构原理
上一篇文章      下一篇文章      查看所有文章
加:2022-04-26 11:47:11  更:2022-04-26 11:48:54 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/24 3:41:40-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码