更新时间:2018年09月21日17时27分 来源:传智播客 浏览次数:
1.0 之前在Spring Boot中整合MyBatis时,采用了注解的配置方式,相信很多人还是比较喜欢这种优雅的方式的,也遇到不少问题,主要集中于针对各种场景下注解如何使用,下面就对几种常见的情况举例说明用法。
1.1 在做下面的示例之前,先准备一个整合好MyBatis的工程,可参见:使用Springboot整合mybatis
2.0 传参方式
下面通过几种不同传参方式来实现前文中实现的插入操作。
2.1使用@Param
使用这种最简单的传参方式,如下:
| 1 2 | @Insert("insert into book (bookname) values #{bookname}")    Integer insertBook(@Param("bookname") String bookname); | 
这种方式很好理解,@Param 中定义的 bookname 对应了SQL中的 #{bookname}。
2.2 使用Map
| 1 2 | @Insert("insert into book (bookname) values #{bookname, jdbcType =VARCHAR}")    Integer insertBookByMap(Map<String,Object> map ); | 
对于Insert语句中需要的参数,我们只需要在map中填入同名的内容即可,具体如下面代码所示:
| 1 2 3 | Map<String, Object> map = newHashMap<>();       map.put("bookname", "CCC");       bookDaoMapper.insertBookByMap(map); | 
2.3 使用对象
除了Map对象,我们也可直接使用普通的Java对象来作为查询条件的传参,比如我们可以直接使用Book对象:
| 1 2 | @Insert("insert into book (bookname) values #{bookname}")    Integer insertBookByPo(Book book); | 
3.0 增删改查
3.1 MyBatis针对不同的数据库操作分别提供了不同的注解来进行配置,在之前的示例中演示了@Insert,下面针对User表做一组最基本的增删改查作为示例:
| 01 02 03 04 05 06 07 08 09 10 11 12 13 14 | publicinterfaceUserMapper {        @Select("SELECT * FROM user WHERE name = #{name}")        User findByName(@Param("name") String name);        @Insert("INSERT INTO user(name, age) VALUES(#{name}, #{age})")        intinsert(@Param("name") String name, @Param("age") Integer age);        @Update("UPDATE user SET age=#{age} WHERE name=#{name}")        voidupdate(User user);        @Delete("DELETE FROM user WHERE id =#{id}")        voiddelete(Long id);    } | 
在完成了一套增删改查后,单元测试来验证上面操作的正确性:省略。。。
3.2 返回结果的绑定
| 1 2 3 4 5 6 | @Results({    @Result(property = "name", column = "name"),    @Result(property = "age", column = "age")})@Select("SELECT name, age FROM user")List<User> findAll(); | 
| 1 2 3 4 5 | |-- user    |-- address    |-- carList        |-- car1        |-- car2 | 
| 01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 | //省略setter/getterpublicclassAddress {    privateLong id;    privateString province;    privateString city;}publicclassCar {    privateLong id;    privateString color;    privateString name;    //用户id    privateLong userId;}publicclassUser {    privateLong id;    //地址信息,和用户是一对一的关系    privateAddress address;    //地址id    privateLong addressId;    //用户拥有的车,和用户是一对多的关系    privateList<Car> cars;} | 
| 01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 | CREATETABLEIF NOTEXISTS `user` (  `id` int(11) NOTNULLAUTO_INCREMENT,  `nick_name` varchar(50) DEFAULTNULL,  `address_id` int(11) DEFAULTNULL,  PRIMARYKEY(`id`)) ENGINE=InnoDB DEFAULTCHARSET=utf8;CREATETABLEIF NOTEXISTS `address` (  `id` int(11) NOTNULLAUTO_INCREMENT,  `province` varchar(50) DEFAULTNULL,  `city` varchar(50) DEFAULTNULL,  PRIMARYKEY(`id`)) ENGINE=InnoDB DEFAULTCHARSET=utf8;CREATETABLEIF NOTEXISTS `car` (  `id` int(11) NOTNULLAUTO_INCREMENT,  `color` varchar(50) DEFAULTNULL,  `name` varchar(50) DEFAULTNULL,  `user_id` int(11) DEFAULTNULL,  PRIMARYKEY(`id`)) ENGINE=InnoDB DEFAULTCHARSET=utf8;INSERTINTO    `user`VALUES    ('1', 'baby', '1'),    ('2', 'kingboy', '2'),    ('3', 'boy', '3'),    ('4', 'kingbaby', '4');INSERTINTO    `address`VALUES    ('1', '北京', '北京'),    ('2', '天津', '天津'),    ('3', '安徽', '宿州'),    ('4', '广东', '广州');INSERTINTO    `car`VALUES    ('1', 'green', '路虎', '1'),    ('2', 'white', '奔驰', '2'),    ('3', 'blue', '玛莎拉蒂', '4'),    ('4', 'yellow', '兰博基尼', '4'); | 
| 1 2 3 4 5 6 7 | publicinterfaceAddressRepository {    /**     * 根据地址id查询地址     */    @Select("SELECT * FROM `address` WHERE id = #{id}")    Address findAddressById(Long id);} | 
| 1 2 3 4 | publicinterfaceUserRepository {    @Select("SELECT * FROM `user` where id = #{id}")    User findUserWithAddress(Long id);} | 
| 1 2 3 4 5 6 7 8 | publicinterfaceUserRepository {    @Select("SELECT * FROM `user` where id = #{id}")    @Results({            @Result(property = "address", column = "address_id",                    one = @One(select = "com.kingboy.repository.address.AddressRepository.findAddressById"))    })    User findUserWithAddress(Long id);} | 
| 1 2 3 4 5 6 7 | publicinterfaceCarRepository {    /**     * 根据用户id查询所有的车     */    @Select("SELECT * FROM `car` WHERE user_id = #{userId}")    List<Car> findCarByUserId(Long userId);} | 
| 1 2 3 4 | publicinterfaceUserRepository {    @Select("SELECT * FROM `user` where id = #{id}")    User findUserWithAddress(Long id);} | 
| 01 02 03 04 05 06 07 08 09 10 11 | publicinterfaceUserRepository {    /**     * 查询带有车信息的用户===============演示一对多(关于多对多其实就是两个一对多组成)     */    @Select("SELECT * FROM `user` WHERE id = #{id}")    @Results({            @Result(property = "cars", column = "id",                    many = @Many(select = "com.kingboy.repository.car.CarRepository.findCarByUserId"))    })    User getUserWithCar(Long id);} |