mybatis中写sql的三种方式

目录

1. 在mapper文件中配置SQL

2. 注解式的SQL定义

3.通过@SelectProvider来声明sql提供类

1. 在mapper文件中配置SQL

这是我在html文件中对于这个select语句进行了定义


<?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.test.cis.dao.accounts.FinanceRefundApplyDao">
 
	<select id="queryById" resultType="FinanceRefundApplyModel" parameterType="String">
		select * from FINANCE_REFUND_APPLY where ID = #{id}
	</select>
 
</mapper>

现在我们来研究一下怎么调用这一个sql语句

首先我们想要要在对应的mapper里面,保有对于这个语句的接口

package com.test.cis.dao.accounts;

import com.test.cis.model.FinanceRefundApplyModel;

public interface FinanceRefundApplyDao {
    FinanceRefundApplyModel queryById(String id);
}

然后我们仍然得保留好我们需要的MyBatis的配置文件(通常是mybatis-config.xml)中配置这个Mapper接口的路径,以便MyBatis能够找到它。配置可能如下所示:

<configuration>
    <!-- 其他配置 -->
    <mappers>
        <mapper resource="com/test/cis/dao/accounts/FinanceRefundApplyDao.xml"/>
    </mappers>
</configuration>

然后下面这段程序 我们加载了MyBatis的配置文件 mybatis-config.xml,并创建了一个 SqlSessionFactory 对象。然后,我们使用这个工厂来创建一个 SqlSession 对象。在这个 SqlSession 中,我们获取了 FinanceRefundApplyDao 接口的实例,并调用了其中的 queryById 方法来执行SQL查询语句。

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 com.test.cis.dao.accounts.FinanceRefundApplyDao;
import com.test.cis.model.FinanceRefundApplyModel;

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

public class Main {
    public static void main(String[] args) {
        try {
            String resource = "mybatis-config.xml";
            InputStream inputStream = Resources.getResourceAsStream(resource);
            SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
            
            // 打开一个会话
            try (SqlSession session = sqlSessionFactory.openSession()) {
                // 获取Mapper接口的实例
                FinanceRefundApplyDao dao = session.getMapper(FinanceRefundApplyDao.class);
                // 调用Mapper接口中的方法执行SQL语句
                FinanceRefundApplyModel model = dao.queryById("your_id_here");
                System.out.println(model); // 处理查询结果
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

2. 注解式的SQL定义

public interface UserMapper {   
    @Select("select * from user ")
    List<User> AnnotationGetUserList();
}

如果想要的是动态SQL,那么就加上<script>:

public interface UserMapper {
    
    @Select("select * from user ")
    List<User> AnnotationGetUserList();
    
    @Select("<script>"
            + "select * from user "
            + "<if test='id!=null'>"
            + "where id=#{id}"
            + "</if>"
            + "</script>")
    List<User> AnnotationGetUserById(@Param("id")String id);
}

3.通过@SelectProvider来声明sql提供类

public interface UserMapper {
    @SelectProvider(type=SqlProvider.class,method="getUserById")
    List<User> AnnotationProviderGetUserById(String id);
}
public class SqlProvider {
    public String getUserById(String id) {
        String sql = "select * from user ";
        if (id!=null) {
            sql += "    where id="+id;
        }
        return sql;
    }
}

  • 11
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
MyBatis是一个优秀的持久层框架,它提供了很多防止SQL注入的机制,但是还是存在某些情况下可能出现SQL注入的问题。下面我将介绍MyBatis中存在的三种SQL注入方式及相应的防范措施。 1. 字符串拼接注入方式: 在拼接SQL语句时,如果直接使用字符串拼接的方式,可能导致用户的输入被误认为是SQL语句的一部分。为了避免这个问题,我们应该使用参数化查询或者使用预编译语句。参数化查询使用占位符来代替用户输入,然后将用户输入作为参数传递给SQL语句。而预编译语句则是将SQL语句预先编译好,再根据用户的输入来填充相关信息。 2. SQL关键字注入方式: 攻击者可能通过输入SQL关键字来改变原本的SQL语句逻辑,例如输入WHERE 1=1来绕过原本的条件过滤。为了防止这种情况,我们可以使用白名单机制,对用户输入进行严格检查,只允许合法的输入。 3. SQL注释注入方式: 攻击者可能通过注释的方式绕过字符串过滤,例如输入' or '1'='1来改变SQL语句的逻辑。为了防范这种注入方式,我们可以使用过滤器来对用户输入进行过滤,将可能存在的注释进行处理。 综上所述,虽然MyBatis有一些内置的机制来防止SQL注入,但是我们仍然需要在代码中加入一些额外的防范措施,以增加系统的安全性。同时,我们也应该对用户的输入进行充分的验证和过滤,以减少潜在的安全风险。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值