mybaits传参

ParameterType

写在mapper文件中的一个属性,表示dao接口方法的参数的数据类型

比如我要查询一个id为1的对象

1
2
Student student=dao.selectStudent(1);
System.out.println(student);
1
2
3
<select id="selectStudent" parameterType="java.lang.Integer" resultType="com.zss.pojo.Student">
select * from student where id=#{id}
</select>

ParameterType里面可以存储mybaits的别名,也可以存储全类型,

image-20220502111313219

但是注意ParameterType不是强制的,通过反射机制也可以获得的参数类型

简单数据类型

mybaits把Java的基本数据类型和String都叫做简单类型,在mapper文件中就是一个#{任意字符},也就是说不必与传入参数的名称必须相同

1
2
//查询单个student对象
Student selectStudent(Integer id);
1
2
3
<select id="selectStudent" parameterType="java.lang.Integer" resultType="com.zss.pojo.Student">
select * from student where id=#{studentid}
</select>

我们使用mybaits实际还是使用了jdbc进行操作,只不过是在mybaits内部进行操作,

  1. mybaits创建connection对象,preparedStatement
  2. 执行封装为resultType的对象,设置参数,并且返回该对象

多个参数传值方式

使用@Param

1
2
//查询单个student对象
Student selectStudent(@Param("myid") Integer id,@Param("myname")String name);
1
2
3
<select id="selectStudent"  resultType="com.zss.pojo.Student">
select * from student where id=#{myid} and name=#{myname}
</select>

使用参数对象

1
2
//查询单个student对象
Student selectStudent(Student student);
1
2
3
4
5
6
public static void main( String[] args ) throws IOException {
SqlSession sqlSession= MyBaitsUtils.getSqlSession();
StudentDAO dao=sqlSession.getMapper(StudentDAO.class);
Student student=dao.selectStudent(new Student(1003,"haha"));
System.out.println(student);
}
1
2
3
4
5
6
7
8
9
10
11
<!--多个参数,使用Java对象的属性值,作为参数的实际值
使用对象语法#{属性名,Javatype=类型名称,jdbctype=数据类型}
Javatype指Java中属性的数据类型
jdbctype在数据库中的数据类型
例如:#{myid,Javatype=java.lang.Integer,jdbctype=Integer}
简化方式:其中的Javatype与jdbctype的值我们可以通过反射获取,所以只需要传入属性即可

-->
<select id="selectStudent" resultType="com.zss.pojo.Student">
select * from student where id=#{id} and name=#{name}
</select>

使用按位置获取

但是这种方法缺陷明显,位置一旦调换就会出错

1
2
//查询单个student对象
Student selectStudent(Integer id,String name);
1
2
3
<select id="selectStudent"  resultType="com.zss.pojo.Student">
select * from student where id=#{arg0} and name=#{arg1}
</select>

当然我们也可以使用map获取值,但是这种方式传参太繁琐

#与$

#:占位符,告诉mybaits使用实际的参数值代替。并使用preparestatement执行sql语句,#{}代替sql语句的?,更加安全

而$字符串替换,告诉mybaits使用$字符串替换所在的位置,使用statement把sql语句和${}的内容链接起来。主要用在替换表名字,列名字,不同列排序等操作

那么我们说起$与#的区别,其实就是说preparestatement与statement的区别,那么

  1. #在sql语句中做到占位的,使用preparestatement执行sql,效率高
  2. #能够避免sql注入
  3. $不适用占位符,是字符串的链接方式,使用statement对象执行sql效率低
  4. $可以替换列名和表名

$的使用

首先我们需要确定数据是安全的,比如现在我需要进行排序,但是不清楚现在是按照姓名排序,还是按照email排序,所以现在的order by后面的参数不能明确

1
public List<Student> selectStudents(String col);
1
2
3
<select id="selectStudents" resultType="com.zss.pojo.Student">
select * from student order by ${col};
</select>
1
2
3
4
5
6
7
//在这里我们只需要更改这个参数即可,而xml文件的order by语句不用再去改变
public static void main( String[] args ) throws IOException {
SqlSession sqlSession= MyBaitsUtils.getSqlSession();
StudentDAO dao=sqlSession.getMapper(StudentDAO.class);
List<Student> students=dao.selectStudents("name");
System.out.println(students);
}