三、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)$可以替换表名或列名,使用$可能会导致数据不安全