Mybaits教程

在这里插入图片描述

1. 回顾 JDBC
@Test
public void testJdbc() throws Exception {
    String url = "jdbc:mysql://localhost:3306/javaee_***";
    String username = "root";
    String password = "123456";
    
    Class.forName("com.mysql.jdbc.Driver");
    
    Connection connection = DriverManager.getConnection(url, username, password);
    
    String sql = "SELECT * FROM javaee_2203.student WHERE id = 1";
    
    PreparedStatement statement = connection.prepareStatement(sql);
    
    ResultSet resultSet = statement.executeQuery();
    Student student = new Student();
    
    if (resultSet.next()) {
        student.setId(resultSet.getInt("id"));
        student.setName(resultSet.getString("name"));
        student.setAge(resultSet.getInt("age"));
        student.setScore(resultSet.getFloat("score"));
    }
    
    System.out.println(student);
    
    resultSet.close();
    statement.close();
    connection.close();
}
2. MyBatis 概述
2.1 ORM 思想
ORM 对象关系映射
	Object Relational Mapping
	不止于数据库 
		数据库 <==> Java 对象之间的映射关系(JavaBean Java Map)
		JSON <==> Java 对象
		XML <==> Java 对象
		字符串数据信息 <==> Java 对象
			url 参数  username=张三&password=123456
			
	键值对形式的数据是极为方便,操作简单,使用便捷。
2.2 MyBatis 框架
	基于 ORM 思想,全世界范围以内流行的数据库框架结构。
	MyBatis 原本是 Apache组织下的一个 ibatis 项目。2010年 Google 接手 ibatis ==> 改名为 MyBatis。
2013年项目迁移到 Github
	非常优秀的,效率极高,操作方便,Java数据库持久层框架,支持动态 SQL,缓存机制,高级映射。。。MyBatis也是基于 JDBC 进行封装开发。对于开发者不需要在关注 JDBC 的执行过程,而是关注 SQL语句本身,参数(parameterType)所需和对应的结果产出(returnType)。
	MyBatis提供了 XML文件 和 Annotation 注解两种方式来处理 SQL,并且自动完成 ORM 操作。
3. MyBatis 开发步骤【重点】
3.1 Maven 导入 MyBatis 依赖
<!-- https://mvnrepository.com/artifact/org.mybatis/mybatis -->
<dependency>
    <groupId>org.mybatis</groupId>
    <artifactId>mybatis</artifactId>
    <version>3.5.6</version>
</dependency>
3.2 创建数据表
CREATE TABLE `student`
(
    `id`    int(11)     NOT NULL AUTO_INCREMENT,
    `name`  varchar(32) NOT NULL,
    `age`   int(11)     NOT NULL,
    `score` float(5, 2) NOT NULL,
    PRIMARY KEY (`id`)
) ENGINE = InnoDB
  AUTO_INCREMENT = 17
  DEFAULT CHARSET = utf8
3.3 定义实体类
package com.qfedu.entity;

import lombok.*;

/**
 * @author Anonymous 2022/5/7 9:33
 */
@Data // 自动补齐 Setter and Getter 方法,符合 JavaBean 规范 提供 toString
@NoArgsConstructor // 无参数构造方法
@AllArgsConstructor // 全参数构造方法
public class Student {
    private Integer id;
    private String name;
    private Integer age;
    private Float score;
}
3.4 创建对应Dao接口
package com.qfedu.dao;

import com.qfedu.entity.Student;

/**
 * @author Anonymous 2022/5/7 10:06
 */
public interface StudentDao {
    /**
     * 根据用户指定的 id 查询对应的 Student 对象
     *
     * @param id 用户指定的 id 号
     * @return Student 对象
     */
    Student selectStudentById(Integer id);
}

3.5 配置 MyBatis
需要完成 MyBatis-config.xml 文件。配置文件要求的路径
	src/main/resources 
