Mybaits整合笔记

目录

1.mybaits概述

1.1Mybatis简述

1.2mybatis核心及相关概念

2.入门案例

2.1项目结构及创建步骤:

2.2 修改pom文件

2.3 创建核心配置文件application.yml

2.4 创建pojo类,封装数据为对象

2.5 创建映射文件,写Sql语句

2.6 创建映射接口,引入核心配置

2.7 创建测试类 完成数据的查询

2.8调用流程以及简化结构

3.mybati整合升级

3.1将核心配置文件夹合并.springBootx整合mybatis

 3.2会话工厂用mybatis-plu代替,使用接口继承调用其方法

4.动态sql语句的测试

4.1查询数据库数据

4.2sql语句规范

4.3MP相关ApI语法

4.4数据库mp练习


1.mybaits概述

1.1Mybatis简述

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

MyBatis 是一款优秀的**持久层框架**,它支持定制化 SQL、存储过程以及高级映射。MyBatis 避免了几乎所有的 JDBC 代码和手动设置参数以及获取结果集。MyBatis 可以使用简单的 XML 或注解来配置和映射原生信息,将接口和 Java 的 POJOs(Plain Ordinary Java Object,普通的 Java对象)映射成数据库中的记录。

1.2mybatis核心及相关概念

核心:简化了JDBC操作数据库的过程,是一个优秀的ORM框架,

两个配置文件:

         核心配置文件---用来配置数据库的连接的参数

        映射文件用来写SQL

两个核心工具类

         Splsessionfatory---会话工厂,用来产生会话

         sqlSession --会话,用来执行SQL

相关概念:

ORM---对象关系映射:是指把表里字段的值,自动映射给类里的属性

 ​​​​​​​

1.3 mybatis其他概念

mybatis除了对应的核心概念外,还有其他许多东西需要我们去理解和学习,具体可以参考mybatis官网的说明:​​​​​​​MyBatis中文网

本文章只是说明一个大概,mybatis具体应用很多,我们会通过后边的实例进行讲解和说明。

1.3.1 配置

MyBatis 的配置文件包含了会深深影响 MyBatis 行为的设置和属性信息。 配置文档的顶层结构如下:

其中properties和mapper是我们经常看到和配置,具体实例如下:

1.3.2 XML 映射器

MyBatis 的真正强大在于它的语句映射,这是它的魔力所在。由于它的异常强大,映射器的 XML 文件就显得相对简单。如果拿它跟具有相同功能的 JDBC 代码进行对比,你会立即发现省掉了将近 95% 的代码。MyBatis 致力于减少使用成本,让用户能更专注于 SQL 代码。

select

查询语句是 MyBatis 中最常用的元素之一——光能把数据存到数据库中价值并不大,还要能重新取出来才有用,多数应用也都是查询比修改要频繁。 MyBatis 的基本原则之一是:在每个插入、更新或删除操作之间,通常会执行多个查询操作。

insert, update 和 delete

数据变更语句 insert,update 和 delete 的实现非常接近:

sql

这个元素可以用来定义可重用的 SQL 代码片段,以便在其它语句中使用。 参数可以静态地(在加载的时候)确定下来,并且可以在不同的 include 元素中定义不同的参数值。比如:

<sql id="userColumns"> ${alias}.id,${alias}.username,${alias}.password </sql>

参数

之前见到的所有语句都使用了简单的参数形式。但实际上,参数是 MyBatis 非常强大的元素。

结果映射

resultMap 元素是 MyBatis 中最重要最强大的元素。它可以让你从 90% 的 JDBC ResultSets 数据提取代码中解放出来,并在一些情形下允许你进行一些 JDBC 不支持的操作。实际上,在为一些比如连接的复杂语句编写映射代码的时候,一份 resultMap 能够代替实现同等功能的数千行代码。ResultMap 的设计思想是,对简单的语句做到零配置,对于复杂一点的语句,只需要描述语句之间的关系就行了。

自动映射

正如你在前面一节看到的,在简单的场景下,MyBatis 可以为你自动映射查询结果。但如果遇到复杂的场景,你需要构建一个结果映射。 但是在本节中,你将看到,你可以混合使用这两种策略。让我们深入了解一下自动映射是怎样工作的。

缓存

MyBatis 内置了一个强大的事务性查询缓存机制,它可以非常方便地配置和定制。 为了使它更加强大而且易于配置,我们对 MyBatis 3 中的缓存实现进行了许多改进。

默认情况下,只启用了本地的会话缓存,它仅仅对一个会话中的数据进行缓存。 要启用全局的二级缓存,只需要在你的 SQL 映射文件中添加一行:

<cache/>

