在現實的項目中進行資料庫模組化時,我們要遵循資料庫設計範式的要求,會對現實中的業務模型進行拆分,封裝在不同的資料表中,表與表之間存在着一對一、一對多或是多對多的對應關系。
執行個體:一個人隻有一個身份證,一個身份證隻能給一個人使用。一對一使用唯一外鍵關聯。建立項目OneToOneTest,實作一對一關系的增删改查。
1、建立兩個表tb_person和tb_card,tb_person表的card_id作為外鍵參照tb_perosn表的主鍵,一對一關系,card_id作為了唯一外籍限制。
tb_user:
tb_card:
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();
}
}