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的别名,也可以存储全类型,
但是注意ParameterType不是强制的,通过反射机制也可以获得的参数类型
简单数据类型
mybaits把Java的基本数据类型和String都叫做简单类型,在mapper文件中就是一个#{任意字符},也就是说不必与传入参数的名称必须相同
1 2
| 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内部进行操作,
- mybaits创建connection对象,preparedStatement
- 执行封装为resultType的对象,设置参数,并且返回该对象
多个参数传值方式
使用@Param
1 2
| 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 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
|
<select id="selectStudent" resultType="com.zss.pojo.Student"> select * from student where id=#{id} and name=#{name} </select>
|
使用按位置获取
但是这种方法缺陷明显,位置一旦调换就会出错
1 2
| 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的区别,那么
- #在sql语句中做到占位的,使用preparestatement执行sql,效率高
- #能够避免sql注入
- $不适用占位符,是字符串的链接方式,使用statement对象执行sql效率低
- $可以替换列名和表名
$的使用
首先我们需要确定数据是安全的,比如现在我需要进行排序,但是不清楚现在是按照姓名排序,还是按照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
| 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); }
|