java之mybatis笔记

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。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【java】指定类,指定package,找到package下面,这个类的所有子类

目录 ■java代码 ■注意 ■运行效果 ■包的结构 ■java代码 package com.sxz.study.reflect;import java.io.File; import java.io.IOException; import java.net.URL; import java.util.ArrayList; import java.util.Enumeration; import java.util.List;public class …

观察者模式(大话设计模式)C/C++版本

观察者模式 扩展&#xff1a;观察者模式——委托 C 参考&#xff1a;https://www.cnblogs.com/Galesaur-wcy/p/15905936.html #include <iostream> #include <list> #include <memory> #include <string> using namespace std;// Observer类 抽象观…

【Spine学习09】之导入皮肤两种方式[skin]

第一种&#xff1a;明确项目中某个角色是有两套皮肤的情况下 直接导入两套皮肤 1、添加SKIN皮肤指令 2、在ps中-文件-脚本-浏览【打开选中jsx脚本】 3、打开Spine 点击左上角&#xff0c;选择导入数据 就可以看到该角色的两套皮肤啦&#xff01; 第二种&#xff1a;刚开始角…

探索档案未来,尽在ARCHE-2024

2024年第三届上海国际智慧档案展览会暨高峰论坛&#xff08;ARCHE-2024&#xff09;将于2024年6月19日至21日在上海跨国采购会展中心隆重举行。深圳市铨顺宏科技有限公司应邀参展&#xff0c;将以全新形象盛装亮相&#xff0c;展示其在档案管理领域的最新技术和解决方案。 ARC…

2024年【N2观光车和观光列车司机】考试技巧及N2观光车和观光列车司机模拟考试

题库来源&#xff1a;安全生产模拟考试一点通公众号小程序 N2观光车和观光列车司机考试技巧参考答案及N2观光车和观光列车司机考试试题解析是安全生产模拟考试一点通题库老师及N2观光车和观光列车司机操作证已考过的学员汇总&#xff0c;相对有效帮助N2观光车和观光列车司机模…

网络安全形势迫在眉睫!云WAF保护私有云安全!

业务上云面临新的WEB安全挑战 目前&#xff0c;所有的组织都在积极地接受企业的“云”&#xff0c;推进数字化变革。在服务云计算和私有云平台构建中&#xff0c;用户除了要面对各种常见的网络攻击&#xff0c;还需要面对虚拟环境下的非授权访问、虚拟机逃逸和敏感信息泄漏等问…

【Mongodb-01】Mongodb亿级数据性能测试和压测

mongodb数据性能测试 一&#xff0c;mongodb数据性能测试1&#xff0c;mongodb数据库创建和索引设置2&#xff0c;线程池批量方式插入数据3&#xff0c;一千万数据性能测试4&#xff0c;两千万数据性能测试5&#xff0c;五千万数据性能测试6&#xff0c;一亿条数据性能测试7&am…

Java新特性与性能调优

引言 Java不断演进&#xff0c;每个新版本都引入了新的特性和改进&#xff0c;帮助开发者在提高生产力的同时&#xff0c;也能更好地优化程序性能。本文将详细介绍Java新版本中的重要特性&#xff0c;如从Java 8到Java 17&#xff0c;并探讨性能调优的方法&#xff0c;包括JVM调…

Python自动化办公(二) —— 查看文件夹中的PDF文件数量

Python自动化办公&#xff08;二&#xff09; —— 查看文件夹中的PDF文件数量 在日常办公中&#xff0c;我们经常需要统计某个文件夹中的PDF文件数量。手动操作不仅费时费力&#xff0c;而且容易出错。幸运的是&#xff0c;使用Python可以轻松实现这个过程。本文将介绍如何使用…

【字符串函数2】

5. strncpy 函数的使用和模拟实现 选择性拷贝 char * strncpy ( char * destination, const char * source, size_t num ); 1.拷贝num个字符从源字符串到目标空间。 2.如果源字符串的⻓度⼩于num&#xff0c;则拷⻉完源字符串之后&#xff0c;在⽬标的后边 追加0 &#…

MyBatis-Plus整合达梦数据库

