1.创建SQL脚本:
CREATE TABLE t_person( id int(3) not null auto_increment, name varchar(20) default null, age int(3) default 0, primary key (id) ) charset="gb2312"; CREATE TABLE t_passport( id int(3), serial varchar(20) default NULL, expiry int(3) default NULL, PRIMARY KEY (id), CONSTRAINT fk_passport FOREIGN KEY (id) REFERENCES t_person(id) )charset="gb2312";
-- t_passport主键Id 参照 外键 t_person下的Id
2.创建实体类(POJO):
Person.java
package com.lixing.ibatis.entity.onetoone; import java.io.Serializable; public class Person implements Serializable{ private static final long serialVersionUID = 4524251837950555570L; private int id; private String name; private int age; private Passport passport; //Person指向Passport的引用 public int getId() { return id; } public void setId( int id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } public int getAge() { return age; } public void setAge( int age) { this.age = age; } public Passport getPassport() { return passport; } public void setPassport(Passport passport) { this.passport = passport; } }
Passport.java
package com.lixing.ibatis.entity.onetoone; public class Passport { private int id; private String serial; private int expiry; private Person person; //Passport指向Person的引用 public int getId() { return id; } public void setId( int id) { this.id = id; } public String getSerial() { return serial; } public void setSerial(String serial) { this.serial = serial; } public int getExpiry() { return expiry; } public void setExpiry( int expiry) { this.expiry = expiry; } public Person getPerson() { return person; } public void setPerson(Person person) { this.person = person; } }
3.创建Mapper接口:
PersonMapper.java
package com.lixing.ibatis.onetoone.mapper; import com.lixing.ibatis.entity.onetoone.Person; public interface PersonMapper {
void insertPerson(Person person); Person getPerson( int id); }
PassportMapper.java
package com.lixing.ibatis.onetoone.mapper; import com.lixing.ibatis.entity.onetoone.Passport; public interface PassportMapper { void insertPassport(Passport passport); Passport getPassport( int id); }
4.创建Mapper映射XML文件:
PersonMapper.xml
<? 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 ="com.lixing.ibatis.onetoone.mapper.PersonMapper" > < parameterMap type ="Person" id ="parameterPersonMap" > < parameter property ="id" /> < parameter property ="name" /> < parameter property ="age" /> </ parameterMap > < insert id ="insertPerson" parameterMap ="parameterPersonMap" > < selectKey keyProperty ="id" resultType ="int" order ="AFTER" > SELECT LAST_INSERT_ID() AS ID </ selectKey > INSERT INTO t_person(name,age) VALUES(#{name},#{age}) </ insert > < resultMap type ="Person" id ="personMap" > < result property ="id" column ="id" /> < result property ="name" column ="name" /> < result property ="age" column ="age" /> <association property="passport" column="id" javaType="Passport" select="com.lixing.ibatis.onetoone.mapper.PassportMapper.getPassport"> </association>
<!-- property:指Person中指向Passport对象的实例名称 -->
<!--select:指执行级联查询--> </ resultMap > < select id ="getPerson" resultMap ="personMap" parameterType ="int" > SELECT * FROM t_person WHERE id=#{id} </ select > </ mapper >
PassportMapper.xml
<? 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 ="com.lixing.ibatis.onetoone.mapper.PassportMapper" > < parameterMap type ="Passport" id ="passportMap" > < parameter property ="id" /> < parameter property ="serial" /> < parameter property ="expiry" /> </ parameterMap > < insert id ="insertPassport" parameterMap ="passportMap" > INSERT INTO t_passport(id,serial,expiry) VALUES(?,?,?) </ insert > < resultMap type ="Passport" id ="passportMap" > < result property ="id" column ="id" /> < result property ="serial" column ="serial" /> < result property ="expiry" column ="expiry" /> <association property="person" column="id" select="com.lixing.ibatis.onetoone.mapper.PersonMapper.getPerson"> </association> </ resultMap > < select id ="getPassport" resultMap ="passportMap" parameterType ="int" > SELECT * FROM t_passport WHERE id=#{id} </ select > </ mapper >
5.创建测试类:
package com.lixing.ibatis.test; import java.sql.SQLException; import org.apache.ibatis.session.SqlSession; import org.apache.ibatis.session.SqlSessionFactory; import org.apache.ibatis.transaction.Transaction; import org.apache.ibatis.transaction.TransactionFactory; import org.apache.ibatis.transaction.jdbc.JdbcTransactionFactory; import org.junit.After; import org.junit.Before; import org.junit.Ignore; import org.junit.Test; import com.lixing.ibatis.entity.onetoone.Passport; import com.lixing.ibatis.entity.onetoone.Person; import com.lixing.ibatis.onetoone.mapper.PassportMapper; import com.lixing.ibatis.onetoone.mapper.PersonMapper; import com.lixing.ibatis.util.MyBatisUtil; public class PassportMapperTest { private SqlSessionFactory sqlSessionFactory = null; private SqlSession session = null; @Before public void before() { sqlSessionFactory = MyBatisUtil.getInstance(); session = sqlSessionFactory.openSession(); } @Test public void testInsertPerson() throws SQLException { Person person = new Person(); person.setName( "李新2"); person.setAge(25); Passport passport = new Passport(); passport.setSerial( "Serial2"); passport.setExpiry(22222); TransactionFactory transactionFactory = new JdbcTransactionFactory(); Transaction tx = transactionFactory.newTransaction(session .getConnection(), false); PersonMapper personMapper = session.getMapper(PersonMapper. class); PassportMapper passportMapper = session.getMapper(PassportMapper. class); try{ personMapper.insertPerson(person); passport.setId(person.getId()); passportMapper.insertPassport(passport); tx.commit(); } catch(Exception e){ tx.rollback(); e.printStackTrace(); } finally{ tx.close(); System.out.println(person.getId()); } } @Test public void testGetPerson(){ PersonMapper personMapper=session.getMapper(PersonMapper. class); Person person=personMapper.getPerson(2); Passport passport=person.getPassport(); System.out.println(person.getId()+ "\t"+person.getName()+ "\t"+person.getAge()+ "\t"+passport.getSerial()+ "\t"+passport.getExpiry()); session.commit(); } @Test public void testGetPassport(){ PassportMapper passportMapper=session.getMapper(PassportMapper. class); Passport passport=passportMapper.getPassport(2); Person person=passport.getPerson(); System.out.println(passport.getId()+ "\t"+passport.getExpiry()+ "\t"+person.getName()); } @After public void after() { session.close(); } }
6.Mybatis配置文件:
mybatis-config.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 > <!-- changes from the defaults for testing --> < setting name ="cacheEnabled" value ="false" /> < setting name ="useGeneratedKeys" value ="true" /> < setting name ="defaultExecutorType" value ="REUSE" /> </ settings > < typeAliases > <!-- --> < typeAlias alias ="Passport" type ="com.lixing.ibatis.entity.onetoone.Passport" /> < typeAlias alias ="Person" type ="com.lixing.ibatis.entity.onetoone.Person" /> </ typeAliases > < environments default ="development" > < environment id ="development" > < transactionManager type ="JDBC" /> < dataSource type ="POOLED" > < property name ="driver" value ="com.mysql.jdbc.Driver" /> < property name ="url" value ="jdbc:mysql://localhost:3306/test" /> < property name ="username" value ="root" /> < property name ="password" value ="7501857" /> </ dataSource > </ environment > </ environments > < mappers > <!-- --> < mapper resource ="com/lixing/ibatis/onetoone/mapper/PassportMapper.xml" /> < mapper resource ="com/lixing/ibatis/onetoone/mapper/PersonMapper.xml" /> </ mappers > </ configuration >