MyBatis 延遲加載 一對多,多對一查詢

MyBatis  延遲加載   的 一對多,多對一查詢


     Mybatis 的動態語句查詢真是太優秀了,,爲程序開發減輕了不少工作。

     同樣是框架mybatis 的腰鍵盤怎麼這麼突出


準備工作:爲了測試方便搭建 JavaProject 工程

環境:    -    jdk  1.8     -   myBatis   3.2.7 

開始:

db.priperties  文件

driver=com.mysql.jdbc.Driver
url=jdbc:mysql://localhost:3306/ssh
user=root
password=root

log4j.properties  文件   (方便測試)

# Global logging configuration
#\u5728\u5f00\u53d1\u73af\u5883\u4e0b\u65e5\u5fd7\u7ea7\u522b\u8981\u8bbe\u7f6e\u6210DEBUG\uff0c\u751f\u4ea7\u73af\u5883\u8bbe\u7f6e\u6210info\u6216error
log4j.rootLogger=DEBUG, stdout
# Console output...
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern=%5p [%t] - %m%n

SqlMapConfig.xml  核心配置文件 

SqlMapConfig.xml  核心配置文件 
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configuration
PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
	<!-- 讀取外部屬性文件 -->
	<properties resource="db.properties"></properties>
	<!-- 起別名 -->
	<typeAliases>
		<!-- 單個實體類起別名
		<typeAlias type="top.vkiss.mybatis.pojo.Customer" alias="user"/>
		 -->
		<!-- 批量    包下所有類  別名爲:首字母小寫的類名 -->
		<package name="top.vkiss.mybatis.pojo"/>
	</typeAliases>
	<!-- 將來下面的配置交給spring接管 -->
	<environments default="development">
		<environment id="development">
			<!-- 配置的事務信息 -->
			<transactionManager type="JDBC" />
			<!-- 配置數據源   -->
			<dataSource type="POOLED">
				<property name="driver" value="${driver}" />
				<property name="url" value="${url}" />
				<property name="username" value="${user}" />
				<property name="password" value="${password}" />
			</dataSource>
		</environment>
	</environments>
	<!-- 加載映射文件 -->
	<mappers>
		<!-- 加載單個映射文件
			<mapper resource="top/vkiss/mybatis/dao/UserMapper.xml"/>
		 -->
		<!-- 類名加載單個映射文件  規則:映射文件與實體類名稱一致 ,且在同包中 
			<mapper class="top.vkiss.mybatis.dao.UserMapper"/>
		-->
		<!-- 批量引入映射文件  規則:映射文件名和類名一致 ,且在同包中 -->
		<package name="top.vkiss.mybatis.dao"/>
	</mappers>
</configuration>

Stu.java  兩個實體類

package top.vkiss.mybatis.pojo;
public class User {
	private int uid;
	private String uname;
	private String uaddress;
	public int getUid() {
		return uid;
	}
	public void setUid(int uid) {
		this.uid = uid;
	}
	public String getUname() {
		return uname;
	}
	public void setUname(String uname) {
		this.uname = uname;
	}
	public String getUaddress() {
		return uaddress;
	}
	public void setUaddress(String uaddress) {
		this.uaddress = uaddress;
	}
	@Override
	public String toString() {
		return "User [uid=" + uid + ", uname=" + uname + ", uaddress=" + uaddress + "]";
	}
}

Customer.java   實體類

package top.vkiss.mybatis.pojo;

import java.io.Serializable;

public class Customer implements Serializable{
	private Integer id;
	private String name;
	private String pwd;
	private String address;
	private String phone;
	public Integer getId() {
		return id;
	}
	public void setId(Integer id) {
		this.id = id;
	}
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	public String getPwd() {
		return pwd;
	}
	public void setPwd(String pwd) {
		this.pwd = pwd;
	}
	public String getAddress() {
		return address;
	}
	public void setAddress(String address) {
		this.address = address;
	}
	public String getPhone() {
		return phone;
	}
	public void setPhone(String phone) {
		this.phone = phone;
	}
	@Override
	public String toString() {
		return "Customer [id=" + id + ", name=" + name + ", pwd=" + pwd + ", address=" + address + ", phone=" + phone
				+ "]";
	}
	public Customer(Integer id, String name, String pwd, String address, String phone) {
		super();
		this.id = id;
		this.name = name;
		this.pwd = pwd;
		this.address = address;
		this.phone = phone;
	}
	public Customer() {
		super();
		// TODO Auto-generated constructor stub
	}
	
}

CAndU.java   實體類

package top.vkiss.mybatis.pojo;
public class CAndU {
	private Customer cu;
	private User user;
	public Customer getCu() {
		return cu;
	}
	public void setCu(Customer cu) {
		this.cu = cu;
	}
	public User getUser() {
		return user;
	}
	public void setUser(User user) {
		this.user = user;
	}
	@Override
	public String toString() {
		return "CAndU [cu=" + cu + ", user=" + user + "]";
	}
}

UserMapper.java   dao層接口   (MyBatis 動態接口 接口  不屑接口實現類)

