Mybatis(3)--参数

三、Mybatis理解参数

3.1 传入参数

传入参数:从Java代码中把数据传入mapper文件的sql语句中

(1)parameterType

parameterType是mapper文件中的一个属性,用于表示dao接口中方法的参数的数据类型

sql映射文件

<?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="customDAO.TestDao">
    <!--指定参数id的类型为Integer-->
    <!--设置parameterType的值-->
    <!--
        parameterType:dao接口中方法的参数的数据类型
        parameterType的值是java数据类型的全限定名称或mybatis定义的别名
        例如:parameterType="java.lang.Integer"
             parameterType="int"
        parameterType可省略,因为mybatis可以通过反射机制知道接口参数的数据类型
    -->
    <select id="selectTestsById" parameterType="java.lang.Integer" resultType="customDAO.Test">
        SELECT id,name FROM t_test WHERE ID = #{id};
    </select>
</mapper>

dao接口

package customDAO;

import java.util.List;

//定义操作test表的接口
public interface TestDao
{
    //通过主键id查找到唯一一个Test对象
    public Test selectTestsById(Integer id);
}
(2)一个简单类型的参数

sql映射文件

<?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="customDAO.TestDao">
    <select id="selectTestsById" parameterType="java.lang.Integer" resultType="customDAO.Test">
        <!--
            使用#{}之后,mybatis执行sql是使用的jdbc中的PreparedStatement对象
            由mybatis执行下面的代码

            (1)mybatis创建Connection,PreparedStatement对象
               String sql = "SELECT id,name FROM t_test WHERE ID = ?";
               PreparedStatement ps = coon.preparedStatement(sql);
               ps.setInt(1,1001);

            (2)执行sql语句,封装为resultType="customDAO.Test"对象
               ResultSet rs = ps.executeQuery();
               Test t = new Test();
               while(rs.next())
               {
                   //从数据库表中取一行数据,存入以一个Java对象中
                   t.setId(rs.getInt("id"));
                   t.setName(rs.getString("name"));
               }
               //赋给dao方法调用的返回值
               return t;
        -->
        SELECT id,name FROM t_test WHERE ID = #{id};
    </select>
</mapper>

对应的dao接口

package customDAO;

import java.util.List;

//定义操作test表的接口
public interface TestDao
{
    /**
     * 一个简单类型的参数:
     *  mybatis把java的基本数据类型和String都称为简单类型
     *  在mapper文件获取一个简单类型的参数的值,使用:#{任意字符}
     * */
    public Test selectTestsById(Integer id);
}
(3)多个参数

多个参数:使用@param命名参数

sql映射文件

<?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="customDAO.TestDao">
    <!--
        多个参数,使用@Param("xxx")命名
    -->
    <select id="selectMutiParam" resultType="customDAO.Test">
        SELECT id,name FROM t_test WHERE ID = #{id} or name = #{name};
    </select>
</mapper>

对应的dao接口

package customDAO;

import org.apache.ibatis.annotations.Param;

import java.util.List;

//定义操作test表的接口
public interface TestDao
{
    /**
     * 多个参数:命名参数,在形参前加入@param("自定义参数名称")
     * */
    public List<Test> selectMutiParam(@Param("id") Integer id, @Param("name") String name);
}
(4)使用java对象

使用java对象作为接口中方法的参数

sql映射文件

<?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="customDAO.TestDao">
    <!--
        多个参数:使用Java对象的属性值作为参数实际值

        (1)完整语法:

        #{属性名,javaType=类型名称,jdbcType=数据类型}
        javaType:指Java中属性的数据类型
        jdbcType:在数据库中的数据类型
        例如:#{name,javaType="java.lang.String,jdbcType=VARCHAR"}

        (2)简化方式:

        #{属性名} javaType和jdbcType都可以通过反射机制获取
    -->
    <!--
    <select id="selectMutiObject" resultType="customDAO.Test">
        SELECT id,name FROM t_test WHERE id = #{id,javaType="java.lang.Integer,jdbcType=INTEGER"} or name = #{name,javaType="java.lang.String,jdbcType=VARCHAR"};
    </select>
    -->
    <select id="selectMutiObject" resultType="customDAO.Test">
        SELECT id,name FROM t_test WHERE id = #{id} or name = #{name};
    </select>
</mapper>

对应的dao接口

package customDAO;

import org.apache.ibatis.annotations.Param;

import java.util.List;

//定义操作test表的接口
public interface TestDao
{
    /**
     * 多个参数:使用java对象作为接口中方法的参数
     * */
    public List<Test> selectMutiObject(Test param);
}
(5)按位置传参

sql映射文件

<?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="customDAO.TestDao">
    <!--
        多个参数:按位置传值
        mybatis3.4以前使用#{0},#{1}
        mybatis3.4之后使用#{arg0},#{arg1}
    -->
    <select id="selectMutiPosition" resultType="customDAO.Test">
        SELECT id,name FROM t_test WHERE id = #{arg0} or name = #{arg1};
    </select>
</mapper>

对应的dao接口

package customDAO;

import org.apache.ibatis.annotations.Param;

import java.util.List;

//定义操作test表的接口
public interface TestDao
{
    /**
     * 多个参数:按位置传值
     *
     * */
    public List<Test> selectMutiPosition(Integer id, String name);
}
(6)使用map传值

sql映射文件

<?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="customDAO.TestDao">
    <!--
        多个参数:按map传值
        语法:#{map的key}
    -->
    <select id="selectMutiMap" resultType="customDAO.Test">
        SELECT id,name FROM t_test WHERE id = #{id} or name = #{name};
    </select>
</mapper>

dao接口

package customDAO;

import org.apache.ibatis.annotations.Param;

import java.util.List;
import java.util.Map;

//定义操作test表的接口
public interface TestDao
{
    /**
     * 多个参数:使用map传值
     *
     * */
    public List<Test> selectMutiMap(Map<String,Object> map);
}
(7)#和$的区别

(1)在执行sql语句时,#表示占位符,其内容会自动被替换为?
而$则表示字符串拼接,其内容为字符串拼接后的结果
例如:

SELECT id,name FROM t_test WHERE ID = #{id};

#的结果:SELECT id,name FROM t_test WHERE ID = ?;

$的结果:SELECT id,name FROM t_test WHERE ID = 1001;

String sql = “SELECT id,name FROM t_test WHERE ID=” + “1001”;

(2)#使用PreparedStatement对象执行sql,$使用Statement对象执行sql,效率比PreparedStatement低

(3)$可以替换表名或列名,使用$可能会导致数据不安全

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值