Mybatis——傳入POJO對象,動態SQL,多表關系
阿新 • • 發佈:2018-03-10
this h標簽 根據 strong src 實現 圖片 tis his
傳入POJO對象
QueryVo.java
public class QueryVo implements Serializable{ private User user; public User getUser() { return user; } public void setUser(User user) { this.user = user; } }
SQL映射文件
<!-- 傳入POJO對象,查詢用戶 --> <select id="findUserByPOJO" parameterType="QueryVo" resultType="User"> select * from user where id = #{user.id} </select>
測試類
@Test public void func9() throws IOException { // 1.加載配置文件 InputStream in = Resources.getResourceAsStream("sqlMapConfig.xml"); // 2.創建sqlSessionFactory SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(in); // 3.獲取sqlsession SqlSession sqlSession = sqlSessionFactory.openSession(); // ------------------------------------------- // 4.SqlSEssion幫我生成一個實現類(給接口的字節碼文件) UserDao mapper = sqlSession.getMapper(UserDao.class); // 創建一個POJO對象 QueryVo vo = new QueryVo(); User u = new User(); u.setId(2); vo.setUser(u); User userByPOJO = mapper.findUserByPOJO(vo); System.out.println(userByPOJO); // ------------------------------------------- }
resultMap(手動指定字段)
數據庫表
Order實體文件
public class Order { // 訂單id private int id; // 用戶id private Integer userId; // 訂單號 private String number; // 訂單創建時間 private Date createtime; // 備註 private String note; get/set。。。 }
SQL映射文件
由於實體和SQL中的userid字段不同,所以要使用resultMap
<resultMap id="jzy" type="Order"> <result column="user_id" property="userId" /> </resultMap> <select id="findOrderById" parameterType="int" resultMap="jzy"> select * from `order` where id = #{id} -- order是關鍵字,所以要用``包起來 </select>
OrderDao.java
public interface OrderDao { Order findOrderById(int i); }
測試類
public void func() throws IOException { // 1.加載配置文件 InputStream in = Resources.getResourceAsStream("sqlMapConfig.xml"); // 2.創建sqlSessionFactory SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(in); // 3.獲取sqlsession SqlSession sqlSession = sqlSessionFactory.openSession(); // ------------------------------------------- // 4.執行相應的SQL語句 OrderDao mapper = sqlSession.getMapper(OrderDao.class); Order orderById = mapper.findOrderById(1); System.out.println(orderById); // ------------------------------------------- }
一.動態SQL
1)if標簽&&where標簽
<!-- 根據性別和名字查詢用戶 where 可以去掉第一個前ANd --> <select id="selectUserBySexAndUsername" parameterType="User" resultType="User"> <where> <if test="sex != null and sex != ‘‘"> and sex = #{sex} </if> <if test="username != null and username != ‘‘"> and username = #{username} </if> </where> </select>
2)foreach標簽
a.直接傳入數組
UserDao.java
public interface UserDao { List<User> selectUserByIds(int[] ids); }
配置文件
<!-- 多個ID select * from user where id in (1,2,3)--> <select id="selectUserByIds" parameterType="int[]" resultType="User"> <include refid="selector"/> <where> <!--只要是傳入的數組,collection就是"array"--> <foreach collection="array" item="id" separator="," open="id in (" close=")"> #{id} </foreach> </where> </select>
測試類
@Test public void func3() throws IOException { // 1.加載配置文件 InputStream in = Resources.getResourceAsStream("sqlMapConfig.xml"); // 2.創建sqlSessionFactory SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(in); // 3.獲取sqlsession SqlSession sqlSession = sqlSessionFactory.openSession(); // ------------------------------------------- // 方法一:直接傳入一個數組 int[] ids = {1,2,3}; UserDao mapper = sqlSession.getMapper(UserDao.class); List<User> list = mapper.selectUserByIds(ids); System.out.println(list); // ------------------------------------------- }
b.直接傳入集合
<!-- 多個ID select * from user where id in (1,2,3)--> <select id="selectUserByIds" parameterType="Integer" resultType="User"> <include refid="selector"/> <where> <!--只要是傳入的集合,collection就是"list"--> <foreach collection="list" item="id" separator="," open="id in (" close=")"> #{id} </foreach> </where> </select>
測試類
// 方法二:直接傳入一個集合 List<Integer> ids = new ArrayList<>(); ids.add(1); ids.add(2); ids.add(3); UserDao mapper = sqlSession.getMapper(UserDao.class); List<User> list = mapper.selectUserByIds(ids); System.out.println(list);
c.傳入一個POJO,裏面有集合或者數組
<!-- 多個ID select * from user where id in (1,2,3)--> <select id="selectUserByIds" parameterType="QueryVo" resultType="User"> <include refid="selector"/> <where> <foreach collection="ids" item="id" separator="," open="id in (" close=")"> #{id} </foreach> </where> </select>
測試類
// 方法三:傳入一個POJO //List<Integer> ids = new ArrayList<>(); // //ids.add(1); //ids.add(2); //ids.add(3); int[] ids = {1,2,3}; QueryVo vo = new QueryVo(); vo.setIds(ids); UserDao mapper = sqlSession.getMapper(UserDao.class); List<User> list = mapper.selectUserByIds(vo); System.out.println(list);
二.關聯查詢
1、一對一查詢
1)在Order中添加一個user字段並提供get,set方法
2)書寫接口
List<Order> findOrderList();
3)書寫配置文件
<resultMap id="jbb" type="Order"> <id column="id" property="id"/> <result column="user_id" property="userId" /> <result column="number" property="number" /> <!-- 一對一配置 --> <association property="user" javaType="User"> <id column="user_id" property="id" /> <result column="username" property="username"/> </association> </resultMap> <select id="findOrderList" resultMap="jbb"> select o.id,o.user_id,o.number,o.createtime,u.username from `order` o left join user u on o.user_id=u.id </select>
4)測試類
public void func4() throws IOException { // 1.加載配置文件 InputStream in = Resources.getResourceAsStream("sqlMapConfig.xml"); // 2.創建sqlSessionFactory SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(in); // 3.獲取sqlsession SqlSession sqlSession = sqlSessionFactory.openSession(); // ------------------------------------------- OrderDao mapper = sqlSession.getMapper(OrderDao.class); List<Order> orderList = mapper.findOrderList(); System.out.println(orderList); // ------------------------------------------- }
2、一對多查詢
1)在User中添加一個集合,保存Order對象
2)書寫接口
List<User> findUserAllOrder();
3)SQL映射文件
<resultMap id="jjj" type="User"> <id column="user_id" property="id"/> <result column="username" property="username"/> <!-- 一對多 --> <collection property="orderList" ofType="Order"> <id column="id" property="id"/> <result column="number" property="number"/> <result column="createtime" property="createtime"/> <result column="user_id" property="userId"/> </collection> </resultMap> <select id="findUserAllOrder" resultMap="jjj"> select o.id,o.user_id,o.number,o.createtime,u.username from user u left join `order` o on o.user_id=u.id </select>
測試類
@Test public void func5() throws IOException { // 1.加載配置文件 InputStream in = Resources.getResourceAsStream("sqlMapConfig.xml"); // 2.創建sqlSessionFactory SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(in); // 3.獲取sqlsession SqlSession sqlSession = sqlSessionFactory.openSession(); // ------------------------------------------- OrderDao mapper = sqlSession.getMapper(OrderDao.class); List<User> userAllOrderList = mapper.findUserAllOrder(); System.out.println(userAllOrderList); // ------------------------------------------- }
Mybatis——傳入POJO對象,動態SQL,多表關系