Mybatis多表插入操作

起始表数据:

CREATE TABLE person(
    id INT PRIMARY KEY AUTO_INCREMENT ,
    NAME VARCHAR(20)
)ENGINE	=INNODB DEFAULT CHARSET=utf8;


CREATE TABLE card(
    id INT PRIMARY KEY AUTO_INCREMENT ,
    info VARCHAR(20),
    pid INT unique,
    CONSTRAINT fk_pid FOREIGN KEY(pid)  REFERENCES person(id)
)ENGINE	=INNODB DEFAULT CHARSET=utf8;

INSERT INTO person VALUES(NULL,'jack'),(NULL,'tom');
INSERT INTO card VALUES(NULL,'南京身份证',1),(NULL,'苏州身份证',2);
if table course is exist drop else
CREATE TABLE course(
	id INT PRIMARY KEY AUTO_INCREMENT,
	NAME VARCHAR(20)
)ENGINE=INNODB DEFAULT CHARSET=utf8;

CREATE TABLE  person_course(
	pid INT,
	cid INT,
	CONSTRAINT fk_pid FOREIGN KEY(pid) REFERENCES person(id),
	CONSTRAINT fk_cid FOREIGN KEY(cid) REFERENCES course(id)
)ENGINE=INNODB DEFAULT CHARSET=utf8;

INSERT INTO Course VALUES(NULL,'语文'),(NULL,'数学');
INSERT INTO person_course VALUES(1,1),(1,2);

数据:

实体类:

/**
 * N:1 / 1:1 写类型
 * 1:N / M:N 写集合
 */
@Data
@NoArgsConstructor
@AllArgsConstructor
public class Card {
    private Integer id ;
    private String info ;
    //One2One   *2One  都写类类型  *Many 都写集合
    private Person person  ;
}
@Data
@NoArgsConstructor
@AllArgsConstructor
public class Course {
    private Integer id ;
    private String name ;
    //Many2Many
    private List<Person> personList ;
}
@Data
@NoArgsConstructor
@AllArgsConstructor
public class Person {
    private Integer id ;
    private String name ;
    //One2One
    private Card card ;
    //Many2Many
    private List<Course> courseList;
}

 dao层接口:

public interface EmpDAO {

    boolean insertEmp(Emp emp);

    List<Emp> selectByDeptId(Integer id);
}
public interface CardDAO {
    boolean insert(Card card) ;
}
public interface PersonDAO {
    /**
     * 新增 人:  1. 新增person 表数据 2. 新增 card表数据  3. 批量新增person_course
     * @param person
     * @return
     */
    boolean insert(Person person) ;

    boolean insertBatch(Person person) ;
}

mappering.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="org.wanho.dao.PersonDAO">
    <insert id="insert" useGeneratedKeys="true" keyProperty="id" keyColumn="id">
        insert into person(id,name) values (#{id},#{name})
    </insert>

    <insert id="insertBatch">
        insert into person_course values
        <foreach collection="courseList" item="course" separator=",">
            (#{id},#{course.id})
        </foreach>
    </insert>
</mapper>
<?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="org.wanho.dao.CardDAO">

    <insert id="insert">
        insert into card (id,info,pid) values (null,#{id},#{person.id})
    </insert>
</mapper>

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>
    <properties resource="jdbc.properties"/>
    <settings>
        <setting name="logImpl" value="STDOUT_LOGGING"/>
    </settings>
    <typeAliases>
        <package name="org.wanho.entity"/>
    </typeAliases>
    <environments default="development">
        <environment id="development">
            <transactionManager type="jdbc"></transactionManager>
            <dataSource type="POOLED">
                <property name="driver" value="${jdbc.driver}"/>
                <property name="url"
                          value="${jdbc.url}"/>
                <property name="username" value="${jdbc.username}"/>
                <property name="password" value="${jdbc.password}"/>
            </dataSource>
        </environment>
    </environments>
    <mappers>
<!--        <package name="org/wanho/dao"/>-->
        <mapper resource="mapper/EmpDAO.xml"/>
        <mapper resource="mapper/CardDAO.xml"/>
        <mapper resource="mapper/PersonDAO.xml"/>
    </mappers>
</configuration>

 测试类:

测试类BaseTest:

public abstract class BaseDAOTest {
    protected SqlSession sqlSession ;
    @Before
    public void before(){
        sqlSession = MybatisUtil.getSession();
    }

    @After
    public void after(){
        sqlSession.commit();
        sqlSession.close();
    }
}

测试: 

public class PersonDAOTest extends  BaseDAOTest{
    @Test
    public void insert(){
        //对象关联
        //先创建插入的朱对象
        Person person = new Person();
        person.setName("Jack");
        Card card = new Card();
        card.setInfo("XXX中国绿卡");
        person.setCard(card);
        card.setPerson(person);
        List<Course> list = Arrays.asList(new Course(1,null,null),new Course(2,null,null));
        person.setCourseList(list);

        //调用多个dao方法 类似于(Service)
        PersonDAO personDAO = sqlSession.getMapper(PersonDAO.class);
        CardDAO cardDAO = sqlSession.getMapper(CardDAO.class);

        personDAO.insert(person);
        cardDAO.insert(person.getCard());
        personDAO.insertBatch(person);

    }
}

 

  • 3
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,您想了解如何使用MyBatis新增两个字段,一个是数组,一个是单个参数。首先,您需要在MyBatis的mapper文件中编写插入语句,语句中需要包含这两个字段。例如: ```xml <insert id="insertData" parameterType="com.example.Data"> INSERT INTO data (name, age, hobbies) VALUES (#{name}, #{age}, #{hobbies}) </insert> ``` 在这个例子中,插入语句中包含三个字段:name、age和hobbies。其中,name和age是单个参数,可以直接使用#{}来引用。而hobbies是一个数组,需要使用MyBatis提供的foreach标签来循环插入。例如: ```xml <insert id="insertData" parameterType="com.example.Data"> INSERT INTO data (name, age, hobbies) VALUES (#{name}, #{age}, <foreach collection="hobbies" item="hobby" separator=","> #{hobby} </foreach> ) </insert> ``` 在这个例子中,我们使用了foreach标签来循环插入hobbies数组中的每个元素。其中,collection属性指定了要循环的数组,item属性指定了循环中的变量名,separator属性指定了每个元素之间的分隔符。 在Java代码中,您可以创建一个Data对象来传递参数。例如: ```java Data data = new Data(); data.setName("John"); data.setAge(30); data.setHobbies(new String[] {"reading", "swimming", "travelling"}); dataMapper.insertData(data); ``` 在这个例子中,我们创建了一个Data对象,并设置了name、age和hobbies属性。然后,我们调用dataMapper的insertData方法来插入数据。MyBatis会自动将Data对象中的属性映射到插入语句中的对应位置。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值