package top.vkiss.mybatis.dao;
import java.util.List;
import java.util.Map;
import top.vkiss.mybatis.pojo.CAndU;
import top.vkiss.mybatis.pojo.User;
public interface UserMapper {
	public void addUser(User user);
	public int queryAllConut();
	public List<User> queryAllByMap(Map map);
	public List<User> queryAllByNameAndAddress(User uesr);
	public List<User> queryAllCAndU(CAndU cu);
	public List<CAndU> queryAllByCAndUMap(CAndU cu);
	public List<User> queryUserByEXAM(User user);
	public List<User> getUserAllByIdArray(int[] ids);
	public void updateUserByEXAM(User user);
}

UserMapper.xml   dao層接口映射文件  (所有 sql 語句 都在這)

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="top.vkiss.mybatis.dao.UserMapper">
	<!-- 添加 -->
	<insert id="addUser" parameterType="user">
		<!-- 添加之後可以獲取到主鍵  MYSQL中order:AFTER  ORACLE中:BEFORE 必須有返回值  -->
		<selectKey keyProperty="uid" order="AFTER" resultType="int">
			select LAST_INSERT_ID();
		</selectKey>
		insert into t_user (uname,uaddress) values(#{uname},#{uaddress})
	</insert>

	<!-- 查詢 -->
    <select id="queryAllByNameAndAddress" parameterType="user" resultType="user">
		select uid,uname,uaddress from t_user where uname=#{uname} and uaddress=#{uaddress}
    </select>
    
	<!-- 查詢兩張表 -->
    <select id="queryAllCAndU" parameterType="candU" resultType="user">
		select u.uid uid,u.uname uname,u.uaddress uaddress from t_user u,t_customer c where u.uname=#{user.uname} and c.name=#{cu.name}
    </select>
    
	<!-- 查詢兩張表  返回值用   resultMap -->
	<resultMap type="candU" id="CAndUMap">
		<!-- 表示的是 結果集唯一  約束   - column  :表示的 查詢結果的 列明   -property :表示的是 實體類中的屬性名 
		<id column="uid" property="id"/> --> 
		<!-- 查詢出來的普通屬性   -->
		<result column="uid" property="user.uid"/>
		<result column="uname" property="user.uname"/>
		<result column="uaddress" property="user.uaddress"/>
		<result column="cid" property="cu.id"/>
		<result column="cname" property="cu.name"/>
	</resultMap>
	
    <select id="queryAllByCAndUMap" parameterType="candU" resultMap="CAndUMap">
		select u.uid uid,u.uname uname,u.uaddress uaddress,c.id cid,c.name cname,c.address caddress,c.id cid,c.phone cphone,c.pwd cpwd from t_user u,t_customer c where u.uname='張三' and c.name='888'
    </select>
	
	<!-- 刪除 -->
	<select id="delUser" parameterType="int">
    	delete from t_user where uid=#{1}
	</select>
     
	<!-- 修改   By  EXAM   -->
	<update id="updateUserByEXAM" parameterType="user">
		update t_user
		<set>
			<include refid="userSetEXAM"></include>
		</set>
		<where>
			uid=#{uid}
		</where>
	</update> 
	
    <!-- 查詢所有 -->
    <select id="queryUser" resultType="user">
		select uid,uname,upwd from t_user
    </select>
    
    <!-- 查詢所有  By  EXAM   多條件,不唯一查詢    
    	wher標籤可以去除第一個  and
    -->
    <select id="queryUserByEXAM" parameterType="user" resultType="user">
		select uid,uname,uaddress from t_user
		<where>
			<include refid="userEXAM"></include>
		</where>
    </select>

	
	<!-- 查詢條數 -->
	<select id="queryAllConut" resultType="int">
	  select count(*) from t_user
	</select>
    <!-- 模糊查 -->
    <select id="getUserAllByLike" resultType="user">
		select id,name,pwd from t_user where name like "%"#{value}"%"
    </select>
    
    <!-- 關鍵字  in 查詢   -->
    <select id="getUserAllByIdArray" resultType="user">
		select uid,uname,uaddress from t_user
		<where>
		uid in
			<foreach collection="array" item="uid" open="(" close=")" separator=",">#{uid}</foreach>
		</where>
    </select>
    
    <!-- 代碼片段   提高重用性  id唯一        
    	使用方 法:<include refid="指向代碼片段ID"></include>   -->
	<sql id="userEXAM">
		<if test="uid!=null and uid!=''">and uid = #{uid}</if>
		<if test="uname!=null and uname!=''">and uname = #{uname}</if>
		<if test="uaddress!=null and uaddress!=''">and uaddress = #{uaddress}</if>
	</sql>
    
    <sql id="userSetEXAM">
		<if test="uid!=null and uid!=''">uid = #{uid},</if>
		<if test="uname!=null and uname!=''">uname = #{uname},</if>
		<if test="uaddress!=null and uaddress!=''">uaddress = #{uaddress},</if>
	</sql>
    
</mapper>


MyBatiesUtils.java   (方便測試,獲取SqlSessionFactory 的工具類)

package top.vkiss.mybatis.util;
import java.io.IOException;
import java.io.InputStream;
import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;

public class MyBatiesUtils {
	
	private static SqlSessionFactory sqlSessionFactory;
	
	static{
    	InputStream is=null;
		try {
			is = Resources.getResourceAsStream("SqlMapConfig.xml");
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		sqlSessionFactory=new SqlSessionFactoryBuilder().build(is);
    }
	
	public static SqlSessionFactory getFactory(){
		return sqlSessionFactory;
	}
	
}

testMybatis.java (測試類)

package top.vkiss.mybatis.test;

import java.util.List;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.junit.Test;
import top.vkiss.mybatis.dao.UserMapper;
import top.vkiss.mybatis.pojo.CAndU;
import top.vkiss.mybatis.pojo.Customer;
import top.vkiss.mybatis.pojo.User;
import top.vkiss.mybatis.util.MyBatiesUtils;

public class testMybatis {
	SqlSessionFactory sf = MyBatiesUtils.getFactory();
	
	@Test
	public void addUser() throws Exception {
		SqlSession se = sf.openSession();
		UserMapper uM = se.getMapper(UserMapper.class);
		
		User user = new User();
		user.setUname("張三");
		user.setUaddress("深圳");
		uM.addUser(user);
		
		se.commit();
	}
	@Test
	public void queryAllByNameAndAddress() throws Exception {
		SqlSession se = sf.openSession();
		UserMapper uM = se.getMapper(UserMapper.class);
		
		User user = new User();
		user.setUname("張三");
		user.setUaddress("深圳");
		List<User> list = uM.queryAllByNameAndAddress(user);
		System.out.println(list);
		se.commit();
	}
	//查詢兩張表
	@Test
	public void queryAllCAndU() throws Exception {
		SqlSession se = sf.openSession();
		UserMapper uM = se.getMapper(UserMapper.class);
		
		User user = new User();
		user.setUname("111");
		Customer customer = new Customer();
		customer.setName("111");
		CAndU cu = new CAndU();
		cu.setCu(customer);
		cu.setUser(user);
		
		List<User> list = uM.queryAllCAndU(cu);
		for (User cAndU : list) {
			
			System.out.println(cAndU);
		}
		se.commit();
	}
	//查詢兩張表   返回值用 resultMap
	@Test
	public void queryAllByCAndUMap() throws Exception {
		SqlSession se = sf.openSession();
		UserMapper uM = se.getMapper(UserMapper.class);
		
		User user = new User();
		user.setUname("張三");
		Customer customer = new Customer();
		customer.setName("888");
		CAndU cu = new CAndU();
		cu.setCu(customer);
		cu.setUser(user);
		
		List<CAndU> list = uM.queryAllByCAndUMap(cu);
		for (CAndU cAndU : list) {
			System.out.println(cAndU);
		}
		System.out.println(list);
		se.commit();
	}
	//修改  By EXAM
	@Test
	public void updateUserByEXAM() throws Exception {
		SqlSession se = sf.openSession();
		UserMapper uM = se.getMapper(UserMapper.class);
		
		User user = new User();
		user.setUid(10);
		user.setUname("李四");
		user.setUaddress("北京");
		
		uM.updateUserByEXAM(user);
		
		se.commit();
	}
	//查詢條數
	@Test
	public void queryAllConut() throws Exception {
		SqlSession se = sf.openSession();
		UserMapper uM = se.getMapper(UserMapper.class);
		
		int n = uM.queryAllConut();
		
		System.out.println(n);
		se.commit();
	}
	//查詢 By EXAM
	@Test
	public void queryUserByEXAM() throws Exception {
		SqlSession se = sf.openSession();
		UserMapper uM = se.getMapper(UserMapper.class);
		
		User user = new User();
		user.setUid(10);
		//user.setUname("123");
		//user.setUaddress("456");
		List<User> list = uM.queryUserByEXAM(user);

		System.out.println(list);
		se.commit();
	}
	//查詢 By ID  IN  Array
	@Test
	public void getUserAllByIdArray() throws Exception {
		SqlSession se = sf.openSession();
		UserMapper uM = se.getMapper(UserMapper.class);

		List<User> list = uM.getUserAllByIdArray(new int[]{1,3,45,6});
		
		System.out.println(list);
		se.commit();
	}
	
	@Test
	public  void  abc(){
		System.out.println("fafadfafwefiopujewfioeujhfkalfjoiawjefoiajoilefjilaew");
	}

}

測試類中不同方法 對應不同 測試結果,這裏不一一列出

所用  jar 包 :     (mybatis  3.2.7  所有jar ,及 連接數據庫的驅動包)asm-3.3.1.jar
cglib-2.2.2.jar
commons-logging-1.1.1.jar
javassist-3.17.1-GA.jar
log4j-1.2.17.jar
log4j-api-2.0-rc1.jar
log4j-core-2.0-rc1.jar
mybatis-3.2.7.jar
mysql-connector-java-5.1.7-bin.jar
slf4j-api-1.7.5.jar
slf4j-log4j12-1.7.5.jar

 

 

 

 

 

 

 

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章