Java @Mapper 使用注解的方式注入SQL

MySQL 的 JSON 数据类型(从 MySQL 5.7.8 开始支持)允许你在表中存储和处理 JSON 格式的数据。

JSON 数据类型提供了灵活性,但应谨慎使用。对于需要复杂查询、索引或关系约束的数据,传统的关系表结构通常是更好的选择。

mysql中in语句的处理。

一、例如SQL:update bill_main set bill_state = '00' where bill_no in ();

处理如下:

@Update(" update bill_main set bill_state = '00' where  bill_no in <foreach collection='billNoList' item='billNo' open='(' separator=',' close=')'> #{billNo}</foreach> ")
Boolean approveReject(@Param("billNoList") List<String> billNoList);

 @Update(" update bill_main set bill_state = '00' where  bill_no in <foreach collection='billNoList' item='billNo' open='(' separator=',' close=')'> #{billNo}</foreach> ")
    Boolean approveReject(@Param("billNoList") List<String> billNoList);

二、遇到数据类为JOSN的SQL的处理(t3)

SELECT  t1.id,
        t1.bill_no,
        t1.process_instance_id,
        t1.process_definition_id,
        t1.process_deployment_id,
        t1.approve_id,
        t1.remark,
        t1.enabled_flag,
        json_unquote(json_extract(json_extract(t2.BILL_DATA,'$.comBasicInfo'),'$[0].comApplyUserId')) comApplyUserId,
        json_unquote(json_extract(json_extract(t2.BILL_DATA,'$.comBasicInfo'),'$[0].comApplyUserName')) comApplyUserName,
        json_unquote(json_extract(json_extract(t2.BILL_DATA,'$.comBasicInfo'),'$[0].comApplyUserCode')) comApplyUserCode,
        t3.hj_value, #工时
        t3.yye04,#项目
        t3.comSubCategoryCode #月份
        FROM bill_main t1
        LEFT JOIN bill_main_data t2 ON t1.id = t2.id
         LEFT join (
         SELECT 
                  t.id,#单据号
                  jt.hj_value, #工时
                  jt.yye04,#项目
                  jt.comSubCategoryCode #月份
                FROM bill_main_data t,
                JSON_TABLE(
                    t.BILL_DATA->'$.jyInfo',
                    '$[*]' COLUMNS (
                        idx FOR ORDINALITY,
                        hj_value VARCHAR(100) PATH '$.hj',
                        yye04 VARCHAR(100) PATH '$.yye04',
                        comSubCategoryCode VARCHAR(100) PATH '$.comSubCategoryCode'
                    ) ) AS jt
         ) t3
         on t1.id = t3.id

SELECT  t1.id,
        t1.bill_no,
        t1.process_instance_id,
        t1.process_definition_id,
        t1.process_deployment_id,
        t1.approve_id,
        t1.remark,
        t1.enabled_flag,
        json_unquote(json_extract(json_extract(t2.BILL_DATA,'$.comBasicInfo'),'$[0].comApplyUserId')) comApplyUserId,
        json_unquote(json_extract(json_extract(t2.BILL_DATA,'$.comBasicInfo'),'$[0].comApplyUserName')) comApplyUserName,
        json_unquote(json_extract(json_extract(t2.BILL_DATA,'$.comBasicInfo'),'$[0].comApplyUserCode')) comApplyUserCode,
        t3.hj_value, #工时
        t3.yye04,#项目
        t3.comSubCategoryCode #月份
        FROM bill_main t1
        LEFT JOIN bill_main_data t2 ON t1.id = t2.id
         LEFT join (
         SELECT 
                  t.id,#单据号
                  jt.hj_value, #工时
                  jt.yye04,#项目
                  jt.comSubCategoryCode #月份
                FROM bill_main_data t,
                JSON_TABLE(
                    t.BILL_DATA->'$.jyInfo',
                    '$[*]' COLUMNS (
                        idx FOR ORDINALITY,
                        hj_value VARCHAR(100) PATH '$.hj',
                        yye04 VARCHAR(100) PATH '$.yye04',
                        comSubCategoryCode VARCHAR(100) PATH '$.comSubCategoryCode'
                    ) ) AS jt
         ) t3
         on t1.id = t3.id

