简单配置
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 { 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 { 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
| @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") int save(Coffee coffee);
@Select("select * from t_coffee where id=#{id}") @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), @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