首页 > 其他分享 >[Mybatis] 笔记

[Mybatis] 笔记

时间:2023-04-01 10:15:05浏览次数:44  
标签:Hero name hp damage 笔记 id Mybatis public

一、入门使用步骤


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;

标签:Hero,name,hp,damage,笔记,id,Mybatis,public
From: https://www.cnblogs.com/libayu/p/17278129.html

相关文章

  • 机器学习随堂笔记(1)
    范数:  0范数:  它表示向量非零元素的个数。 1范数:  也就是麦哈顿距离 2范数:  也就是欧式距离内积(点积、点乘):外积:两个向量的外积,又叫向量积、叉乘等。外积的运算结果是一个向量而不是一个标量。两个向量的叉积与这两个向量组成的坐标平面垂直。 ......
  • 读SQL进阶教程笔记04_集合运算
    1. 集合论是SQL语言的根基1.1. UNION1.1.1. SQL-86标准1.2. NTERSECT和EXCEPT1.2.1. SQL-92标准1.3. 除法运算(DIVIDEBY)1.3.1. 没有被标准化2. 注意事项2.1. SQL能操作具有重复行的集合,可以通过可选项ALL来支持2.1.1. 不允许重复2.1.1.1. 直接使......
  • 三月读书笔记3
    阅读了《人月神话》贵族专制、民主政治和系统设计,画蛇添足,贯彻执行,为什么巴比伦塔会失败?这几章,对于《人月神话》这本书也有了更深的了解,这本书在宏观的大层面的角度看待软件工程的系统开发,没一句讲的具体知识,讲的全是一个项目的开发注意事项。首先,运用大教堂的成功,巴比伦塔的失败,......
  • 构建之法 读书笔记
    体会:书中举的四则运算的例子做深了以后可能还涉及一些相对比较复杂的算法,可是在现实中接触到的系统很多是业务驱动的系统,用户量可能不会超过2000,CRUD,业务复杂流程交给成熟的工作流系统去做了,CRUD是很简单的数据库表操作,数据库操作有现成的框架,前端有现成的框架,后端有现成的框架,程......
  • 读书笔记(三)
    构建之法这本书的好首先就在于这是一本全景式的图书,能让你更了解这个软件行业。可以让人从陌生变熟悉,所以这本书是不错的。其次,这是一本实践式的书,涵盖了科学软件开展的每个方面,不单单只是实践,理论的东西也很重要。我们中国大陆的教育工作者更接近实际,所以这本书就介绍了我们教育......
  • 读书笔记(二)
    体会:我大概听过两类企业,有一类是每个工程师就是一个螺丝钉,在自己的某个技术上发挥极致的能力,有一类是每个工程师类似一个"大杂烩"(这个比喻不知道恰当与否,就是表示工程师需要处理项目中各类技术方面的问题),前一类公司培养出来的工程师可能是强化自己现有的技术能力,而另外一类公司的......
  • 代码大全 阅读笔记03
    复杂数据类型恰当地对数据进行结构化,可以使程序更简单、更容易理解也更容易维护。可以用表来代替复杂的逻辑结构。当你被程序的复杂逻辑迷惑时,应考虑是否可用查寻表来简化程序。抽象数据类型是降低复杂性的有力武器。它使你可以分层编写程序,而且是从问题域,而不是程序语言细节来编......
  • 人月神话阅读笔记01
    由于该书所描述的内容比较庞杂,本人预计将分为三篇文章对于相关内容和感想进行阐述。作为开章第一篇,就先来说说为什么“人月”是“神话”。小学的时候我们都做过这样的应用题:“工厂需要加工一批零件,安排5名工人的话需要10小时完成,那么安排25名工人加工,多少小时可以完成”之类的。......
  • 构建之法读书笔记四
    第五章团队和流程5.2软件团队的模式主治医师模式、明星模式、社区模式、业余剧团模式、秘密团队、特工团队、交响乐团模式、爵士乐模式、功能团队模式、官僚模式5.3开发流程①写了再改模式②瀑布模型(WaterfallModel)是一个项目开发架构,开发过程是通过设计一系列阶段顺序......
  • 构建之法读书笔记三
    第四章两人合作4.1代码规范包括代码风格规范和代码设计规范4.2代码风格规范代码风格原则:简明、易读、无二异性缩进:4个空格,而不是TAB行宽:限定为100字符括号断行与空白的{}行分行命名:匈牙利命名法下划线:分隔变量名字中的作用域标注和变量语义大小写(Pascal形式和Camel......