MyBatis手写框架(四)- 优化SQL参数设置

MyBatis手写框架(四)- 优化SQL参数设置

描述

在《MyBatis手写框架(三)》中,我们对返回结果进行了处理,但需要对 SQL 参数处理得更灵活一些。

    @Test
    public void testSelectUser() {
        
        Connection connection = null;
        PreparedStatement preparedStatement = null;
        ResultSet rs = null;

        try {
                        ...
            String sql = "select * from user_info where name = ?";

            preparedStatement = connection.prepareStatement(sql);
            preparedStatement.setString(1, "tester");
                        
                        ...
               }
              ...

    }

  • 我们硬编码输入一个参数,实际上,我们需要根据 SQL 语句的查询条件,输入多个参数。

实现

我们这里实现接收一个参数(8种数据类型及String)和多个参数,处理多个参数通过Map进行传递。实现步骤如下:

  1. 修改配置文件
  2. 修改代码
  3. 测试代码

修改配置文件

db.driver=com.mysql.jdbc.Driver
db.url=jdbc:mysql://localhost:3306/tester?characterEncoding=utf-8
db.username=root
db.password=123456

db.sql.queryUserByParam=select * from user_info where name = ? and gender = ?
db.sql.queryUserByParam.columnName=name,gender
db.sql.queryUserByParam.resultType=com.edugroup.pojo.UserInfo

  • columnName用于说明设置的列名,也对应着封装输入参数的 Map

修改代码

    private void processParam(String statementId, Object param, PreparedStatement pstat) throws SQLException {
        //处理单个参数(8种基本数据类型加String)
        if(param instanceof String || param instanceof Integer) {
            pstat.setObject(1, param);
        } else if(param instanceof Map) {
            Map<String,Object> paraInfo = (Map<String,Object>)param;
            String[] paraColumns = props.getProperty("db.sql." + statementId +".columnName")
                                      .split(",");
            for(int i=0; i < paraColumns.length; i++) {
                pstat.setObject(i+1, paraInfo.get(paraColumns[i]));
            }
        }
    }

  • 参数是基本数据类型和String时,直接设置即可
  • 数据是Map类型,要根据配置中设置列项去设置每个参数值

测试代码

package com.edugroup.test;

import java.io.IOException;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import org.junit.Before;
import org.junit.Test;

import com.edugroup.MyBatisV1;
import com.edugroup.pojo.UserInfo;

public class TestMyBatisV1 {
    
    private MyBatisV1 myBatisV1 = null;
    
    @Before
    public void init() throws IOException {
        myBatisV1 = new MyBatisV1();
    }

    
    @Test
    public void testSelectList() {
        try {
            Map<String,Object> paraMap = new HashMap<String,Object>();
            paraMap.put("name", "tester");
            paraMap.put("gender", "female");
            List<UserInfo> selectList = myBatisV1.selectList("queryUserByParam", paraMap);
            for (UserInfo userInfo : selectList) {
                System.out.println(userInfo);
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

MyBatis手写框架(四)- 优化SQL参数设置

© 版权声明
THE END
如果内容对您有所帮助,就支持一下吧!
点赞0 分享
评论 共7条

请登录后发表评论

    暂无评论内容