mybatis的接口绑定方法
mybatis实现了接口绑定,使用会更加方便
接口绑定:mybatis中任意定义接口,然后把接口里面的方法和SQL语句绑定,就可以直接调用接口方法就可以。
接口绑定方式:
通过注解绑定,直接在方法上面加上@Select @Update等注解,在注解里包含SQL绑定通过XML里面SQL绑定,需要在xml配置文件里的namespace必须指定接口的全限定名。
XML方法的方法
1、创建接口文件
public interface StudentMapper213 {
//通过id来查询某一个学生信息
public Student213 selectStudentById(Integer id);
}
2、创建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.tulun.mapper.StudentMapper213">
<select id="selectStudentById" parameterType="int" resultMap="studentMap">
select * from student where SID = #{id}
</select>
3、配置映射路径
<!--映射文件引入-->
<mappers>
<mapper resource="mapper/studentmapper213.xml"/>
</mappers>
注意:编写mapper.java 接口和mapper.xml配置文件需要遵循一些开发规范,mybatis才能自动生成mapper接口的代理类对象。
开发规范:
1、在mapper.xml配置文件中namespace等于接口的名称
2、使用的Statement的id属性值需要和接口中的方法名保持一致
3、接口文件方法参数和mapper.xml文件中parameterType指定类型一致
4、接口文件方法的返回值类型和mapper.xml中的resultType指定的类型一致
注解形式
注解方法SQL直接写在接口上
优点:比较简单,效率更高一些
缺点:当SQL发生改变都需要重新编译代码
mybatis的注解中,基本注解有@Select 、@Insert()、@Update、@Delete
@Insert
@Options(useGeneratedKeys = true)
@Insert("insert into tulun (name) values(#{name})")
int insertTulun(Tulun213 tulun);
在方法上直接添加@Insert注解,将sql语句直接写在注解中
在插入操作需要添加自增主键等操作,需要使用@Options注解,该注解中包含useGeneratedKeys等操作
和xml配置对比
**@Select **
@Select("select * from tulun where id = #{id}")
Tulun213 selectTulunById(Integer id);
查询操作使用select注解直接在注解内给定SQL语句,如果数据库字段和映射pojo类属性名一致,则如上使用。
也可以使用@results显性指定映射关系
Results注解类似xml方式中ResultMap便签
@Results注解对应XML中的ResultMap标签
@Result对应xml中的result标签或者是id标签(在result注解中后id=true)
输出映射
输出类型:resultType和resultMap
使用resultType,数据库的字段名和pojo类的属性名保持一致才能映射成功
如果字段名和属性名完全不一致,就不能创建出自定义对象
如果字段名和属性名部分一致,会创建出自定义对象,对相同的字段和属性会完成映射
使用resultMap可以显性指定字段名和属性名的映射关系不管输出是单个对象(selectOne)还是多个结果集(selectList),在mapper.xml中resultType或者resultMap的类型是一样的,不一样的是mapper.java 接口文件中返回值类型不一样
输出的是单个自定义的对象,方法返回单个对象的类型
输出的是多个对象的结果集,方法的返回是List
多个接口参数
如果直接在接口中传递多个参数时,在sql执行过程中会抛出一下错误:
mybatis中多个参数时,mybatis有效的参数名只能是0,1,param1,param1等,当传递参数命名为其他的id或name时其不能识别,要么改成0,1等mybatis识别的参数,显然是无意义的。
如何解决,在传递的多个参数上添加注解@Param注解,mybatis就会自动封装成Map类型的数据,Param内的名称作为key,传递的数据作为值,在SQL执行过程中会通过入参来做解析。
int updateNameById(@Param(“id”) Integer id,@Param(“name”) String name);
#{}和${}
#{}
select * from student where SID = #{id}
#{}使用类似于JDBC编程中prepareStatement的执行过程,在SQL中将参数通过‘?’占位符处理,将SQL和参数分别传递给SQL服务端。
${}
select * from student where SID = ${id}
处理参数的获取使用ognl表达式,使用的参数必须提供getter方法
${}使用类似于JDBC中的Statement操作,在执行过程中将参数直接拼接到SQL上
#{}是不存在SQL注入问题
一般推荐使用#{}