三、mysql json 数据类型的使用示例

-- 创建电商商品表
CREATE TABLE products (
    id INT PRIMARY KEY,
    name VARCHAR(100),
    attributes JSON,
    price DECIMAL(10,2)
);

-- 插入商品数据
INSERT INTO products VALUES
(1, '手机', '{"brand": "苹果", "color": "黑色", "storage": "128GB", "specs": {"ram": "4GB", "cpu": "A15"}}', 6999),
(2, '笔记本', '{"brand": "戴尔", "color": "银色", "storage": "512GB", "specs": {"ram": "16GB", "cpu": "i7"}}', 8999);

-- 复杂查询:查找品牌是苹果且颜色是黑色的产品
SELECT name, price FROM products
WHERE JSON_EXTRACT(attributes, '$.brand') = '苹果'
AND JSON_EXTRACT(attributes, '$.color') = '黑色';

-- 嵌套查询
SELECT name, attributes->'$.specs.cpu' AS cpu
FROM products;

在 MyBatis 与 Spring Boot 整合开发中,Mapper 层注解用于简化数据库操作的实现,减少 XML 文件的使用。以下是 Mapper 层常用的注解及其作用: ### 常用注解 #### `@Mapper` 该注解用于标识一个接口为 MyBatis 的 Mapper 接口。MyBatis 会根据这个接口自动生成实现类,用于执行 SQL 操作。通过此注解,可以将接口注册为 Spring 容器中的 Bean [^2]。 示例: ```java @Mapper public interface UserMapper { @Select("SELECT * FROM users WHERE id = #{id}") User selectById(int id); } ``` #### `@MapperScan` `@MapperScan` 是 Spring Boot 支持 MyBatis 组件的一个注解,通过此注解指定 MyBatis 接口类的路径,即可完成对 MyBatis 接口的扫描和自动注入。它通常用于配置类上,避免在每个 Mapper 接口上添加 `@Mapper` 注解 [^1]。 示例: ```java @Configuration @MapperScan("com.example.mapper") public class MyBatisConfig { } ``` #### `@Select`, `@Insert`, `@Update`, `@Delete` 这些注解用于直接在接口方法上定义 SQL 语句,分别对应查询、插入、更新和删除操作。它们可以替代 XML 映射文件,使代码更加简洁 [^2]。 示例: ```java @Mapper public interface UserMapper { @Select("SELECT * FROM users WHERE id = #{id}") User selectById(int id); @Insert("INSERT INTO users(name, email) VALUES(#{name}, #{email})") void insertUser(User user); @Update("UPDATE users SET name = #{name} WHERE id = #{id}") void updateUser(User user); @Delete("DELETE FROM users WHERE id = #{id}") void deleteUser(int id); } ``` #### `@Results`, `@Result` 当返回结果需要映射到 Java 对象时,可以使用 `@Results` 和 `@Result` 注解来定义字段与列的映射关系 [^2]。 示例: ```java @Mapper public interface UserMapper { @Select("SELECT * FROM users WHERE id = #{id}") @Results({ @Result(property = "userId", column = "id"), @Result(property = "userName", column = "name") }) User selectById(int id); } ``` #### `@Param` 在多个参数传递的情况下,`@Param` 用于指定参数名称,以便在 SQL 中引用 [^2]。 示例: ```java @Mapper public interface UserMapper { @Select("SELECT * FROM users WHERE name = #{name} AND status = #{status}") List<User> findUsersByNameAndStatus(@Param("name") String name, @Param("status") int status); } ``` ### 应用场景 - **数据库操作**:定义与数据库表相关的增删改查接口。 - **SQL 映射**:通过注解方式直接编写 SQL,替代 XML 配置。 - **MyBatis 集成**:在 Spring Boot 项目中,将 Mapper 接口注册为 Spring Bean,便于依赖注入 [^2]。 ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

奋力向前123

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值