<?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 MyBatis 框架的对应的环境, environments 允许多个环境
    default 表示当前 MyBatis 使用的默认环境
        default="MySQL_Develop" 当前 MyBatis 使用的是 environment id 为 MySQL_Develop 对应配置环境
    -->
    <environments default="MySQL_Develop">
        <!-- environment MyBatis 配置环境 -->
        <environment id="MySQL_Develop">
            <!--
             事务管理方式/手段/规范  默认当前事务操作使用的规范是 JDBC 规范
            set autoCommit = 0; commit; rollback; set autoCommit = 1;
            -->
            <transactionManager type="JDBC"/>
            <!--
            数据源配置 数据库连接对象在项目中都是采用数据库连接池方式管理
            type="POOLED"  数据库连接池方式
            -->
            <dataSource type="POOLED">
                <!-- 配置 MyBatis 连接数据库对应的驱动 name="driver" 固定格式 -->
                <property name="driver" value="com.mysql.jdbc.Driver"/>
                <!--
                配置 MyBatis 连接数据库对应的JDBC规范url name="url" 固定格式
                tips: & Url 参数分隔符不能直接使用,需要使用 &amp;
                -->
                <property name="url"
                          value="jdbc:mysql://localhost:3306/javaee_2203?serverTimezone=Asia/Shanghai&amp;useUnicode=true&amp;characterEncoding=utf8&amp;useSSL=false"/>
                <!-- 配置 MyBatis 连接数据库对应的用户名 name="username" 固定格式  -->
                <property name="username" value="root"/>
                <!-- 配置 MyBatis 连接数据库对应的密码 name="password" 固定格式  -->
                <property name="password" value="123456"/>
            </dataSource>
        </environment>
    </environments>

    <!-- mapper 文件 -->

</configuration>
3.6 编写 Mapper 文件
对应 StudentDao 接口的 mapper 文件需要存储在 
	src/main/resources 
	一般情况下 mapper 文件名称和对应 Dao 接口名称有相关性
	interface StudentDao ==> mapper 文件 ==> StudentDaoMapper.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 文件对应的 Dao 层接口是哪一个,需要完整的包名.类名 -->
<mapper namespace="com.qfedu.dao.StudentDao">
    <!--
    select 表示当前执行的是 select DQL(Data Query Language) 语句
    属性:
        id ==> dao 层接口的方法名称
            id="selectStudentById"
        resultType ==> SQL查询结果对应目标类型,需要完成的包名.类名,
            MyBatis预设了一下简拼,同时我们可以自行设置数据类型简拼
            resultType="com.qfedu.entity.Student" ==> 后期可以设置简拼 ==> "Student"
    -->
    <select id="selectStudentById" resultType="com.qfedu.entity.Student">
        <!--
          #{arg0} 表示方法第一个参数
          建议 SQL 语句关键字大写!!!
        -->
        SELECT * FROM javaee_2203.student WHERE id = #{arg0}
    </select>
</mapper>
一定要在 mybatis-config.xml 文件中,注册 mapper 文件
<!--
MyBatis 注册 mapper 文件
mappers 可以对应多个 mapper 文件
-->
<mappers>
    <!--
    一个 mapper 标签对应一个 mapper 文件
    resource 当前 mapper 文件的名称, MyBatis 会根据名称在
    src/main/resources 进行搜索
    -->
    <mapper resource="StudentDaoMapper.xml"/>
</mappers>
3.7 测试
package com.qfedu.test;

import com.qfedu.dao.StudentDao;
import com.qfedu.entity.Student;
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 org.junit.Test;

import java.io.IOException;
import java.io.InputStream;

/**
 * @author Anonymous 2022/5/7 10:47
 */
