Mybatis注解开发
注解开发只需要写mapper接口即可,无需再书写对应的xxMapper.xml映射文件
对于单表操作还是比较方便的,但对多表操作就维护起来就比较麻烦了
数据库准备
添加依赖
<!--lombok--><dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId><version>1.18.12</version><scope>provided</scope></dependency><!-- mybatis --><dependency><groupId>org.mybatis</groupId><artifactId>mybatis</artifactId><version>3.5.6</version></dependency><!-- mysql驱动 --><dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId><version>5.1.16</version></dependency><!-- 测试用例 --><dependency><groupId>junit</groupId><artifactId>junit</artifactId><version>4.12</version></dependency><!-- 日志 --><dependency><groupId>org.slf4j</groupId><artifactId>slf4j-log4j12</artifactId><version>1.6.4</version></dependency>
核心配置文件
mybatis-config.xml
<?xml version="1.0" encoding="UTF-8" ?><!DOCTYPE configurationPUBLIC "-////DTD Config 3.0//EN""/dtd/mybatis-3-config.dtd"><configuration><!-- 引入外部的配置文件 --><properties resource="jdbc.properties"/><!-- 开启驼峰匹配 --><settings><setting name="mapUnderscoreToCamelCase" value="true"/></settings><!-- 连接数据库相关的配置 后面不用写,spring代替--><environments default="development"><environment id="development"><transactionManager type="JDBC"/><dataSource type="POOLED"><property name="driver" value="${driverClass}"/><property name="url" value="${url}"/><property name="username" value="${jdbc.username}"/><property name="password" value="${jdbc.password}"/></dataSource></environment></environments><mappers><package name="cn.yanqi.mapper"/></mappers></configuration>
jdbc.properties
driverClass=com.mysql.jdbc.Driverurl=jdbc:mysql:///mybatisjdbc.username=rootjdbc.password=root
单表操作
实体类
@Datapublic class User {private Long id;// 用户名private String userName;// 密码private String password;// 姓名private String name;// 年龄private Integer age;// 性别,1男性,2女性private Integer sex;// 出生日期private Date birthday;// 创建时间private Date created;// 更新时间private Date updated;}
Mapper接口
/*** @Auther: yanqi* @Date:* @Dese:*/public interface UserMapper {@Select("select * from tb_user where id = #{id}")User findById(int id);@Select("select * from tb_user")List<User> selectAll();@Insert("INSERT INTO tb_user(id, user_name, password, name, age, sex, birthday, created, updated) VALUES (null,#{userName},#{password},#{name},#{age},#{sex},#{birthday},#{created},#{updated})")void adduser(User user);@Delete("delete from tb_user where id = #{id}")void delete(int id);@Update("update tb_user set user_name =#{userName} , updated = #{updated} where id =#{id}")void updateuser(User user);}
测试
/*** @Auther: yanqi* @Date:* @Dese:*/public class UserMapperTest {private UserMapper userMapper;private SqlSession sqlSession ;private SqlSessionFactory sqlSessionFactory ;@Beforepublic void setUp() throws Exception {String resource = "mybatis-config.xml";InputStream inputStream = Resources.getResourceAsStream(resource);sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);sqlSession = sqlSessionFactory.openSession();userMapper = sqlSession.getMapper(UserMapper.class);}/*** 查询单个*/@Testpublic void select() {User user = this.userMapper.findById(1);System.out.println(user);}/*** 查询所有*/@Testpublic void selectAll() {List<User> users = this.userMapper.selectAll();for(User user : users){System.out.println(user);}}/*** 添加*/@Testpublic void adduser() {User user = new User();user.setUserName("小江江");user.setPassword("123");user.setName("一燕");user.setAge(27);user.setSex(2);user.setBirthday(new Date());user.setCreated(new Date());user.setUpdated(new Date());this.userMapper.adduser(user);mit();}/*** 删除*/@Testpublic void delete() {this.userMapper.delete(114);mit();}/*** 修改*/@Testpublic void updateuser() {User user = new User();user.setId(118L);user.setUserName("哈哈2");user.setUpdated(new Date());this.userMapper.updateuser(user);mit();}}
一对一
实体类
/*** 订单表*/@Datapublic class Order {private Integer id;private Long userId;private String orderNumber;private User user;}
Mapper接口
/*** @Auther: yanqi* @Dese: OrderMapper接口 实现一对一*/public interface OrderMapper {/*** 查询订单,并且查询出下单人的信息* @param* @return*/@Select("select * from tb_order where order_number = #{orderNum}")@Results({/*映射usercolumn: order表中user_id外键,传递给UserMapper.findById的idproperty: order实体类中的user字段*/@Result(column = "id",property ="user",javaType = User.class,one = @One(select = "cn.yanqi.mapper.UserMapper.findById"))})List<Order> oneToOne(String orderNum);}
public interface UserMapper {@Select("select * from tb_user where id = #{id}")User findById(int id);}
测试
/*** @Auther: yanqi* @Date:* @Dese:*/public class UserMapperTest {private UserMapper userMapper;private OrderMapper orderMapper;private SqlSession sqlSession ;private SqlSessionFactory sqlSessionFactory ;@Beforepublic void setUp() throws Exception {String resource = "mybatis-config.xml";InputStream inputStream = Resources.getResourceAsStream(resource);sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);sqlSession = sqlSessionFactory.openSession();userMapper = sqlSession.getMapper(UserMapper.class);orderMapper = sqlSession.getMapper(OrderMapper.class);}/*** 测试一对一*/@Testpublic void oneToOne(){List<Order> orders = this.orderMapper.oneToOne("002");for(Order order : orders){System.out.println(order);}}
一对多
实体类
/*** 订单表* */@Datapublic class Order {private Integer id;private Long userId;private String orderNumber;private User user;private List<Orderdetail> orderdetails;}
@Datapublic class Orderdetail {private Integer id;private Double totalPrice;private Integer status;}
Mapper接口
/*** @Auther: yanqi* @Date:* @Dese:*/public interface OrderMapper {/*** 查询订单,查询出下单人信息并且查询出订单详情。*/@Select("select * from tb_order where order_number = #{orderNum}")@Results({/*映射user*/@Result(column = "id",property ="user",javaType = User.class,one = @One(select = "cn.yanqi.mapper.UserMapper.findById")),/*映射orderdetails*/@Result(column = "id",property = "orderdetails",javaType =List.class,many = @Many(select = "cn.yanqi.mapper.OrderDetailMapper.findById"))})List<Order> oneToMany(String orderNum);}
/*** @Auther: yanqi*/public interface OrderDetailMapper {/*** 根据id查询订单详情* @param id*/@Select("select * from tb_orderdetail where id = #{id}")Orderdetail findById(int id);}
测试
/*** @Auther: yanqi* @Date:* @Dese:*/public class UserMapperTest {private UserMapper userMapper;private OrderMapper orderMapper;private SqlSession sqlSession ;private SqlSessionFactory sqlSessionFactory ;@Beforepublic void setUp() throws Exception {String resource = "mybatis-config.xml";InputStream inputStream = Resources.getResourceAsStream(resource);sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);sqlSession = sqlSessionFactory.openSession();userMapper = sqlSession.getMapper(UserMapper.class);orderMapper = sqlSession.getMapper(OrderMapper.class);}/*** 测试一对多*/@Testpublic void oneToMany(){List<Order> orders = this.orderMapper.oneToMany("002");for(Order order : orders){System.out.println(order);}
多对多
实体类
/*** 订单详情*/@Datapublic class Orderdetail {private Integer id;private Double totalPrice;private Integer status;//商品信息private Item item;}
/*** 商品表*/@Datapublic class Item {private Integer id;private String itemName;private Float itemPrice;private String itemDetail;}
Mapper接口
public interface OrderMapper {/*** 查询订单,查询出下单人信息并且查询出订单详情中的商品数据。*/@Select("select * from tb_order where order_number = #{orderNum}")@Results({/*映射user*/@Result(column = "id",property ="user",javaType = User.class,one = @One(select = "cn.yanqi.mapper.UserMapper.findById")),/*映射orderdetails*/@Result(column = "id",property = "orderdetails",javaType =List.class,//查询Item商品many = @Many(select = "cn.yanqi.mapper.ItemMapper.findById"))})List<Order> manyToMany(String orderNum);}
public interface ItemMapper {@Select("select * from tb_item where id = #{id}")List<Item> findById(Integer id);}
测试
/*** 测试多对多*/@Testpublic void manyToMany() {List<Order> orders = this.orderMapper.manyToMany("002");for (Order order : orders) {System.out.println(order);}}