0%

SpringBoot——MyBatis的配置

简单配置

1
2
3
4
5
6
7
8
#mapperXml文件的路径
mybatis.mapper-locations=classpath*:mapper/**/*.xml
#mapperXml文件对应的xxMapper.java的包名
mybatis.type-aliases-package=类型别名的包名
#指定Handler的包名
mybatis.type-handlers-package=TypeHandler扫描包名
#
mybatis.configuration.map-underscore-to-camel-case=true

Mapper的定义与扫描

  • @MapperScan配置扫描位置
  • @Mapper定义接口
  • 映射的定义——XML与注解

使用TypeHandler来解决数据库类型与实体类型不匹配

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
public class MoneyTypeHandler extends BaseTypeHandler<Money> {
@Override
public void setNonNullParameter(PreparedStatement preparedStatement, int i, Money money, JdbcType jdbcType) throws SQLException {
//插入数据时,把Money类型转换成Long,精确到分
preparedStatement.setLong(i, money.getAmountMinorLong());
}

@Override
public Money getNullableResult(ResultSet resultSet, String s) throws SQLException {
return parseMoney(resultSet.getLong(s));
}

private Money parseMoney(long value) {
return Money.of(CurrencyUnit.of("CNY"), value/100.0);
}

@Override
public Money getNullableResult(ResultSet resultSet, int i) throws SQLException {
//获取数据时,把Long转换成Money
return parseMoney(resultSet.getLong(i));
}

@Override
public Money getNullableResult(CallableStatement callableStatement, int i) throws SQLException {
return parseMoney(callableStatement.getLong(i));
}
}

需要在配置文件中添加mybatis.type-handlers-package=TypeHandler的包名

Mapper/Result

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
//标识这是一个Mapper组件
@Component
@Mapper
public interface CoffeeMapper {
@Insert("insert into t_coffee(name, price, create_time, update_time)" +
"values(#{name}, #{price}, now(), now())")
//这里的Options的useGeneratedKeys设置为true表示采用主键自增的策略
//keyProperty表示将数据库的主键id值赋给传入的参数
@Options(useGeneratedKeys = true, keyProperty = "id")
int save(Coffee coffee);

@Select("select * from t_coffee where id=#{id}")
//使用@Results注解来映射查询结果集到实体类属性
@Results({
@Result(id = true, column = "id", property = "id"),
@Result(column = "create_time", property = "createTime")
})
Coffee findById(@Param("id") Long id);
}
  • @ResultMap的用法。当这段@Results代码需要在多个方法用到时,为了提高代码复用性,我们可以为这个@Results注解设置id,然后使用@ResultMap注解来复用这段代码。
1
2
3
4
5
6
7
@Select({"select id, name, class_id from my_student"})
@Results(id="studentMap", value={
@Result(column="id", property="id", jdbcType=JdbcType.INTEGER, id=true),
@Result(column="class_id", property="classId", jdbcType=JdbcType.INTEGER)
})

Student selectById(integer id);
  • @One的用法。当我们需要通过查询到的一个字段值作为参数,去执行另外一个方法来查询关联的内容,而且两者是一对一关系时,可以使用@One注解来便捷的实现。比如当我们需要查询学生信息以及其所属班级信息时,需要以查询到的class_id为参数,来执行ClassesMapper中的selectById方法,从而获得学生所属的班级信息。可以使用如下代码。
1
2
3
4
5
6
7
@Select({"select id, name, class_id from my_student"})
@Results(id="studentMap", value={
@Result(column="id", property="id", jdbcType=JdbcType.INTEGER, id=true),
@Result(column="class_id", property="myClass", javaType=MyClass.class,
one=@One(select="com.example.demo.mapper.MyClassMapper.selectById"))
})
List<Student> selectAllAndClassMsg();
  • @Many的用法。与@One类似,只不过如果使用@One查询到的结果是多行,会抛出TooManyResultException异常,这种时候应该使用的是@Many注解,实现一对多的查询。比如在需要查询学生信息和每次考试的成绩信息时。
1
2
3
4
5
6
7
8
@Select({"select id, name, class_id from my_student"})
@Results(id="studentMap", value={
@Result(column="id", property="id", jdbcType=JdbcType.INTEGER, id=true),
@Result(column="class_id", property="classId", jdbcType=JdbcType.INTEGER),
@Result(column="id", property="gradeList", javaType=List.class,
many=@Many(select="com.example.demo.mapper.GradeMapper.selectByStudentId"))
})
List<Student> selectAllAndGrade();
  • 传递多个参数进行One和Many的加载。首先我们给这张表增加age(年龄)和gender(性别)两个参数。当我们需要根据age和gender查询学生的午餐,这时需要改写column属性的格式。等号左侧的age和gender对应java接口的参数,右侧的对应数据库字段名。即将查到的my_student表中age和gender字段的值,分别赋给getLunchByAgeAndGender方法中的age和gender参数,去查询对应的name(午餐名)。
1
2
3
4
5
6
7
8
9
10
11
@Select("select id, name, age, gender from my_student")
@Results({
@Result(column="id", property="id", jdbcType=JdbcType.INTEGER, id=true),
@Result(column="class_id", property="classId", jdbcType=JdbcType.INTEGER),
//调用getLunchByAgeAndGender并把查询出的age和gender传进去,把查询的字符串加载到lunch上
@Result(column="{age=age,gender=gender}", property="lunch", one=@One(select="com.example.demo.mapper.StudentMapper.getLunchByAgeAndGender")),
})
List<Student> selectAllAndLunch();

@Select("select name from lunch where student_age = #{age} and student_gender = #{gender}")
String getLunchByAgeAndGender(@Param("age") int age, @Param("gender") int gender);

配置MyBatisGenerator

-------------本文结束感谢您的阅读-------------