在现实的项目中进行数据库建模时,我们要遵循数据库设计范式的要求,会对现实中的业务模型进行拆分,封装在不同的数据表中,表与表之间存在着一对一、一对多或是多对多的对应关系。
实例:一个人只有一个身份证,一个身份证只能给一个人使用。一对一使用唯一外键关联。创建项目OneToOneTest,实现一对一关系的增删改查。
1、创建两个表tb_person和tb_card,tb_person表的card_id作为外键参照tb_perosn表的主键,一对一关系,card_id作为了唯一外籍约束。
tb_user:
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();
}
}