MyBatis 传递参数:从 java 代码中把参数传递到 mapper.xml 文件
六、一个简单参数:
Dao 接口中方法的参数只有一个简单类型(java 基本类型和 String),
占位符 #{ 任意字符 },和方法的参数名无关。
6.1、sql映射文件,StudentDao.xml:
<!--namespace:命名空间,唯一值 ,推荐使用:dao 接口的全限定名称 -->
<mapper namespace="com.lifang.dao.StudentDao">
<!--
<select>: 表示查询操作, 标签中必须是 select 语句
1、id: sql语句自定义的名称,唯一值,要求使用dao接口的方法名
2、resultType: 推荐使用类的全限定名称
-->
<select id = "selectStudentById" resultType = "com.lifang.domain.Student">
select id,name,email,age from student where id = #{studentId}
<!--由mybatis创建Student对象给属性赋值-->
</select>
6.2、StudentDao接口:
public interface StudentDao {
//查询Student表中的所有数据:
public List<Student> selectStudents();
public int insertStudent(Student student);
public Student selectStudentById(Integer id);
}
6.3、测试代码及结果:
@org.junit.Test
public void test03(){
SqlSession sqlSession = MybatisUtils.getSqlSession();
StudentDao dao = sqlSession.getMapper(StudentDao.class);
Student s = dao.selectStudentById(1002);
System.out.println(s);
}
七、parameterType介绍
思考:如何表示Dao接口方法的形参id是整型类型的呢?:
parameterType: 接口中方法参数的类型, 类型的完全限定名或者是Mybatis定义的别名。这个属性是可选的,因为 MyBatis 可以通过反射机制推断出Dao接口参数的数据类型,所以可以没有,我们一般不写:
<!--
parameterType : dao接口中方法参数的数据类型。可以不写
parameterType它的值是java的数据类型全限定名称或者是mybatis定义的别名
例如 : parameterType="java,lang.Integer
parameterType="int
-->
<select id = "selectStudentById" parameterType ="int" resultType = "com.lifang.domain.Student">
select id,name,email,age from student where id = #{studentId}
</select>
<select id = "selectStudentById" resultType = "com.lifang.domain.Student">
select id,name,email,age from student where id = #{studentId}
</select>
别名不是我创建的 是mybatis创建的 在mybatis文档有说明 中文官网 英文手册上也有
int 或 java.lang.Integer
hashmap 或 java.util.HashMap
list 或 java.util.ArrayList ......
<select>,<insert>,<update>,<delete>都可以使用 parameterType 指定类型。
#叫做占位符
Mybatis是封装的JDBC 增强版 内部还是用的jdbc
每遇到一个#号 这里就会变为?占位符
一个#{}就是对应一个问号 一个占位符
用这个对象执行sql语句没有sql注入的风险
八、多个参数-使用@Param
当 Dao 接口方法有多个参数,需要通过名称使用参数:在方法形参前面加入@Param(“自定义参数名 ”),mapper 文件使用#{自定义参数名}。
8.1、sql映射文件,StudentDao.xml:
<select id = "selectMulitParam" resultType="com.lifang.domain.Student">
select id,name,email,age from student where name = #{myname} or age = #{myage}
</select>
8.2、StudentDao接口:
public List<Student> selectMulitParam(@Param("myname") String name,
@Param("myage") Integer age);
8.3、测试代码及结果:
@org.junit.Test
public void test04(){
SqlSession sqlSession = MybatisUtils.getSqlSession();
StudentDao dao = sqlSession.getMapper(StudentDao.class);
List<Student> students = dao.selectMulitParam("李四",23);
students.forEach(student -> System.out.println(student));
}
九、多个参数-使用对象
使用 java 对象传递参数, java 的属性值就是 sql 需要的参数值。 灵活又方便
语法格式: #{ property属性名,javaType=java 数据类型的全限定名称,jdbcType=Mybatis定义的数据库中类型的名称 }
javaType, jdbcType 的类型 MyBatis 可以通过反射获取,一般不需要设置。
常用格式 #{ property }
9.1、代表数据的实体类:
public class QueryParam {
private String queryName;
private Integer queryAge;
9.2、sql映射文件,StudentDao.xml:
<select id = "selectMultiObject" resultType="com.lifang.domain.Student">
select id,name,email,age from student where name = #{queryName} or age =#{queryAge}
</select>
9.3、StudentDao接口:
public List<Student> selectMultiObject(QueryParam queryParam);
9.4、测试代码及结果:
@org.junit.Test
public void test05(){
SqlSession sqlSession = MybatisUtils.getSqlSession();
StudentDao dao = sqlSession.getMapper(StudentDao.class);
QueryParam queryParam = new QueryParam("王五",23);
List<Student> students = dao.selectMultiObject(queryParam);
students.forEach(student -> System.out.println(student));
}
9.5、总结:
所以我们传参的时候灵活一点,参数可以是现成的java对象,如Student;或者用自定义的java对象QueryParam:
public List<Student> selectMultiObject(QueryParam queryParam);
public List<Student> selectMultiStudent(Student student);
<select id = "selectMultiObject" resultType="com.lifang.domain.Student">
select id,name,email,age from student where name = #{queryName} or age =#{queryAge}
</select>
<select id = "selectMultiStudent" resultType = "com.lifang.domain.Student">
select id,name,email,age from student where name = #{name} or age = #{age}
</select>
十、(不推荐)多个参数-按位置传参
参数位置从 0 开始, 引用参数语法 #{ arg 位置 } , 第一个参数是#{arg0}, 第二个是#{arg1}
注意:mybatis-3.3 版本和之前的版本使用#{0},#{1}方式, 从 mybatis3.4 开始使用#{arg0}方式:
十一、(不推荐)多个参数-使用Map传参
Map 集合可以存储多个值,使用Map向 mapper 文件一次传入多个参数。Map 集合使用 String的 key, Object 类型的值存储参数。 mapper 文件使用 # { key } 引用参数值: