java之mybatis笔记

news2024/11/26 14:28:27

1 项目创建

1.1 maven设置

1.2 创建项目文件

1.3 配置MyBatis的相关依赖

1.4 配置 MyBatis

创建一个 mybatis-config.xml 配置文件:

<?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://localhost:3306/test?useSSL=false&amp;serverTimezone=UTC"/>
               <property name="username" value="root"/>
               <property name="password" value="password"/>
            </dataSource>
        </environment>
    </environments>
    <mappers>
       <mapper resource="com/example/mapper/UserMapper.xml"/>
    </mappers>
</configuration>

1.5 创建 Mapper 接口和映射文件

创建一个 UserMapper.java 接口:

package com.example.mapper;
​
import com.example.domain.User;
​
public interface UserMapper {
    User getUserById(int id);
}

创建一个 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">
<mapper namespace="com.example.mapper.UserMapper">
   <select id="getUserById" resultType="com.example.domain.User">
        SELECT * FROM users WHERE id = #{id}
    </select>
</mapper>

1.6 使用 MyBatis 查询数据

在 Java 代码中使用 MyBatis 查询数据:

import com.example.domain.User;
import com.example.mapper.UserMapper;
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;
​
public class MyBatisExample {
    public static void main(String[] args) throws IOException {
        // 读取配置文件
        SqlSessionFactoryBuilder builder = new SqlSessionFactoryBuilder();
        SqlSessionFactory factory = builder.build(Resources.getResourceAsReader("mybatis-config.xml"));
        
        // 获取 SqlSession
        try (SqlSession session = factory.openSession()) {
            // 获取 Mapper 接口的代理对象
            UserMapper userMapper = session.getMapper(UserMapper.class);
            
            // 调用 Mapper 方法查询数据
            User user = userMapper.getUserById(1);
            System.out.println(user);
        }
    }
}

2 MyBatis 核心类和接口

2.1 SqlSessionFactoryBuilder

SqlSessionFactoryBuilder 用于创建 SqlSessionFactory 实例。它可以通过读取配置文件来初始化 SqlSessionFactory

2.2 SqlSessionFactory

SqlSessionFactory 是一个重要的接口,它的主要作用是创建 SqlSession 实例。通常情况下,一个应用中只会有一个 SqlSessionFactory 实例,因为它会加载和管理所有的数据库配置信息。

2.3 SqlSession

SqlSession 是 MyBatis 的核心接口,提供了执行 SQL 语句的方法。它也负责创建 Mapper 代理对象。

3 原生接口

MyBatis 提供了一些原生接口,如 ExecutorParameterHandlerResultSetHandlerStatementHandler,这些接口主要用于自定义或扩展 MyBatis 的功能。

3.1 Mapper 代理

MyBatis 通过动态代理技术实现 Mapper 接口,这样就可以通过接口方法直接调用对应的 SQL 语句。

3.2 MyBatis 标签

在 MyBatis 的映射文件中,可以使用以下标签来定义 SQL 语句:

3.2.1 增加(Insert)