基本上就是这样。这个简单语句的效果如下:

  • 映射语句文件中的所有 select 语句的结果将会被缓存。
  • 映射语句文件中的所有 insert、update 和 delete 语句会刷新缓存。
  • 缓存会使用最近最少使用算法(LRU, Least Recently Used)算法来清除不需要的缓存。
  • 缓存不会定时进行刷新(也就是说,没有刷新间隔)。
  • 缓存会保存列表或对象(无论查询方法返回哪种)的 1024 个引用。
  • 缓存会被视为读/写缓存,这意味着获取到的对象并不是共享的,可以安全地被调用者修改,而不干扰其他调用者或线程所做的潜在修改。

提示 缓存只作用于 cache 标签所在的映射文件中的语句。如果你混合使用 Java API 和 XML 映射文件,在共用接口中的语句将不会被默认缓存。你需要使用 @CacheNamespaceRef 注解指定缓存作用域。

2.入门案例

2.1项目结构及创建步骤:

步骤:

  1. 修改pom文件,添加Mybaits的jar包依赖 My-baits-Spring-boot-starter
  2. 创建核心配置文件,指定连接数据库的参数 dreiver url, username passsword
  3. 创建映射文件,写Sql
  4. 创建user类     可用lombok快速编程
  5. 在核心配置文件中引入映射文件 <mappers>
  6. 创建测试类

入门案例结构

2.2 修改pom文件

  <!--连接mybait导包-->
    <dependency>
        <groupId>mysql</groupId>
        <artifactId>mysql-connector-java</artifactId>
        <version>8.0.19</version>
    </dependency>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-jdbc</artifactId>
        <version>2.5.2</version>
    </dependency>
    <dependency>
        <groupId>org.mybatis.spring.boot</groupId>
        <artifactId>mybatis-spring-boot-starter</artifactId>
        <version>2.2.0</version>
    </dependency>

2.3 创建核心配置文件application.yml

#设立服务器端口号
server:
  port: 2340

2.4 创建pojo类,封装数据为对象

@Data //get set tostring
@Accessors(chain = true)
//@Component
public class User implements Serializable {
    //序列化:保证数据传输的完整性
    private Integer id;
    private String name;
    private Integer age;
    private String sex;
}

2.5 创建映射文件,写Sql语句

映射文件Mybatis/UserMapper.xml

<?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必须与接口一一对应  -->
<mapper namespace="com.jt.mapper.UserMapper">
    <sql id="cols">
        id,name,age,sex
    </sql>
    <!--CRUD
        定义别名包: 添加了别名包之后可以简化resultType编辑.
    -->
    <select id="getAll" resultType="User">
        select * from demo_user
    </select>

</mapper>

接口文件UserMapper,sql语句与接口内的方法一一对应

public interface  UserMapper {
    List<User> getAll();

2.6 创建映射接口,引入核心配置

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

<!-- mybatis的核心配置文件 -->
<configuration>
    <!--用来设置别名,type是类的全路径,alais是以后要用的别名-->

    <typeAliases>
        <typeAlias type="cn.tedu.pojo.User" alias="User"></typeAlias>
    </typeAliases>

    <environments default="test">
        <environment id="test">
            <transactionManager type="JDBC"></transactionManager>
            <dataSource type="POOLED">
                <property name="driver" value="com.mysql.cj.jdbc.Driver"/>
                <property name="url" value="jdbc:mysql://localhost:3306/
                mybatisdb?characterEncoding=utf8&amp;serverTimezone=Asia/Shanghai" />
                <property name="username" value="root"/>
                <property name="password" value="root"/>
            </dataSource>
        </environment>
    </environments>
    <!--引入映射文件-->
    <mappers>
        <mapper resource="mapper/UserMapper.xml"></mapper>
        <mapper resource="mapper/DeptMapper.xml"></mapper>
    </mappers>


</configuration>

2.7 创建测试类 完成数据的查询

  @Test
    public void get() throws IOException {
        //1,读取核心配置文件  2,创建会话工厂
        //3,创建Sql会话工厂  4,执行sql  5,处理结果

        //1,读取核心配置文件.
        InputStream in = Resources.getResourceAsStream("mybaits-config.xml");
        //2,创建会话工厂工厂
        SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(in);
        //3,创建Sql会话工厂
        SqlSession session =factory.openSession();
        //4,执行sql
        //session.selectList("namespace的值.id的值");//查询出多个结果
        List<User> list=session.selectList("UserMapperNS.getAll");//查询出多个结果
        //5,处理结果
        for(User u:list){
            System.out.println(u);
        }

    }

2.8调用流程以及简化结构

简化别名

