mybatis中接口绑定主要有两种实现方式
● 通过注解绑定:就是在接口的方法上加上@Select、@update等注解,里面包含SQL语句进行绑定
● 通过XML里面写SQL进行绑定,需要指定xml映射文件里的namespace必须为接口的全路径
语句比较简单时,使用注解绑定,当SQL语句比较复杂是,用xml绑定,一般使用xml比较多
mybatis的强大之处在于自定义SQL语句,映射器的xml文件方式相比JDBC简单,节省代码量
2.1使用步骤- 创建Mapper.Java接口文件
public interface StudentMapper {
Student selectStudentById(Integer sid);
}
- 创建Mapper.xml配置文件
- 在全局配置文件中配置映射路径
2.2 XML开发方式规范
-
在mapper.xml中namespace命令空间等于Mapper接口的全路径名
-
Mapper.java接口中的方法名和Mapper.xml中的Statement的Id一致
-
Mapper.java接口中方法的参数类型和Mapper.xml中parameterType的指定类型一致
-
Mapper.java接口中方法的返回值类型和Mapper.xml中的resultType指定的类型一致
返回值以resultMap为例讲解如下:
返回是结果集
//查询所有数据
ListselectAllStudents();
不管是返回一个结果还是多个结果集,返回类型和结果数量是无关的。
resultMap和resultType的区别?
resultMap和resultType都是指定返回参数类型,类型可以是pojo类全限定名或别名
resultType可以完成自动映射过程,但是对于字段不一致时是无法完成字段映射的,如果字段完全一致优先选取resultType
resultMap是可以显性完成映射过程,对于字段不一致时能够完成映射,字段不一致优先选取resultMap进行映射
2.3.2 insert标签如果数据库属性名和Java的字段名不一致时还能创建出映射对象吗?不可以
如果数据库属性名和Java的字段名只存在一个相同的,可以创建出对象吗?都可以创建
//插入数据
int insertStudent(Student student);
insert into
student(SID,Sname,Sage,Ssex)
values
(#{SID},#{name},#{Sage},#{Ssex})
2.3.3 多个参数的接口问题
给定需求:通过id来修改name
接口:
//更新用户姓名
int updateNameByID(Integer id,String name);
update Student set Sname = #{name} where SID= #{id}
直接调用抛出BindingException异常:
这个错误表示,XML可用的参数只有0,1,param1,param2,没有id和name。0和1,param1和param2都是mybatis根据参数位置自定义名字,如果将参数中#{name}参数修改为#{0}或者#{param1},将#{id}参数改为#{1}或者#{param2},这个方法即可调用,但是这样的参数不易立即建立它们之间关系。
解决方案:通过给参数配置@Param注解,mybatis会自动将参数封装为Map类型,@Param注解值作为map中的key,其对应的参数实际值作为value,这样SQL中会通过解析map来获取值
修改如下:
//更新用户姓名
int updateNameByID(@Param("id") Integer id, @Param("name") String name);
三、注解方式的用法
注解形式是直接将SQL写在接口方法上
优势:效率较高
缺点:SQL有变动时需要重新编译代码
在mybatis注解的SQL中,基本的注解:@Select、@Update、@Delete、@Insert
以user表为例讲解
注解实现步骤1、给定pojo类
public class User {
private Integer id;
private String name;
private String password;
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
@Override
public String toString() {
return "User{" +
"id=" + id +
", name='" + name + ''' +
", password='" + password + ''' +
'}';
}
}
2、给定mapper.java接口
public interface UserMapper {
}
3、在配置文件中指定文件映射位置
验证注解 @select注解
@select注解类似于xml中的select标签
当字段无法映射时,通过@Result注解完成显性映射
@Results(id = "userMap",value = {
@Result(property = "id",column = "id",id = true),
@Result(property = "name",column = "name"),
@Result(property = "password",column = "password")
})
@Insert注解
@Options(useGeneratedKeys = true,keyColumn = "id")
@Insert("insert into user(name,password) values(#{name},#{password})")
int insertUser(User user);
@Update注解
@Delete注解


