首先的 是 最原始的 pojo 類來 做簡單映射
簡單 pojo 映射:

<mapper namespace="com.ghc.dao.UserDao"> <select id="findUserById" parameterType="int" resultType="user"> SELECT * FROM user WHERE id = #{id} </select>
以下都是對於原始基本的 pojo 類 進行包裝擴展后來實現 其他列的映射
一對一:

<resultMap id="findUserOrderMapper" type="com.ghc.pojo.UserOrderWrapperFirst"> <!--因為繼承自Order類,所以這些都可以看做是Order這個對象的基本屬性--> <id column="id" property="id"/> <result column="user_id" property="user_id"/> <result column="number" property="number"/> <result column="createtime" property="createtime"/> <result column="note" property="note"/> <!--配置映射關聯的用戶信息--> <!-- association: 用於映射關聯查詢單個對象的信息--> <!----> <association property="user" javaType="com.ghc.pojo.User"> <!--此處本可以寫成user 但是為了突出就不用別名了 下面都是封裝 wrapper 包裝類的user對象到一個User的bean中--> <id column="user_id" property="id"/> <!--唯一標識用戶的列就是主外鍵列 user_id 是 Order 的基本屬性--> <result column="username" property="userName"/> <result column="birthday" property="birthday"/> <result column="sex" property="sex"/> <result column="address" property="address"/> </association> </resultMap> <select id="findUserOrder" resultMap="findUserOrderMapper"> select o.*,u.* from user u join orders o on u.id = o.user_id </select>
一對多:

<resultMap id="findOneToManyMap" type="com.ghc.pojo.UserOrderWrapper"> <id property="id" column="id"/> <result column="user_id" property="user_id"/> <result column="number" property="number"/> <result column="createtime" property="createtime"/> <result column="note" property="note"/> <association property="user" javaType="user"> <id column="user_id" property="id"/> <result column="username" property="userName"/> <result column="sex" property="sex"/> <result column="address" property="address"/> </association> <collection property="orderDetails" ofType="com.ghc.pojo.OrderDetail"> <id column="odtid" property="id"/> <result column="items_id" property="itemsId"/> <result column="items_num" property="itemsNum"/> <result column="orders_id" property="ordersId"/> </collection> </resultMap> <select id="findOneToMany" resultMap="findOneToManyMap"> select o.*, u.username, u.sex, u.address, odt.id as odtid, odt.items_id, odt.items_num, odt.orders_id from user u join orders o on u.id = o.user_id join orderdetail odt on o.id = odt.orders_id </select>
多對多:
關鍵還是在於 mapper.xml 文件的書寫

<resultMap id="findManyToManyMap" type="user"> <!--主表 user 表--> <id column="user_id" property="id"/> <result column="username" property="userName"/> <result column="sex" property="sex"/> <result column="address" property="address"/> <!--從表 order 表映射到 orderList--> <collection property="orderList" ofType="com.ghc.pojo.Orders"> <id column="id" property="id"/> <result column="user_id" property="user_id"/> <result column="number" property="number"/> <result column="createtime" property="createtime"/> <result column="note" property="note"/> <!--從表 orderDetail 表映射到 orderDetailList--> <collection property="orderDetailList" ofType="com.ghc.pojo.OrderDetail"> <id column="odtid" property="id"/> <result column="items_id" property="itemsId"/> <result column="items_num" property="itemsNum"/> <result column="orders_id" property="ordersId"/> <!-- 而 orderDetail 這張表的 itemid 外鍵只對應 items 表中一條數據,所以此處用association--> <association property="item" javaType="com.ghc.pojo.Items"> <id column="item_id" property="id"/> <result column="name" property="name"/> <result column="price" property="price"/> <result column="detail" property="detail"/> <result column="pic" property="pic"/> <result column="createtime" property="createtime"/> </association> </collection> </collection> </resultMap> <select id="findManyToMany" resultMap="findManyToManyMap"> select o.id, o.user_id, o.number, o.createtime, o.note, u.username, u.sex, u.address, odt.id as odtid, odt.items_id, odt.items_num, odt.orders_id, i.id as item_id, i.name, i.price, i.detail, i.pic, i.createtime from user u join orders o on u.id = o.user_id join orderdetail odt on o.id = odt.orders_id join items i on odt.items_id = i.id </select>
上面配置文件都寫完后,就可以進行 mapper 接口 mapper.java 的編寫了
順便貼上 相應的 pojo (User 里 包含一個 List<Orders> 然后 Orders 里又包含一個 List<OrderDetail> 最后 OrderDetail 里包含一個 Item ) 修改后的樣子:
也就是 數據庫的 主從表之間的外鍵關系,
User ------> Order (1:n)
Order -----> OrderDetail (1:n)
OrderDetail ----> Item (1:1)
下面開始 貼 多對多的 pojo 部分的 代碼了 (我覺得 多對多都會了 其他的都不在話下,所以其他的沒必要貼了):

