更新时间:2018年09月21日17时27分 来源:传智播客 浏览次数:
1.0 之前在亚博下注体育 Boot中整合MyBatis时,采用了注解的配置方式,相信很多人还是比较喜欢这种优雅的方式的,也遇到不少问题,主要集中于针对各种场景下注解如何使用,下面就对几种常见的情况举例说明用法。
1.1 在做下面的示例之前,先准备一个整合好MyBatis的工程,可参见:使用亚博下注体育boot整合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 = new HashMap<>(); 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 | public interface UserMapper { @Select ( "SELECT * FROM user WHERE name = #{name}" ) User findByName( @Param ( "name" ) String name); @Insert ( "INSERT INTO user(name, age) VALUES(#{name}, #{age})" ) int insert( @Param ( "name" ) String name, @Param ( "age" ) Integer age); @Update ( "UPDATE user SET age=#{age} WHERE name=#{name}" ) void update(User user); @Delete ( "DELETE FROM user WHERE id =#{id}" ) void delete(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/getter public class Address { private Long id; private String province; private String city; } public class Car { private Long id; private String color; private String name; //用户id private Long userId; } public class User { private Long id; //地址信息,和用户是一对一的关系 private Address address; //地址id private Long addressId; //用户拥有的车,和用户是一对多的关系 private List<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 | CREATE TABLE IF NOT EXISTS ` user ` ( `id` int (11) NOT NULL AUTO_INCREMENT, `nick_name` varchar (50) DEFAULT NULL , `address_id` int (11) DEFAULT NULL , PRIMARY KEY (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8; CREATE TABLE IF NOT EXISTS `address` ( `id` int (11) NOT NULL AUTO_INCREMENT, `province` varchar (50) DEFAULT NULL , `city` varchar (50) DEFAULT NULL , PRIMARY KEY (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8; CREATE TABLE IF NOT EXISTS `car` ( `id` int (11) NOT NULL AUTO_INCREMENT, `color` varchar (50) DEFAULT NULL , ` name ` varchar (50) DEFAULT NULL , `user_id` int (11) DEFAULT NULL , PRIMARY KEY (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8; INSERT INTO ` user ` VALUES ( '1' , 'baby' , '1' ), ( '2' , 'kingboy' , '2' ), ( '3' , 'boy' , '3' ), ( '4' , 'kingbaby' , '4' ); INSERT INTO `address` VALUES ( '1' , '北京' , '北京' ), ( '2' , '天津' , '天津' ), ( '3' , '安徽' , '宿州' ), ( '4' , '广东' , '广州' ); INSERT INTO `car` VALUES ( '1' , 'green' , '路虎' , '1' ), ( '2' , 'white' , '奔驰' , '2' ), ( '3' , 'blue' , '玛莎拉蒂' , '4' ), ( '4' , 'yellow' , '兰博基尼' , '4' ); |
1 2 3 4 5 6 7 | public interface AddressRepository { /** * 根据地址id查询地址 */ @Select ( "SELECT * FROM `address` WHERE id = #{id}" ) Address findAddressById(Long id); } |
1 2 3 4 | public interface UserRepository { @Select ( "SELECT * FROM `user` where id = #{id}" ) User findUserWithAddress(Long id); } |
1 2 3 4 5 6 7 8 | public interface UserRepository { @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 | public interface CarRepository { /** * 根据用户id查询所有的车 */ @Select ( "SELECT * FROM `car` WHERE user_id = #{userId}" ) List<Car> findCarByUserId(Long userId); } |
1 2 3 4 | public interface UserRepository { @Select ( "SELECT * FROM `user` where id = #{id}" ) User findUserWithAddress(Long id); } |
01 02 03 04 05 06 07 08 09 10 11 | public interface UserRepository { /** * 查询带有车信息的用户===============演示一对多(关于多对多其实就是两个一对多组成) */ @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); } |