[Mybatis] 笔记

一、入门使用步骤


1.pom.xml添加相关依赖

<dependency>
    <groupId>org.mybatis</groupId>
    <artifactId>mybatis</artifactId>
    <version>3.5.11</version>
</dependency>
<dependency>
    <groupId>mysql</groupId>
    <artifactId>mysql-connector-java</artifactId>
    <version>8.0.28</version>
</dependency>

2.配置 Mybatis-config.xml

这个文件用于解决 jdbc 对于数据库链接、用户名密码等的硬编码问题。

<?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/test"/>
                <property name="username" value="root"/>
                <property name="password" value="123456"/>
            </dataSource>
        </environment>
    </environments>
    <mappers>
<!--        加载sql映射文件-->
        <mapper resource="HeroMapper.xml"/>
    </mappers>
</configuration>

注意到,新版本下 java-connection-mysql 驱动名称变为了 com.mysql.cj.jdbc.Driver ,不再是以前的 com.mysql.jdbc.Driver


3.实现 POJO 类

用于对应数据库中的表,比如说我们有 Hero 这个表

id name hp damage
1 盖伦 3000 800
2 亚索 2000 1200

那么我们就要构造一个符合JavaBean的实体类来保存表中数据,用于读取或修改数据表。

查询过程就是:Mybatis 帮你把表中数据存放到 Hero 实体中; 你修改 Hero 实体;Mybatis 再把修改好的实体里的属性放回 Hero 表中。 Hero 类就成为 Mybatis 帮助你和数据库交流的中介。

修改、增加数据同理。

public class Hero {
    private int id;
    private String name;
    private float hp;
    private int damage;


    public Hero() {
    }

    public Hero(int id, String name, float hp, int damage) {
        this.id = id;
        this.name = name;
        this.hp = hp;
        this.damage = damage;
    }

    /**
     * 获取
     * @return id
     */
    public int getId() {
        return id;
    }

    /**
     * 设置
     * @param id
     */
    public void setId(int id) {
        this.id = id;
    }

    /**
     * 获取
     * @return name
     */
    public String getName() {
        return name;
    }

    /**
     * 设置
     * @param name
     */
    public void setName(String name) {
        this.name = name;
    }

    /**
     * 获取
     * @return hp
     */
    public float getHp() {
        return hp;
    }

    /**
     * 设置
     * @param hp
     */
    public void setHp(float hp) {
        this.hp = hp;
    }

    /**
     * 获取
     * @return damage
     */
    public int getDamage() {
        return damage;
    }

    /**
     * 设置
     * @param damage
     */
    public void setDamage(int damage) {
        this.damage = damage;
    }

    public String toString() {
        return "Hero{id = " + id + ", name = " + name + ", hp = " + hp + ", damage = " + damage + "}";
    }
}

一定要符合JavaBean标准,这样 Mybatis 才会自动隐式地为我们调用 get() set() 方法获取和设置值。


4.配置对应数据表的mapper.xml

把 Hero 表需要用到的 sql 语句配置在 HeroMapper.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="Hero">
    <select id="selectAll" resultType="entity.Hero">
        select * from hero;
    </select>

    <delete id="deleteById" parameterType="entity.Hero">
        delete from hero where id = #{id};
    </delete>
</mapper>

配置好在 config 文件中导入

img

配置好我们就可以通过 SqlSession 对象来调用 sql 语句了

// 1.加载配置文件
String resource = "mybatis-config.xml";
InputStream inputStream = Resources.getResourceAsStream(resource);
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);

// 2.获取 sqlSessionFactory 对象来执行 sql
SqlSession sqlSession = sqlSessionFactory.openSession();

// 3.执行 sql
List<Hero> Heros = sqlSession.selectList("Hero.selectAll");

for (Hero hero : Heros) {
    System.out.println(hero.toString());
}

// 删掉 id=11 的英雄
Hero gailun = new Hero();
gailun.setId(11);

sqlSession.delete("Hero.deleteById", gailun.getId());

二、Mapper 代理开发

目的还是为了

  • 解决硬编码
  • 简化sql调用

1.构建 Mapper 和同名 xml 文件

img

在 resources 中创建层次结构要用/分隔,而不是 . 用点分隔不会产生层次结构,而是被当作一个叫 com.zihao.mapper 的目录

使用同名层次结构,maven 编译后会自动把 HeroMapper 和HeroMapper.xml 编译在同目录下

img


2.编辑Mapper接口

在Mapper接口中定义方法,方法名就是SQL映射文件中sql语句的id,并保持参数类型和返回值类型一致

// HeroMapper.java 接口文件
package com.zihao.mapper;

import com.zihao.entity.Hero;

import java.util.List;

public interface HeroMapper {
    List<Hero> selectAll();
}
<!--HeroMapper.xml 中对应的sql语句 注意命名空间要选择mapper所在位置-->
<mapper namespace="com.zihao.mapper.HeroMapper">
    <select id="selectAll" resultType="com.zihao.entity.Hero">
        select * from hero;
    </select>

    <delete id="deleteById" parameterType="com.zihao.entity.Hero">
        delete from hero where id = #{id};
    </delete>
</mapper>
// mybatis-config.xml 也需要修改
<mappers>
    <!--加载sql映射文件-->
    <!--<mapper resource="com/zihao/mapper/HeroMapper.xml"/>-->

    <!--包扫描方式添加映射,就不用向上面那样一条一条加,系统自动扫描加载所有mapper.xml-->
    <package name="com.zihao.mapper"/>
</mappers>

3.代码实现

// 1.加载配置文件
String resource = "mybatis-config.xml";
InputStream inputStream = Resources.getResourceAsStream(resource);
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);

// 2.获取 sqlSessionFactory 对象
SqlSession sqlSession = sqlSessionFactory.openSession();

// 3.使用代理对象HeroMapper执行 sql
HeroMapper heroMapper = sqlSession.getMapper(HeroMapper.class);
List<Hero> Heros = heroMapper.selectAll();  // 调用刚刚接口中定义的方法
listAll(Heros);

三、参数传递

1、SQL中的参数传递通常有 ${} 和 #{} 两种方式

${} 实际上是对SQL做拼接,不推荐使用,有可能产生SQL注入问题

#{} 会将对应位置替换为 ? 可以有效防止SQL注入攻击

参数类型 parameterType 通常可以省略 

2、SQL中设置多个参数

  1. 散装参数
    • 使用 @param 注解对应SQL中的占位符名称
  2. 实体类封装参数
    • 需要实体类的属性名和SQL中的参数占位符相同
  3. map 集合传递参数
    • map 集合的键名称与SQL中的参数名对应即可

四、特殊字符处理

1.转义字符

特殊字符少时使用

select *
from table
where age &lt; 60;
# 取出年龄小于60的数据, &lt;是 < 的转义字符

2.CDATA区

特殊字符多时使用

select *
from table where age
<![CDATA[
    <
]]>
60;
posted @   李八御  阅读(8)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 使用C#创建一个MCP客户端
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列1:轻松3步本地部署deepseek,普通电脑可用
· 按钮权限的设计及实现
点击右上角即可分享
微信分享提示