天天看点

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();
		
		
	}

}