在测试类中使用单元测试的生命周期注解对mybatis测试进行初始化以及关闭资源
//junit会在每一个@Test方法前执行一个@Before方法
@Before
public void init() throws IOException {
session= new
SqlSessionFactoryBuilder().build(Resources.getResourceAsStream("mybatis-config.xml")).openSession();
}
//junit会在每一个@Test方法后执行一个@After方法
@After
public void clear(){
session.commit();
session.close();
}
1、返回单个简单类型数据
①Mapper接口中的抽象方法
int selectCount();
②SQL语句
③junit测试
@Test
public void testSelectCount(){
EmployeeMapper sessionMapper = session.getMapper(EmployeeMapper.class);
Integer count = sessionMapper.selectCount();
System.out.println(count);
}
2、返回实体类对象
①Mapper接口的抽象方法
Employee selectEmployee(Integer empId);
②SQL语句
- 编写具体的SQL语句,使用id属性唯一的标记一条SQL语句
- resultType属性:指定封装查询结果的Java实体类的全类名
- Mybatis负责把SQL语句中的#{}部分替换成“?”占位符
- 给每一个字段设置一个别名,让别名和Java实体类中属性名一致
③增加全局配置自动识别对应关系
做了下面的配置,select语句中可以不给字段设置别名
- 从org.apache.ibatis.session.Configuration类中可以查看能使用的配置项
- 将mapUnderscoreToCamelCase属性配置为true,表示开启自动映射驼峰式命名规则
- 规则要求数据库表字段命名方式:单词_单词
- 规则要求Java实体类属性名命名方式:首字母小写的驼峰式命名
适用于SQL查询返回的各个字段综合起来并不和任何一个现有的实体类对应,没法封装到实体类对象中。能够封装成实体类类型的,就不使用Map类型。
①Mapper接口的抽象方法
MapselectEmpNameAndMaxSalary();
②SQL语句
③junit测试
@Test
public void test9(){
EmployeeMapper mapper = session.getMapper(EmployeeMapper.class);
Map map = mapper.selectEmpNameAndMaxSalary();
for (Map.Entry entry : map.entrySet()) {
String key = entry.getKey();
Object value = entry.getValue();
System.out.println(key + ":" + value);
}
}
结果:查询成功
查询结果返回多个实体类对象,希望把多个实体类对象放在List集合中返回。此时不需要任何特殊处理,在resultType属性中还是设置实体类类型即可。
①Mapper接口中抽象方法
ListselectAll();
②SQL语句
③junit测试
@Test
public void testSelectForList(){
EmployeeMapper sessionMapper = session.getMapper(EmployeeMapper.class);
List list = sessionMapper.selectAll();
System.out.println(list);
}
5、返回自增主键
①使用场景
例如:保存订单信息。需要保存Order对象和List。其中,OrderItem对应的数据库表,包含一个外键,指向Order对应表的主键。
在保存List的时候,需要使用下面的SQL:
insert into t_order_item(item_name,item_price,item_count,order_id) values(...)
这里需要用到的order_id,是在保存Order对象时,数据库表以自增方式产生的,需要特殊办法拿到这个自增的主键值。至于,为什么不能通过查询最大主键的方式解决这个问题,参考下图:
②在Mapper配置文件中设置方式
[1]Mapper接口中的抽象方法
int insertWithKey(Employee employee);
[2]SQL语句
insert into t_emp(emp_name,emp_salary) values(#{empName},#{empSalary})
- useGeneratedKeys属性字面意思就是“使用生成的主键”
- keyProperty属性可以指定主键在实体类对象中对应的属性名,Mybatis会将拿到的主键值存入这个属性
[3]单元测试
@Test
public void testGetGeneratedKey(){
EmployeeMapper sessionMapper = session.getMapper(EmployeeMapper.class);
Employee employee = new Employee(null, "bob", 123.9);
int rowCount = sessionMapper.insertWithKey(employee);
System.out.println("受影响行数="+rowCount);
System.out.println(employee);
}
③注意
Mybatis是将自增主键的值设置到实体类对象中,而不是以Mapper接口方法返回值的形式返回。
①别名
将字段的别名设置成和实体类属性一致。
关于实体类属性的约定:
getXxx()方法、setXxx()方法把方法名中的get或set去掉,首字母小写。
②全局配置自动识别驼峰式命名规则
在Mybatis全局配置文件加入如下配置:
SQL语句中可以不使用别名
③使用resultMap
使用resultMap标签定义对应关系,再在后面的SQL语句中引用这个对应关系