package com.ghc.pojo; import java.util.Date; import java.util.List; public class User { private int id; private String userName; private Date birthday; private String sex; private String address; // 一個人有多個訂單 private List<Orders> orderList; public List<Orders> getOrderList() { return orderList; } public void setOrderList(List<Orders> orderList) { this.orderList = orderList; } public int getId() { return id; } public void setId(int id) { this.id = id; } public String getUserName() { return userName; } public void setUserName(String userName) { this.userName = userName; } public Date getBirthday() { return birthday; } public void setBirthday(Date birthday) { this.birthday = birthday; } public String getSex() { return sex; } public void setSex(String sex) { this.sex = sex; } public String getAddress() { return address; } public void setAddress(String address) { this.address = address; } }

package com.ghc.pojo; import java.util.Date; import java.util.List; public class Orders { private int id; private int user_id; private String number; private Date createtime; private String note; public List<OrderDetail> getOrderDetailList() { return orderDetailList; } public void setOrderDetailList(List<OrderDetail> orderDetailList) { this.orderDetailList = orderDetailList; } // 一個訂單可以有多個訂單明細 private List<OrderDetail> orderDetailList; public int getId() { return id; } public void setId(int id) { this.id = id; } public int getUser_id() { return user_id; } public void setUser_id(int user_id) { this.user_id = user_id; } public String getNumber() { return number; } public void setNumber(String number) { this.number = number; } public Date getCreatetime() { return createtime; } public void setCreatetime(Date createtime) { this.createtime = createtime; } public String getNote() { return note; } public void setNote(String note) { this.note = note; } }

package com.ghc.pojo; public class OrderDetail { private int id; private int ordersId; private int itemsId; private int itemsNum; //而一個訂單明細對應一條項目 private Items item; public Items getItem() { return item; } public void setItem(Items item) { this.item = item; } public int getId() { return id; } public void setId(int id) { this.id = id; } public int getOrdersId() { return ordersId; } public void setOrdersId(int ordersId) { this.ordersId = ordersId; } public int getItemsId() { return itemsId; } public void setItemsId(int itemsId) { this.itemsId = itemsId; } public int getItemsNum() { return itemsNum; } public void setItemsNum(int itemsNum) { this.itemsNum = itemsNum; } }

package com.ghc.pojo; import java.util.Date; public class Items { private int id; private String name; private float price; private String detail; private String pic; private Date createtime; public int getId() { return id; } public void setId(int id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } public float getPrice() { return price; } public void setPrice(float price) { this.price = price; } public String getDetail() { return detail; } public void setDetail(String detail) { this.detail = detail; } public String getPic() { return pic; } public void setPic(String pic) { this.pic = pic; } public Date getCreatetime() { return createtime; } public void setCreatetime(Date createtime) { this.createtime = createtime; } }

package com.ghc.dao; import com.ghc.pojo.User; import com.ghc.pojo.UserOrderWrapper; import com.ghc.pojo.UserOrderWrapperFirst; import java.util.List; public interface UserDao { User findUserById(int id) throws Exception; List<UserOrderWrapperFirst> findUserOrder() throws Exception; List<UserOrderWrapper> findOneToMany() throws Exception; List<User> findManyToMany() throws Exception; }
如果經常要打印輸出,建議在 pojo 中 覆寫 toString,不然就要跟下面這么苦逼的 拼 String 打印了

import com.ghc.dao.UserDao; import com.ghc.pojo.*; import org.apache.ibatis.io.Resources; import org.apache.ibatis.session.SqlSession; import org.apache.ibatis.session.SqlSessionFactory; import org.apache.ibatis.session.SqlSessionFactoryBuilder; import org.junit.Before; import org.junit.Test; import java.io.IOException; import java.util.List; public class UserDaoTest { private SqlSessionFactory sqlSessionFactory; @Before public void injectSqlSessionFactory() throws IOException { sqlSessionFactory = new SqlSessionFactoryBuilder().build(Resources.getResourceAsStream("config/SqlMappingConfig.xml")); } @Test public void testFindUserById() throws Exception { UserDao userDao = sqlSessionFactory.openSession().getMapper(UserDao.class); User user = userDao.findUserById(1); System.out.println(user.getUserName()); List<UserOrderWrapperFirst> userOrderWrapperFirstList = userDao.findUserOrder(); for (UserOrderWrapperFirst userOrder : userOrderWrapperFirstList) { String userName = userOrder.getUser().getUserName(); int orderId = userOrder.getId(); System.out.println(userName + " <-----> " + String.valueOf(orderId)); } } @Test public void testFindOneToMany() throws Exception { SqlSession sqlSession = sqlSessionFactory.openSession(); UserDao userDao = sqlSession.getMapper(UserDao.class); List<UserOrderWrapper> userOrderWrappers = userDao.findOneToMany(); for (int i = 0; i < userOrderWrappers.size(); i++) { UserOrderWrapper uow = userOrderWrappers.get(i); List<OrderDetail> orderDetails = uow.getOrderDetails(); User user = uow.getUser(); for (int j = 0; j < orderDetails.size(); j++) { System.out.print(uow.getId() + "--" + uow.getUser_id() + "--" + uow.getNumber() + "--" + uow.getCreatetime() + "--" + uow.getNote() + "--"); System.out.print(user.getUserName() + "--" + user.getSex() + "--" + user.getAddress() + "--"); OrderDetail odt = orderDetails.get(j); System.out.println(odt.getId() + "--" + odt.getItemsId() + "--" + odt.getItemsNum() + "--" + odt.getOrdersId()); } } } @Test public void testFindManyToMany() throws Exception { SqlSession sqlSession = sqlSessionFactory.openSession(); UserDao userDao = sqlSession.getMapper(UserDao.class); List<User> userList = userDao.findManyToMany(); for (User user : userList) { List<Orders> orderList = user.getOrderList(); for (Orders order : orderList) { List<OrderDetail> orderDetailList = order.getOrderDetailList(); for (OrderDetail orderDetail : orderDetailList) { Items item = orderDetail.getItem(); System.out.println(order.getId() + "--" + order.getUser_id() + "--" + order.getNumber() + "--" + order.getCreatetime() + "--" + order.getNote() +"--" + user.getUserName() + "--" + user.getSex() + "--" + user.getAddress() + "--" + orderDetail.getId() + "--" + orderDetail.getItemsId() + "--" + orderDetail.getItemsNum() + "--" + orderDetail.getOrdersId() + "--" + item.getId() + "--" + item.getName() + "--" + item.getName() + "--" + item.getPrice() + "--" + item.getDetail() + "--" + item.getPic() + "--" + item.getCreatetime()); } } } } }
測試結果 與數據庫基本一致 :
至此, mybatis 的 所謂高級部分全部完成(動態 sql 部分另開一篇去說好了),實際項目開發的時候,單表是采用 generator 逆向工程生成 pojo,mapper.xml , mapper.java 的
但是也需要配置數據庫連接,表信息等等。。。到一個 generatorconfig.xml 這樣類似的 一個 配置文件里,然后調用生成工具的代碼進行生成。
但是懂了原理,任他怎么來都容易理解了。