SQL映射配置文件一方面类似于Hibernate的映射配置文件,通过定义实体与关系表的列之间的对应关系。另一方面使用
这些元素包含三方面内容
1. 要执行的SQL语句
2. SQL语句的入参,比如查询条件
3. SQL语句的返回结果,包括查询结果,更新结果等等,
基本的SQL映射配置:
INSERT INTO STUDENTS(STUD_ID,NAME,EMAIL,DOB) VALUES(#{studId},#{name},#{email},#{dob}) UPDATE STUDENTS SET NAME=#{name}, EMAIL=#{email}, DOB=#{dob} WHERE STUD_ID=#{studId}
resultMap元素
resultMap元素是MyBatis对查询结果进行ORM的主要配置项,简单的说它类似于Hibernate的实体与POJO的映射配置,resultMap的属性和子配置项包括:
resultMap元素的属性
- id:定义resultMap配置项的唯一ID,用于标示resultMap,在
- type: 定义要映射的实体类型,可以使用类型别名
- extends:用于具有继承关系的resultMap的定义,比如实体B继承自实体A,那么定义B的resultMap时,可以让它继承自A对应的resultMap
- autoMapping:true|false 含义用法未知
SQL表列名与POJO字段之间的映射关系
- 当列名与POJO属性名一样时,MyBatis自动将列的取值设置到POJO字段上,比如
- 当列名与POJO属性名不一样时,MyBatis不会将列的取值设置到POJO字段上,所以上面的例子中返回的Student对象,studId字段为null
- 可以使用SQL的列名的as语法,将列名重命名为对应的POJO的属性名如 select stud_id as studId
- 大多数的列名和POJO的字段名通常是不一致的,而且我们会写多个
resultMap和resultType
- 在一个select配置项中,select可以包含resultMap或者resultType,用于指定返回的类型,但是二者不能同时出现
- resultMap和resultType的含义是select结果集的一行进行映射,不是说整个SQL的查询结果的类型是resultMap或者resultType类型
- sqlSession.selectOne("sqlSession.selectList表示返回多行数据
主键自动增长的方式插入数据
INSERT INTO STUDENTS(NAME, EMAIL, PHONE)VALUES(#{name},#{email},#{phone})
- useGeneratedKeys为true表示插入数据时使用MySQL自动生成主键,
- keyProperty表示这个主键值存储在哪个属性中
上面这个insert操作,传入的参数是Student类型,由于没有持久化,所以Student的studId属性是null,执行完insert语句后,作为传入参数的Student对象的studId包含了数据库自动生成的主键ID
API执行增删改查的方式
还有第三种,注解的方式,注解这种方式,实际工作中基本不会用
Mapper方式
1.定义接口StudentMapper,与配置文件中mapper的namespace一致
2.定义StudentMapper接口
StudentMapper接口的方法签名与配置文件中的
package com.mybatis3.mappers;
import java.util.List;
import com.mybatis3.domain.Student;
public interface StudentMapper {
List findAllStudents();
Student findStudentById(Integer id);
void insertStudent(Student student);
void updateStudent(Student student);
List findStudentById2();
}
注意:
- Mapper的权限定类名跟mapper的namespace属性保持一致
- 方法签名与配置文件中的
- StudentMapper的用法
public List findAllStudents() {
SqlSession sqlSession = MyBatisSqlSessionFactory.getSqlSession();
try {
StudentMapper studentMapper = sqlSession.getMapper(StudentMapper.class); //SqlSession定义了获取Mapper的方法
return studentMapper.findAllStudents();
} finally {
sqlSession.close();
}
}
SQL映射的方式
Student student = (Student)sqlSession.selectOne("com.mybatis3.mappers.StudentMapper.findStudentById",studId);
SqlSession的方法selectXXX,updateXXX,deleteXXX和insertXXX遵循这种方式,第一个参数是配置文件里namespace + id取得一个SQL操作,第二个参数是SQL语句的参数,由parameterType限定