<insert id="insertUser" parameterType="com.example.domain.User">
    INSERT INTO users (name, age) VALUES (#{name}, #{age})
</insert>

3.2.2 修改(Update)

<update id="updateUser" parameterType="com.example.domain.User">
    UPDATE users SET name=#{name}, age=#{age} WHERE id=#{id}
</update>

3.2.3 删除(Delete)

<delete id="deleteUser" parameterType="int">
    DELETE FROM users WHERE id=#{id}
</delete>

3.2.4 查询(Select)

查询全部:

<select id="selectAllUsers" resultType="com.example.domain.User">
    SELECT * FROM users
</select>

单个查询:

<select id="getUserById" parameterType="int" resultType="com.example.domain.User">
    SELECT * FROM users WHERE id=#{id}
</select>

3.2.5 一对一查询

<resultMap id="userDetailsResultMap" type="com.example.domain.User">
    <id property="id" column="user_id"/>
   <result property="name" column="user_name"/>
   <association property="details" javaType="com.example.domain.UserDetails">
        <id property="address" column="address"/>
       <result property="email" column="email"/>
    </association>
</resultMap>
​
<select id="getUserWithDetails" resultMap="userDetailsResultMap">
    SELECT u.*, ud.address, ud.email
    FROM users u
    INNER JOIN user_details ud ON u.id = ud.user_id
    WHERE u.id = #{id}
</select>

3.2.6 一对多查询

<resultMap id="userPostsResultMap" type="com.example.domain.User">
    <id property="id" column="user_id"/>
   <result property="name" column="user_name"/>
   <collection property="posts" ofType="com.example.domain.Post">
        <id property="id" column="post_id"/>
       <result property="title" column="post_title"/>
    </collection>
</resultMap>
​
<select id="getUserWithPosts" resultMap="userPostsResultMap">
    SELECT u.*, p.id as post_id, p.title as post_title
    FROM users u
    LEFT JOIN posts p ON u.id = p.user_id
    WHERE u.id = #{id}
</select>

3.2.7 案例代码

假设我们有一个 User 实体类和一个 UserMapper 接口:

// User.java
public class User {
    private int id;
    private String name;
    private int age;
    // getters and setters...
}
​
// UserMapper.java
public interface UserMapper {
    int insertUser(User user);
    int updateUser(User user);
    int deleteUser(int id);
    List<User> selectAllUsers();
    User getUserById(int id);
}

对应的 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">
<mapper namespace="com.example.mapper.UserMapper">
    <!-- Insert -->
   <insert id="insertUser" parameterType="com.example.domain.User">
        INSERT INTO users (name, age) VALUES (#{name}, #{age})
    </insert>
    
    <!-- Update -->
   <update id="updateUser" parameterType="com.example.domain.User">
        UPDATE users SET name=#{name}, age=#{age} WHERE id=#{id}
    </update>
    
    <!-- Delete -->
   <delete id="deleteUser" parameterType="int">
        DELETE FROM users WHERE id=#{id}
    </delete>
    
    <!-- Select All -->
   <select id="selectAllUsers" resultType="com.example.domain.User">
        SELECT * FROM users
    </select>
    
    <!-- Select by ID -->
   <select id="getUserById" parameterType="int" resultType="com.example.domain.User">
        SELECT * FROM users WHERE id=#{id}
    </select>
</mapper>

使用 MyBatis 执行增删改查操作:

// MyBatisExample.java
public class MyBatisExample {
    public static void main(String[] args) throws IOException {
        // ... 省略配置 SqlSessionFactory 的代码 ...
​
        try (SqlSession session = factory.openSession()) {
            UserMapper userMapper = session.getMapper(UserMapper.class);
​
            // Insert
            User newUser = new User();
            newUser.setName("John Doe");
            newUser.setAge(30);
            userMapper.insertUser(newUser);
​
            // Update
            User updatedUser = new User();
            updatedUser.setId(1);
            updatedUser.setName("Jane Doe");
            updatedUser.setAge(28);
            userMapper.updateUser(updatedUser);
​
            // Delete
            userMapper.deleteUser(1);
​
            // Select All
            List<User> allUsers = userMapper.selectAllUsers();
            for (User user : allUsers) {
                System.out.println(user);
            }
​
            // Select by ID
            User user = userMapper.getUserById(1);
            System.out.println(user);
        }
    }
}

4 MyBatis 一对多查询

一对多查询通常涉及到两个表,其中一个表的记录可以与另一个表的多个记录相关联。例如,部门和员工、老师和 学生、班级和学生等关系。

4.1 部门-员工示例

假设我们有两个表:departmentsemployees,其中每个部门有多个员工。

首先,创建两个实体类 DepartmentEmployee

// Department.java
public class Department {
    private int id;
    private String name;
    private List<Employee> employees; // 部门包含多个员工
    // getters and setters...
}
​
// Employee.java
public class Employee {
    private int id;
    private String name;
    private int departmentId; // 外键,指向部门
    // getters and setters...
}

然后,创建 DepartmentMapper.java 接口和 DepartmentMapper.xml 映射文件:

// DepartmentMapper.java
public interface DepartmentMapper {
    Department getDepartmentWithEmployees(int departmentId);
}
​
// DepartmentMapper.xml
<mapper namespace="com.example.mapper.DepartmentMapper">
   <resultMap id="departmentWithEmployeesResultMap" type="com.example.domain.Department">
        <id property="id" column="dept_id"/>
       <result property="name" column="dept_name"/>
       <collection property="employees" ofType="com.example.domain.Employee">
            <id property="id" column="emp_id"/>
           <result property="name" column="emp_name"/>
           <result property="departmentId" column="dept_id"/>
        </collection>
    </resultMap>
​
   <select id="getDepartmentWithEmployees" resultMap="departmentWithEmployeesResultMap">
        SELECT d.id as dept_id, d.name as dept_name, e.id as emp_id, e.name as emp_name
        FROM departments d
        LEFT JOIN employees e ON d.id = e.department_id
        WHERE d.id = #{departmentId}
    </select>
</mapper>

4.2 使用 ResultMap 进行返回值

在上面的例子中,我们使用了<resultMap>来定义如何将数据库查询结果映射到 Java 对象。<collection>标签用于处理一对多的关系,ofType` 属性指定了集合元素的类型。

5 MyBatis 动态 SQL

动态 SQL 是 MyBatis 提供的一种强大的功能,它可以根据不同的条件生成不同的 SQL 语句。

5.1 if 标签

<if> 标签用于根据条件判断是否包含 SQL 片段。

<select id="findUsers" resultType="map">
    SELECT * FROM users
   <where>
        <if test="id != null">
            AND id = #{id}
        </if>
        <if test="name != null">
            AND name = #{name}
        </if>
    </where>
</select>

5.2 控制台打印 SQL

要在控制台打印 SQL 语句,可以在 MyBatis 的配置文件 mybatis-config.xml 中添加以下设置:

<settings>
   <setting name="logImpl" value="LOG4J"/>
</settings>

确保你的项目中包含了 Log4j 的依赖,并且正确配置了 Log4j 的日志输出。

5.3 案例代码

假设我们有一个 User 实体类和 UserMapper 接口,我们要根据不同的条件查询用户:

// User.java
public class User {
    private int id;
    private String name;
    private String email;
    // getters and setters...
}
​
// UserMapper.java
public interface UserMapper {
    List<User> findUsers(User user);
}

UserMapper.xml 中使用动态 SQL:

<mapper namespace="com.example.mapper.UserMapper">
   <select id="findUsers" resultType="com.example.domain.User">
        SELECT * FROM users
       <where>
            <if test="id != null">
                AND id = #{id}
            </if>
            <if test="name != null">
                AND name = #{name}
            </if>
            <if test="email != null">
                AND email = #{email}
            </if>
        </where>
    </select>
</mapper>

使用 MyBatis 执行查询:

// MyBatisExample.java
public class MyBatisExample {
    public static void main(String[] args) throws IOException {
        // ... 省略配置 SqlSessionFactory 的代码 ...
​
        try (SqlSession session = factory.openSession()) {
            UserMapper userMapper = session.getMapper(UserMapper.class);
​
            User user = new User();
            user.setName("John");
            List<User> users = userMapper.findUsers(user);
            for (User u : users) {
                System.out.println(u);
            }
        }
    }
}

在这个例子中,我们使用了<where><if>` 标签来构建动态 SQL,根据提供的参数来过滤查询结果。如果需要在控制台查看生成的 SQL 语句,确保按照前面的说明配置了 Log4j。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1835110.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

翻转数位00

题目链接 翻转数位 题目描述 注意点 可以将一个数位从0变为1找出能够获得的最长的一串1的长度&#xff08;必须是连续的&#xff09; 解答思路 参照题解使用动态规划解决本题&#xff0c;对于任意一个位置i&#xff0c;dp[i][0]表示到达且包含第i位不翻转0最长1的长度&…

Vue3 状态管理 - Pinia,超详细讲解!

前言&#xff1a; 哈喽&#xff0c;大家好&#xff0c;我是前端菜鸟的自我修养&#xff01;今天给大家分享【Vue3 状态管理 - Pinia】&#xff0c;超详细讲解&#xff01;并提供具体代码帮助大家深入理解&#xff0c;彻底掌握&#xff01;原创不易&#xff0c;如果能帮助到带大…

AxProtector CTP荣膺2024年度德国创新奖,见证软件安全领域新突破

AxProtector CTP通过将混淆技术直接集成到编译过程中&#xff0c;引入了一种突破性的软件安全保护方法&#xff0c;有效对抗逆向工程。适用于Windows、Linux和macOS&#xff0c;确保在各种操作系统上的广泛应用。结合了强大的知识产权保护和灵活的许可功能&#xff0c;包括模块…

鸿蒙HarmonyOS DevEco Studio 安装配置

一、安装后配置 文档&#xff1a;https://developer.huawei.com/consumer/cn/doc/harmonyos-guides-V2/software_install-0000001053582415-V2 Node.js版本要求为v14.19.1及以上&#xff0c;且低于v17.0.0&#xff1b;对应的npm版本要求为6.14.16及以上&#xff0c;可以选择本…

k8s学习--chart包开发(创建chart包)

文章目录 chart包应用环境一、安装helm客户端工具二、chart包目录结构三、创建不可配置的chart1.创建目录和chart.yaml2.创建deployment.yaml3.创建service.yaml4.使用chart安装应用5.查看和验证 四、创建可配置的Chart1.官方的预定义变量2.新增values.yaml文件3.配置deploy引用…

swagger手动添加cookies信息、浏览器中手动添加cookies信息

在实际项目使用中&#xff0c;我们可能需要把登录token放到cookies中&#xff0c;请求时从cookies中获取token值&#xff0c;以此校验用户登录信息&#xff0c;以下整理一下怎么在cookies中手动添加数据。 操作步骤如下&#xff1a; (1)&#xff1a;F12打开调试工具&#xff…

实验13 BGP路径选择

实验13 BGP路径选择 一、 原理描述二、 实验目的三、 实验内容四、 实验配置五、 实验步骤 一、 原理描述 与域内路由不同&#xff0c;域间路由更加注重策略&#xff0c;而不是技术。在域内进行选路&#xff0c;可以使用路由算法计算出到达目的子网的最短路径&#xff1b;而在…

【ajax基础01】ajax简介

一&#xff1a;ajax简介 1 什么是ajax AJAX&#xff08;Asynchronous JavaScript And XML &#xff09;是一种在 Web 应用中通过异步发送 HTTP 请求向服务器获取内容&#xff0c;并使用这些新内容更新页面中相关的部分&#xff0c;而无需重新加载整个页面的 Web 开发技术。这可…

FuTalk设计周刊-Vol.035

&#x1f525;AI漫谈 热点捕手 1、Google 史上最强大模型 Gemini&#xff0c;真的全面「碾压」GPT-4 吗&#xff1f; 谷歌的类 ChatGPT 应用 Bard 已经升级到了 Gemini Pro 版本&#xff0c;实现了更为高级的推理、规划、理解等能力&#xff0c;同时继续保持免费。谷歌预计在…

Mongodb介绍及window环境安装

本文主要内容为nosql数据库-MongoDB介绍及window环境安装。 目录 什么是MongoDB&#xff1f; 主要特点 MongoDB 与Mysql对应 安装MongoDB 下载MongoDB 自定义安装 创建目录 配置环境变量 配置MongoDB服务 服务改为手动 启动与关闭 安装MongoDB Shell 下载安装包 …

蓝卓创始人褚健:工厂操作系统+APP,加速工业数字化转型

如何让众多的中小企业通过低成本的方式实现收益&#xff0c;享受到工业互联网、数字化转型带来的效益&#xff0c;是解决中小企业数字化转型难的核心问题。 中小企业规模庞大&#xff0c;数字化转型压力巨大 褚健表示&#xff0c;中国拥有最庞大的工业企业集群&#xff0c;全国…

UltraEdit电脑版下载_UltraEdit文本编辑器中文版下载_UltraEdit 2024最新版软件安装包下载附加详细安装步骤

UltraEdit中文版是一款功能强大的文本编辑器&#xff0c;几乎可以满足你所有的工作需求。使用UltraEdit文本编辑器可以操作更多记事本所不能处理的工作。如&#xff1a;基本的编辑文本、十六进制、ASCLL码、语法加亮、代码折叠、代码单词拼写检查等、C 及 VB 指令突显等,附有 H…

EdgeOne 边缘函数—如何动态改写 M3U8 媒体文件

目前&#xff0c;各大主流厂商都推出了自己的边缘 Serverless 服务&#xff0c;如 CloudFlare Workers、 Vercel EdgeRuntime 等&#xff1b;腾讯云 EdgeOne 边缘函数提供了部署在边缘节点的 Serverless 代码执行环境&#xff0c;只需编写业务函数代码并设置触发规则&#xff0…

解决IDEA使用卡顿的问题,设置JVM内存大小和清理缓存

解决IntelliJ IDEA中卡顿问题&#xff0c;可以尝试以下几个常见且有效的步骤&#xff1a; 1 增加IDEA的JVM内存分配&#xff1a; 位于IDEA安装目录的bin文件夹下&#xff0c;找到对应的操作系统配置文件&#xff08;idea64.exe.vmoptions&#xff08;Windows&#xff09;或id…

k8s删除状态为 Terminating 的pod

卸载calico pod时候pod资源状态会卡在terminating&#xff0c;这时候需要手动进行删除 使用以下命令即可 kubectl delete pod podName -n NAMESPACE --force --grace-period0记住一定要加命名空间&#xff0c;不然会报错没有找到

AI发展面临的问题? —— AI对创造的重新定义

一、AI的问题描述 AI与数据安全问题&#xff1a;随着AI技术的发展和应用&#xff0c;数据安全问题日益突出。AI模型训练依赖于大量数据&#xff0c;而这些数据中可能包含个人隐私、商业秘密等敏感信息。如果数据在采集、存储、使用过程中处理不当&#xff0c;可能导致数据泄露或…

测试单选框

单选按钮&#xff1a;用于在一组互相排斥的选项中选择其中一项&#xff1b; 由一个圆圈和紧随其后的文本标题组成&#xff0c;当它被选中时&#xff0c;圆圈中就标上一个黑点。 通常将一组单选按钮放在一个组框控件中&#xff0c;在一组单选按钮中&#xff0c;第一个(Tab键顺序…

可燃气体报警器:户外工地安全预警先锋,定期检定保障安全无忧

在现代化的建设进程中&#xff0c;户外工地作为城市发展的重要推动力&#xff0c;其安全问题一直备受关注。 工地现场往往涉及多种易燃易爆气体&#xff0c;一旦发生泄漏&#xff0c;后果不堪设想。因此&#xff0c;如何有效预警并防范可燃气体泄露&#xff0c;成为户外工地安…

【系统架构设计师】二、操作系统知识(操作系统概述|进程管理)

目录 一、操作系统概述 1.1 操作系统定义 1.2 操作系统的功能 1.3 操作系统的分类 1.4 嵌入式操作系统主要特点 二、进程管理 2.1 进程的组成与状态 2.2 前趋图 2.3 进程资源图 2.4 进程调度 2.5进程调度算法 2.6 死锁 2.7 进程与线程 2.7.1 进程 2.7.2 线程 2…

双指针练习:有效三角形的个数

题目链接&#xff1a;611.有效三角形的个数 题目描述&#xff1a; 给定一个包含非负整数的数组 nums &#xff0c;返回其中可以组成三角形三条边的三元组个数。 解法一&#xff08;暴力求解&#xff09;&#xff08;会超时&#xff09;&#xff1a; 算法思路&#xff1a; 三层…