public class MyBatisStudentDaoTest {
    @Test
    public void testSelectStudent() throws IOException {
        /*
         1.  获取 MyBatis 配置文件输入流对象
         org.apache.ibatis.io.Resources; MyBatis 通过 ClassLoader 类加载获取资源的一个类
         getResourceAsStream(String resource);
            根据在项目 src/main/resources 配置文件名称,读取对应的输入流对象,方便 MyBatis 配置
         */
        InputStream in = Resources.getResourceAsStream("mybatis-config.xml");

        /*
        2. 创建 SqlSessionFactory SqlSession 工厂对象,用于后期获取 SqlSession 对象
        SqlSession 可以认为是符合 JDBC 规范,MyBatis 框架中数据库连接对象,可以处理 SQL 语句,执行 SQL 语句
         */
        SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(in);

        /*
        3. 通过  SqlSessionFactory 获取连接对象 SqlSession
         */
        SqlSession sqlSession = factory.openSession();

        /*
        4. 通过 SqlSession 获取指定 接口名称的实现类对象 需要获取 StudentDao 实现类对象
        T getMapper(Class<T> cls)
            需要指定当前 Class 类型,对应当前 接口.class 对象
            StudentDao studentDao = new StudentDaoImpl();
         */
        StudentDao studentDao = sqlSession.getMapper(StudentDao.class);

        /*
        5.通过 StudentDao 执行对应方法
         */
        Student student = studentDao.selectStudentById(1);
        System.out.println(student);
    }
}
4. 问题总结
4.1 SQL 语句参数问题
方法参数个数为 1
	Mapper 文件中 SQL 语句对应参数可以使用 arg0 、param1、自定义名称都可以,MyBatis 自动识别,不限制参数名称

方法参数为多个
	a. 未参数绑定的情况下
		Mapper中 SQL 语句原生参数可以采用
			#{arg0} #{arg1}
			#{param1} #{param2}
	b. 参数使用 @Param 注解绑定参数名称
		@Param("id") Integer id, @Param("name") String name
		要求 Mapper 文件中的 SQL 语句参数使用 #{id} #{name}
4.2 jdbc.properties 文件管理数据连接必要资源
# jdbc.properties 数据库连接必要资源配置文件 存储在 src/main/resources
jdbc.driver=com.mysql.jdbc.Driver
jdbc.url=jdbc:mysql://localhost:3306/javaee_2203?serverTimezone=Asia/Shanghai&useUnicode=true&characterEncoding=utf8&useSSL=false
jdbc.username=root
jdbc.password=123456
<!-- MyBatis 配置文件中添加 jdbc.properties 读取数据内容 -->
<properties resource="jdbc.properties"/>
... 

<!-- MyBatis-config.xml dataSource 属性 property 修改 -->
<dataSource type="POOLED">
    <!-- 配置 MyBatis 连接数据库对应的驱动 name="driver" 固定格式 -->
    <property name="driver" value="${jdbc.driver}"/>
    <!--
    配置 MyBatis 连接数据库对应的JDBC规范url name="url" 固定格式
    tips: & Url 参数分隔符不能直接使用,需要使用 &amp;
    -->
    <property name="url" value="${jdbc.url}"/>
    <!-- 配置 MyBatis 连接数据库对应的用户名 name="username" 固定格式  -->
    <property name="username" value="${jdbc.username}"/>
    <!-- 配置 MyBatis 连接数据库对应的密码 name="password" 固定格式  -->
    <property name="password" value="${jdbc.password}"/>
</dataSource>
4.3 类型别名/简拼
修改 MyBatis-Config 配置文件
<!-- 类型别名 typeAliases 在  properties 标签之后 MyBatis XML文件配置规范 -->
<typeAliases>
    <!--
    声明 com.qfedu.entity.Student 在当前 MyBatis 项目中简称为 Student 在后续的 Mapper 中直接使用 Student来
    表示完整的 包名.类名
    -->
    <typeAlias type="com.qfedu.entity.Student" alias="Student"/>
</typeAliases>
5. MyBatis CRUD 操作【重点】
5.1 StudentDao.java
package com.qfedu.dao;

import com.qfedu.entity.Student;
import org.apache.ibatis.annotations.Param;

import java.util.Map;

/**
 * @author Anonymous 2022/5/7 10:06
 */
public interface StudentDao {
    /**
     * 根据用户指定的 id 查询对应的 Student 对象
     *
     * @param id 用户指定的 id 号
     * @return Student 对象
     */
    Student selectStudentById(Integer id);

    /**
     * Mapper 文件 SQL 语句参数有两种形式,第一种 arg0 arg1 arg2 第二种 param1 param2 param3
     * 阅读性一般,需要严格遵从参数顺序和原生命名规范
     *
     * @param id 用户 id
     * @param name 用户名称
     * @return Student 对象
     */
    Student selectStudentByIdAndName(Integer id, String name);

