1. 程式人生 > >Mybatis——傳入POJO對象,動態SQL,多表關系

Mybatis——傳入POJO對象,動態SQL,多表關系

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,多表關系