天天看點

MyBatis關聯映射,一對一執行個體:增删改查

在現實的項目中進行資料庫模組化時,我們要遵循資料庫設計範式的要求,會對現實中的業務模型進行拆分,封裝在不同的資料表中,表與表之間存在着一對一、一對多或是多對多的對應關系。

執行個體:一個人隻有一個身份證,一個身份證隻能給一個人使用。一對一使用唯一外鍵關聯。建立項目OneToOneTest,實作一對一關系的增删改查。

1、建立兩個表tb_person和tb_card,tb_person表的card_id作為外鍵參照tb_perosn表的主鍵,一對一關系,card_id作為了唯一外籍限制。

tb_user:

MyBatis關聯映射,一對一執行個體:增删改查

tb_card:

MyBatis關聯映射,一對一執行個體:增删改查

2、建立Card類、Person類分别映射tb_card和tb_person表,這裡太簡單就是構造函數和getset,屬性對應就好了,就不放代碼了

3、映射檔案

CardMapper.xml:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org/DTD Mapper 3.0" 
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.my.dao.CardDao">
	<!-- 查詢-->
	<select id="selectCard" resultType="com.my.bean.Card" parameterType="int">
		select * from tb_card where id = #{id}
	</select>
	
	<!-- 插入 -->
	<insert id="insertCard" useGeneratedKeys="true" parameterType="com.my.bean.Card">
	<!-- 擷取剛插入的card的自動生成的主鍵id;(用來插入person表的card_id)-->
		<selectKey resultType="int" keyProperty="id" order="AFTER">
			<!-- select @@identity -->
			select last_insert_id();
		</selectKey>
		insert into tb_card(code) values(#{code})
	</insert>
	
	<!-- 删除,根據資料庫的關聯關系删除,即删除card,person也随之删除 -->
	<delete id="deleteCard">
		delete from tb_card where id=#{id}
	</delete>
	
	<!-- 修改 -->
	<update id="updateCard">
		update tb_card(code) values(#{code}) where id=#{id}
	</update>
	
</mapper>
           

PersonMapper.xml

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org/DTD Mapper 3.0" 
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.my.dao.PersonDao">
	<!-- 查詢 -->
	<select id="selectPersonById" resultMap="resultMapper"
											 parameterType="int">
		select * from tb_person where id = #{id}
	</select>
	<resultMap type="com.my.bean.Person" id="resultMapper">
		<id property="id" column="id"/>
		<result property="name" column="name"/>
		<result property="sex" column="sex"/>
		<result property="age" column="age"/>
		<!-- 一對一映射:association -->
		<association property="card" column="card_id" 
			select="com.my.mapper.CardMapper.selectCard" 
			javaType="com.my.bean.Card"/>
	</resultMap>
	<!-- <association … />表示元素映射一對一關系
		,select屬性表示使用column屬性的card_id值作為參數執行CardMapping中定義selectCardById查詢
		對應的Card資料。 -->
	<!-- 關聯表查詢,效率高 -->
	<select id="selectPersonById1" parameterType="int" resultMap="resultMapper">
		select p.id,p.name,p.age,p.sex,p.card_id,c.id,c.code 
				from tb_person p,tb_card c where p.id=#{id} and p.id=c.id
	</select>
	
	<!-- 插入 -->
	<insert id="insertPerson" parameterType="com.my.bean.Person">
		insert into tb_person (name,sex,age,card_id) values(#{name},#{sex},#{age},#{card_id})
	</insert>
	
	<!-- 修改 -->
	<update id="updatePersonById" parameterType="com.my.vo.Person">
	    update tb_person set name=#{name},sex=#{sex},age=#{age},card_id=#{card_id} where id=#{id}
	</update>
</mapper>
           

4、dao層接口

CardDao:

public interface CardDao {
	//插入
	public void insertCard(Card card);
	//删除
	public void deleteCard(int id);
	//修改
	public void updateCard(Card card);
}
           

PersonDao:

public interface PersonDao {
	public Person selectPersonById(Integer id);
	public Person selectPersonById1(Integer id);
	public void insertPerson(Person p);
	public void updatePersonById(Person p);
}

           

5、工具類

MyBatisUtil:省去了測試類的繁瑣

public class MyBatisUtil {
	private static SqlSessionFactory factory;
	public static SqlSession getSqlSession() {
	
			try {
				if(factory==null) {
					InputStream inputStream;
				inputStream = Resources.getResourceAsStream("mybatis.cfg.xml");
				factory=new SqlSessionFactoryBuilder().build(inputStream);
				}
			} catch (IOException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
			
		return factory.openSession();
	}

}
           

6、配置檔案:mybatis.cfg.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>
   <settings>
      <setting name="logImpl" value="LOG4J" />
   </settings>

    <!-- 配置mybatis運作環境 -->
    <environments default="mysql">
        <environment id="mysql">
            <!-- type="JDBC" 代表使用JDBC的送出和復原來管理事務 -->
            <transactionManager type="JDBC" />

            <!-- POOLED 表示支援JDBC資料源連接配接池 -->
            <!-- UNPOOLED 表示不支援資料源連接配接池 -->
            <!-- JNDI 表示支援外部資料源連接配接池 -->
            <dataSource type="POOLED">
                <property name="driver" value="com.mysql.jdbc.Driver" />
                <property name="url" value="jdbc:mysql://localhost:3306/db_user" />
                <property name="username" value="root" />
                <property name="password" value="123" />
            </dataSource>
        </environment>
    </environments>

    <mappers>
        <!-- 告知映射檔案方式1,一個一個的配置-->
        <mapper resource="com/my/mapper/CardMapper.xml"/>
        <mapper resource="com/my/mapper/PersonMapper.xml"/>
    </mappers>
</configuration>
           

7、測試類

public class Test {
	public static SqlSession session;
	private static PersonDao dao;
	private static CardDao cardDao;
	
	public static void main(String[] args) {
		session=MyBatisUtil.getSqlSession();
		dao=session.getMapper(PersonDao.class);
		cardDao=session.getMapper(CardDao.class);
		//查詢測試
//		Person p=dao.selectPersonById(1);
//		Person p=dao.selectPersonById1(1);
//		System.out.println(p.getName());
//		System.out.println(p.getCard().getId()+","+p.getCard().getCode());
		
		//插入測試
		Card c=new Card();
		c.setCode("321321");
		cardDao.insertCard(c);
	
		Person p=new Person();
		p.setName("jack");
		p.setAge(18);
		p.setSex("女");
		p.setCard_id(c.getId());
		dao.insertPerson(p);
		session.commit();
		
		
	}

}