    /**
     * 【推荐】使用注解绑定参数名称,方便 Mapper 文件使用操作 @Param("id") 可以在 mapper 文件中
     * 直接使用 id 作为 SQL 语句参数
     *
     * @param id   用户 id
     * @param name 用户名称
     * @return Student 对象
     */
    Student selectStudentByIdAndNameTwo(@Param("id") Integer id, @Param("name") String name);

    /**
     * 添加学生到当前数据库中
     *
     * @param student Student 对象
     */
    void insertStudent(Student student);

    /**
     * 添加学生信息到数据库,提供数据为 Map 双边队列
     *
     * @param map Map 双边队列
     */
    void insertStudentMap(Map<String, Object> map);

    /**
     * 更新操作
     *
     * @param stu Student 对象
     */
    void updateStudent(Student stu);

    /**
     * 根据 Map 双边队列修改对应学生信息
     *
     * @param map Map 双边队列
     */
    void updateStudentMap(Map<String, Object> map);

    /**
     * 根据 ID 删除对应的学生信息
     *
     * @param id 学生 ID 号
     */
    void deleteStudent(@Param("id") int id);
}

5.2 StudentDaoMapper.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 文件对应的 Dao 层接口是哪一个,需要完整的包名.类名 -->
<mapper namespace="com.qfedu.dao.StudentDao">
    <!--
    select 表示当前执行的是 select DQL(Data Query Language) 语句
    属性:
        id ==> dao 层接口的方法名称
            id="selectStudentById"
        resultType ==> SQL查询结果对应目标类型,需要完成的包名.类名,
            MyBatis预设了一下简拼,同时我们可以自行设置数据类型简拼
            resultType="com.qfedu.entity.Student" ==> 后期可以设置简拼 ==> "Student"
    -->
    <select id="selectStudentById" resultType="Student">
        <!--
          #{arg0} 表示方法第一个参数
          建议 SQL 语句关键字大写!!!
          一个参数,参数对应的名称无所谓~
        -->
        SELECT * FROM javaee_2203.student WHERE id = #{id}
    </select>

    <select id="selectStudentByIdAndName" resultType="Student">
        <!-- 原生 SQL 语句参数绑定 arg0 arg1 arg2 -->
        <!-- SELECT * FROM javaee_2203.student WHERE id = #{arg0} and name = #{arg1} -->
        <!-- 原生 SQL 语句参数绑定 param1 param2 param3 -->
        SELECT * FROM javaee_2203.student WHERE id = #{param1} and name = #{param2}
    </select>

    <select id="selectStudentByIdAndNameTwo" resultType="Student">
        <!-- 注解方式完成的参数名称注册 @Param("id") 和 @Param("name") -->
        SELECT * FROM javaee_2203.student WHERE id = #{id} and name = #{name}
    </select>

    <!-- insert 插入数据 SQL 语句对应参数 -->
    <insert id="insertStudent" parameterType="Student">
        <!--
        给予当前 SQL 语句参数是一个 JavaBean 规范对象 可以直接利用对象中的成员变量名称
        作为SQL 语句参数 #{name} #{age} #{score}
        -->
        INSERT INTO javaee_2203.student VALUES (null, #{name}, #{age}, #{score})
    </insert>

    <insert id="insertStudentMap">
        <!-- 如果你提交的参数为 Map 类型,可以直接 #{map.key}
        例如: #{mapName}  #{mapAge} #{mapScore} -->
        INSERT INTO javaee_2203.student(name, age, score) VALUES (#{mapName}, #{mapAge}, #{mapScore})
    </insert>

    <!-- update 更新 SQL 语句对应的标签 -->
    <update id="updateStudent" parameterType="Student">
        UPDATE javaee_2203.student
        SET name  = #{name},
            age   = #{age},
            score = #{score}
        WHERE id = #{id}
    </update>

    <update id="updateStudentMap">
        UPDATE javaee_2203.student
        SET name  = #{mapName},
            age   = #{mapAge},
            score = #{mapScore}
        WHERE id = #{mapId}
    </update>

    <!-- delete 删除操作对应标签 -->
    <delete id="deleteStudent" parameterType="int">
        DELETE FROM javaee_2203.student WHERE id = #{id}
    </delete>
</mapper>
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值