文章目录 1. 环境准备2. 创建Spring Boot项目3. 引入依赖4. 配置数据源5. 配置MyBatis-Plus6. 创建实体类7. 创建Mapper接口8. 创建Service类9. 创建Controller类10. 创建Mapper XML文件11. 测试12. 进一步优化12.1 配置分页插件12.2 配置乐观锁插件13. 总结🎉欢迎来到Java学…

案例学习-存量更新规划实施探索(武汉)

案例学习-存量更新规划实施探索&#xff08;武汉&#xff09; 武汉市在早期旧城更新实践中发现零散化的更新往往导致资源配置分散、城市建设破碎化等弊病&#xff0c;特别是由于过于强调项目自身“经济平衡”&#xff0c;在实施过程中也逐步暴露出住宅占比过大、强度偏高、公服…

屹晶微EG3002 单通道功率MOSFET驱动芯片 贴片SOP8

EG3002作为一款功率MOSFET驱动芯片&#xff0c;它的应用领域主要取决于其技术参数和性能特点。根据之前提供的信息&#xff0c;EG3002可能适用于以下领域&#xff1a; 1. 电源管理&#xff1a;用于高效率电源转换器&#xff0c;如开关电源&#xff08;SMPS&#xff09;、电池充…

yolov8通过训练完成的模型生成图片热力图--论文需要

源代码来自于网络 使用pytorch_grad_cam&#xff0c;对特定图片生成热力图结果。 安装热力图工具 pip install pytorch_grad_cam pip install grad-cam# get_params中的参数&#xff1a; # weight&#xff1a; # 模型权重文件&#xff0c;代码默认是yolov8m.pt # c…

希亦、添可、石头洗地机哪款好用?2024洗地机深度测评

今年的洗地机市场竞争异常激烈&#xff0c;各大品牌纷纷推出了自己的旗舰产品。这对消费者来说是个好消息&#xff0c;因为有更多的选择空间。然而&#xff0c;面对如此多的优质洗地机&#xff0c;选择合适的一款也成了一种“幸福的烦恼”。 作为一个专业的测评人士&#xff0…

【笔记】【矩阵的二分】668. 乘法表中第k小的数

力扣链接&#xff1a;题目 参考地址&#xff1a;参考 思路&#xff1a;二分查找 把矩阵想象成一维的已排好序的数组&#xff0c;用二分法找第k小的数字。 假设m行n列&#xff0c;则对应一维下标范围是从1到mn&#xff0c;初始&#xff1a; l1; rmn; mid(lr)/2 设mid在第i行&a…

【源码】综合股票币币合约交易所源码/etf交易所源码/美股港股台股交易所源码

支持多国语言 全开源可二开的一个版本&#xff01;支持虚拟货币 ETF 外汇 美股 A股 港股 台股。 前端是VUE开发&#xff08;带vue工程源码&#xff09;后端JAVA开发&#xff01;搭建也相对简单。 总的来说功能非常强大&#xff0c;适合线上运营的一个版本&#xff0c;有兴趣的可…

Linux--08---挂载分区

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 1.查看系统磁盘分区情况1.lsblk 查看2.fdisk -l 2.挂载未分区磁盘1. 创建分区2. 格式化分区3. 创建挂载点4. 挂载分区5. 更新 /etc/fstab6.验证挂载 3.修改挂载的磁…

样本学习:当AI遇上“少见多怪”

东汉名臣牟融在其著作《牟子》写道&#xff1a;“少所见&#xff0c;多所怪&#xff0c;睹橐驼&#xff0c;谓马肿背。”意思是见闻少的人遇到不常见的事物就觉得奇怪&#xff0c;见到骆驼也以为是背肿了的马。因此&#xff0c;后人总用“少见多怪”来嘲笑见识浅陋的人。然而&a…

springboot依赖管理和自动配置

依赖管理和自动配置 依赖管理和自动配置依赖管理什么是依赖管理修改自动仲裁/默认版本号 starter场景启动器starter场景启动器基本介绍官方提供的starter第三方starter 自动配置自动配置基本介绍SpringBoot自动配置了哪些?如何修改默认配置如何修改默认扫描包结构resources\ap…