 模拟会话工厂调用

3.mybati整合升级

3.1将核心配置文件夹合并.springBootx整合mybatis


#设立服务器端口号
server:
  port: 2340

#spring连接数据库
spring:
  datasource:
    driver-class-name: com.mysql.cj.jdbc.Driver
    url: jdbc:mysql://127.0.0.1:3306/jt?serverTimezone=GMT%2B8&useUnicode=true&characterEncoding=utf8&autoReconnect=true&allowMultiQueries=true
    username: root
    password: lydon

#SpringBoot整合mybatis配置
mybatis:
  type-aliases-package: com.jt.pojo
  mapper-locations: classpath:/mybatis/*.xml
  
#开启驼峰映射
  configuration:
    map-underscore-to-camel-case: true

 3.2会话工厂用mybatis-plu代替,使用接口继承调用其方法

   pom.xml中的配置

<!--导入MP包之后,删除原有的Mybatis的包 -->
        <dependency>
            <groupId>com.baomidou</groupId>
            <artifactId>mybatis-plus-boot-starter</artifactId>
            <version>3.4.3</version>
        </dependency>

接口调用方法


4.动态sql语句的测试

4.1查询数据库数据

include标签:

<sql id="cols">
        id,name,age,sex
    </sql>

<select id="getById" resultType="User">
        select
        <include refid="cols"></include>
        from demo_user where id=1
    </select>

if标签:双重判定

<select id="getNameAge" resultType="User">
        select
        <include refid="cols"></include>
        from demo_user
        <if test="name!=null">
        <if test="age!=age">
            where name=#{name}
            and age=#{age}
        </if>
        </if>
    </select>

foreach遍历标签:循环

<select id="getByIdTri" resultType="User">
        select
        <include refid="cols"></include>
        from demo_user
        where id in
        <foreach collection="ids" item="id" index="index"
                 separator="," open="(" close=")">
            #{id}
        </foreach>
    </select>

4.2sql语句规范

查询:

<select id="getAll02" resultType="Student">
        select * from students
    </select>

删除:

<delete id="deleteBYId" parameterType="">
        delete * from student where id=#{id}
    </delete>

插入:

<insert id="insert" parameterType="">
        insert from student values id={id},name=#{name},brand=#{brand}
    </insert>

更新(修改):

<update id="updataById" parameterType="">
        update from student where id=#{id}
    </update>

4.3MP相关ApI语法

1.in和or

/**
     * 案例6: 查询Id=1,3,5,6,7的数据
     * 关键字: 单表查询  in or 效率相差不大
     *        多表查询时  建议使用 or 性能更快
     * 可变参数类型:
     *      1.可变参数类型 数据结构实质是一个数组.
     *      2.定义可变参数类型时,必须位于方法参数的最后一位!
     *      void addUser(Integer age,Integer... ids);
     *      void addUser(Integer age,Integer[] ids);
     */
   @Test
    public void testIn(){
        //1.方法1 条件构造器
        QueryWrapper<User> queryWrapper = new QueryWrapper<>();
        //queryWrapper.in("age","1,3,5,6,7");
        queryWrapper.in("id",1,2,3,4,5,6);
        List<User> userList1 = userMapper.selectList(queryWrapper);
        //2.MP 特殊方法调用 以后尽可能使用对象类型(对象有方法)
        Integer[] ids = new Integer[]{1,2,3,4,5,6};
        List idList = Arrays.asList(ids);
        List<User> userList2 = userMapper.selectBatchIds(idList);
        System.out.println(userList1);
        System.out.println(userList2);
    }

2 条件构造器-动态Sql

 /**
     * 案例7: 根据 name/sex 动态查询数据库
     * 解析:  如果name/sex有值则动态拼接where条件.
     *       否则不写where条件.
     * 动态Sql实现: condition 参数
     *             布尔类型值  true:  拼接where条件
     *                        false: 不拼接where条件
     * 字符串判断API:
     *      StringUtils.hasLength(name);
     */
    @Test
    public void testSelectNS(){
        String name = null;
        String sex = "";
        QueryWrapper<User> queryWrapper = new QueryWrapper();
        //判断是否有值
        boolean nameFlag = StringUtils.hasLength(name);
        boolean sexFlag =  StringUtils.hasLength(sex);
        queryWrapper.eq(nameFlag,"name",name)
                    .eq(sexFlag,"sex",sex);
        List userList = userMapper.selectList(queryWrapper);
        System.out.println(userList);
    }

4.4数据库mp练习

练习Mybatis sql操作
1.根据Id=1 查询用户


2.根据name=“王昭君” 和sex=“女” 查询数据.


3.利用模糊查询: 查询name包含"精"的数据.


4.查询demo_user表中的数据要求按照年龄排序,如果年龄相同按照性别排序.


5.根据name和age动态查询查询数据 如果name和age不为null则拼接where条件
中间使用 and链接
Sql: select * from demo_user where name=“xxx” and age=“xxx”


6.查询ID=1,3,4,6,7的数据
 

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值