1、本篇博客的背景和目的
目前我本人正在学习MyBatis框架,在原先了解并且懵懵懂懂使用的基础上,开始系统正式的学习。目前已经阐述了MVC架构模式和三层架构,明晰了在Web项目中的普遍编码层次,认识了框架,回顾了JDBC连接数据库,初步建立了使用MyBatis和MySQL的Maven项目,简单解释了STDOUT_LOGGING日志和手动提交事务,记录了MyBatis中#占位符的使用方法,回顾了MyBatis执行SQL语句的过程和使用到的一些重要类和接口,记录了将固定化的代码整合到一个工具类MyBatisUtil中,以减少代码量。记录了dao层接口的实现以及为什么要实现它。记录了MyBatis动态代理和使用动态代理的要求以及初步使用一下动态代理生成的实现类。本篇博客记录一下parameterType属性和它的使用。
2、我的上一篇博文
我上一篇博文介绍了MyBatis动态代理的,并记录了它的使用。感兴趣的读者可以前往阅读,链接如下所示:
3、parameterType属性用在哪里?为什么要使用这个属性?
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嘛;
4、parameterType属性的使用方法
parameterType属性值是某一种数据类型的全限定路径名称或者是这种数据类型的别名。
某一种数据类型可以是java中本身就有的数据类型,例如Integer,String等,也可以是项目中的实体类,例如Student类,Teacher类等。
为什么要使用别名呢?因为懒!!如果dao层接口方法中形参类型是Integer,那么全限定路径名称就是:java.long.Integer 这明显太长了啊!!!不方便,因此MyBatis给每一种java中的数据类型都给了一个别名,直接使用别名就可以了。这个在MyBatis的使用手册里面有,可以直接在官网查到,这里我截取一个图:
直接点击类型别名就可以了,如下所示:
5、parameterType属性的使用
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<Student> selectStudents();
public int insertStudent(Student student);
}
然后是mapper.xml文件代码:
<?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="com.dcy.dao.StudentDao">
<!--
select标签表示的是查询操作,里面是查询语句。
id属性的值是SQL语句的唯一标识,是一个自定义的字符串。
按照编码规范,这里统一推荐使用dao接口中对应的方法名称。
resultType属性是表示执行SQL语句后,结果对应那个类型的JAVA对象。resultType的值是某个实体类的全限定名称。
比如:com.dcy.domain.Student
-->
<select id="selectById" resultType="com.dcy.domain.Student" parameterType="java.lang.Integer">
<!--select id,name,email,age from student where id=1001-->
select id,name,email,age from student where id=#{studentId}
</select>
<!-- 下面的语句使用了占位符,因为我们传过来的是一个java对象,可以直接使用它的属性名,放在花括号里面,
前面配上#,这就相当于是传参了-->
<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文件使用别名如下所示:
<?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="com.dcy.dao.StudentDao">
<!--
select标签表示的是查询操作,里面是查询语句。
id属性的值是SQL语句的唯一标识,是一个自定义的字符串。
按照编码规范,这里统一推荐使用dao接口中对应的方法名称。
resultType属性是表示执行SQL语句后,结果对应那个类型的JAVA对象。resultType的值是某个实体类的全限定名称。
比如:com.dcy.domain.Student
-->
<select id="selectById" resultType="com.dcy.domain.Student" parameterType="int">
<!--select id,name,email,age from student where id=1001-->
select id,name,email,age from student where id=#{studentId}
</select>
<!-- 下面的语句使用了占位符,因为我们传过来的是一个java对象,可以直接使用它的属性名,放在花括号里面,
前面配上#,这就相当于是传参了-->
<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>
6、注意的一个点
其实吧!!!
这个parameterType属性不用写也是可以的!!!
因为MyBatis是有反射机制的,可以获取Dao接口的数据类型的;这个属性不是强制需要写的;
在编码规范中,也没有要求强制要写。
这么说吧,这个属性作为一个了解,当提到它的时候知道是干什么的就行啦,不需要写!!!