zoukankan      html  css  js  c++  java
  • Mybatis 一对一(OneToOne)关系映射__INSERT

    今天测试Ibatis的一对一的关联映射时总是出现错误,其中很多的错误都是自己不小心写错的..现把整个Ibatis源代码记录下来,以便以后熟记:
    1.数据库脚本:
    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
     
     
    2.创建实体类(Pojo) :Person
    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;
        
      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;
      }
    }
     
     
    Passport
    package com.lixing.ibatis.entity.onetoone;

    public class Passport {
      private int id;
      private String serial;
      private int expiry;
        
      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;
      }    
    }
     
    3.创建Mapper接口:(PersonMapper)
    package com.lixing.ibatis.onetoone.mapper;

    import com.lixing.ibatis.entity.onetoone.Person;

    public interface PersonMapper {
      void insertPerson(Person person);
    }
     
    PasssportMapper
    package com.lixing.ibatis.onetoone.mapper;

    import com.lixing.ibatis.entity.onetoone.Passport;

    public interface PassportMapper {
      void insertPassport(Passport passport);
    }
     
    4.在PersonMapper、PassportMapper接口目录下创建两个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>    
    </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>                
    </mapper>
     
    5.myibatis配置文件(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>
     
     
    6.加入Junit做测试:
    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.JdbcTransaction;
    import org.apache.ibatis.transaction.jdbc.JdbcTransactionFactory;
    import org.junit.After;
    import org.junit.Before;
    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.setId(person.getId());    //写在此处是错误的
        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());  //必须写在insertPerson之后
          passportMapper.insertPassport(passport);
          tx.commit();
        }catch(Exception e){
          tx.rollback();
          e.printStackTrace();
        }finally{
          tx.close();
          System.out.println(person.getId());
        }
      } 


      @After
      public void after() {
        // session.close();
      }
    }
     
    整个项目打包上传(不包括mybatis类库)
  • 相关阅读:
    jenkins更换国内源
    部署jdk和maven
    Prometheus监控Nginx
    Prometheus监控MySQL
    MySql里动态视图的实现
    MySql里split函数的实现
    HTML编码规范
    消弱反驳18招
    Pr2020
    记忆准则
  • 原文地址:https://www.cnblogs.com/duanxz/p/3844987.html
Copyright © 2011-2022 走看看