目前我本人正在学习MyBatis框架,在原先了解并且懵懵懂懂使用的基础上,开始系统正式的学习。目前已经阐述了MVC架构模式和三层架构,明晰了在Web项目中的普遍编码层次,认识了框架,回顾了JDBC连接数据库,初步建立了使用MyBatis和MySQL的Maven项目,简单解释了STDOUT_LOGGING日志和手动提交事务,记录了MyBatis中#占位符的使用方法,回顾了MyBatis执行SQL语句的过程和使用到的一些重要类和接口,记录了将固定化的代码整合到一个工具类MyBatisUtil中,以减少代码量。记录了dao层接口的实现以及为什么要实现它。记录了MyBatis动态代理和使用动态代理的要求以及初步使用一下动态代理生成的实现类。本篇博客记录一下parameterType属性和它的使用。
我上一篇博文介绍了MyBatis动态代理的,并记录了它的使用。感兴趣的读者可以前往阅读,链接如下所示:
parameterType属性用在mapper.xml文件中的select标签,insert标签,update等标签中。
那为什么要使用这个属性呢?先从字面意思理解这个属性,parameterType:参数类型。执行SQL语句的时候,其中有一些数据往往是不确定的,比如条件,要插入的数据等。这些可以理解为就是参数。怎么把JAVA程序中的对象作为SQL语句中的参数呢?怎么传进去呢?也可以说,我们通过JAVA程序将参数传入到mapper.xml文件中的SQL语句里面;
那么使用的方法之一就是:parameterType属性传递参数;它表示的是参数的类型, 指定的是dao接口中方法的形参数据类型;这个形参的数据类型是给MyBatis使用的;mybatis在给SQL语句的参数赋值的时候使用。
在JDBC中,我们使用过: PreparedStatement.set(位置,值); 就是使用的这个方法;究竟是setInt( ),还是setString( )?靠的就是parameterType这个属性。因为底层还是JDBC嘛;
parameterType属性值是某一种数据类型的全限定路径名称或者是这种数据类型的别名。
某一种数据类型可以是java中本身就有的数据类型,例如Integer,String等,也可以是项目中的实体类,例如Student类,Teacher类等。
为什么要使用别名呢?因为懒!!如果dao层接口方法中形参类型是Integer,那么全限定路径名称就是:java.long.Integer 这明显太长了啊!!!不方便,因此MyBatis给每一种java中的数据类型都给了一个别名,直接使用别名就可以了。这个在MyBatis的使用手册里面有,可以直接在官网查到,这里我截取一个图:
直接点击类型别名就可以了,如下所示:
1、使用全限定类型名称:
首先是dao层接口代码,如下所示:
- package com.dcy.dao;
-
- import com.dcy.domain.Student;
-
- import java.util.List;
-
- public interface StudentDao {
- public Student selectById(Integer id);
- public List
selectStudents(); - public int insertStudent(Student student);
- }
然后是mapper.xml文件代码:
- mapper
- PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
- "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
-
- <mapper namespace="com.dcy.dao.StudentDao">
- <select id="selectById" resultType="com.dcy.domain.Student" parameterType="java.lang.Integer">
- select id,name,email,age from student where id=#{studentId}
- select>
- <insert id="insertStudent" parameterType="com.dcy.domain.Student">
- insert into student values (#{id},#{name},#{email},#{age})
- insert>
- <select id="selectStudents" resultType="com.dcy.domain.Student">
- select * from student
- select>
-
- mapper>
最后在Main方法中进行一下测试:
- package com.dcy;
-
- import com.dcy.dao.StudentDao;
- import com.dcy.domain.Student;
- import com.dcy.utils.MyBatisUtil;
- import org.apache.ibatis.session.SqlSession;
-
- public class starter {
- public static void main(String[] args) {
- SqlSession sqlSession= MyBatisUtil.getSqlSession();
- StudentDao dao = sqlSession.getMapper(StudentDao.class);
- Student student = dao.selectById(1001);
- System.out.println(student);
- }
- }
运行结果如下所示:
2、使用数据类型别名
使用数据类型别名,就是对照数据类型别名表,更改mapper.xml文件就可以了。
上面dao层接口代码对应mapper.xml文件使用别名如下所示:
- mapper
- PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
- "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
-
- <mapper namespace="com.dcy.dao.StudentDao">
- <select id="selectById" resultType="com.dcy.domain.Student" parameterType="int">
- select id,name,email,age from student where id=#{studentId}
- select>
- <insert id="insertStudent" parameterType="com.dcy.domain.Student">
- insert into student values (#{id},#{name},#{email},#{age})
- insert>
- <select id="selectStudents" resultType="com.dcy.domain.Student">
- select * from student
- select>
-
- mapper>
其实吧!!!
这个parameterType属性不用写也是可以的!!!
因为MyBatis是有反射机制的,可以获取Dao接口的数据类型的;这个属性不是强制需要写的;
在编码规范中,也没有要求强制要写。
这么说吧,这个属性作为一个了解,当提到它的时候知道是干什么的就行啦,不需要写!!!