Mybatis一对一对多多对多

Posted 大华1100

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Mybatis一对一对多多对多相关的知识,希望对你有一定的参考价值。

1、什么是MyBatis?

  MyBatis 本是apache的一个开源项目iBatis, 2010年这个项目由apache software foundation 迁移到了google code,并且改名为MyBatis 。2013年11月迁移到Github。

  iBATIS一词来源于“internet”和“abatis”的组合,是一个基于Java的持久层框架。iBATIS提供的持久层框架包括SQL Maps和Data Access Objects(DAO)。

  MyBatis 是支持普通 SQL查询,存储过程和高级映射的优秀持久层框架。MyBatis 消除了几乎所有的JDBC代码和参数的手工设置以及结果集的检索。MyBatis 使用简单的 XML或注解用于配置和原始映射,将接口和 Java 的POJOs(Plain Ordinary Java Objects,普通的 Java对象)映射成数据库中的记录。

PS:本文所有代码下载链接:http://pan.baidu.com/s/1gf8CPQN 密码:t2x9 

2、MyBatis 入门实例基于xml配置

  ①、创建MySQL数据库:mybatisDemo和表:person

1
2
3
create database mybatisDemo;
use mybatisDemo;
create table person(pid int primary key AUTO_INCREMENT, pname varchar(50), page int);

  

 

  ②、建立一个Java工程,并导入相应的jar包

   

  相应的 jar 包下载链接:http://pan.baidu.com/s/1skZM09Z  密码:nkt6

  

   ③、在 MyBatisDemo 工程中添加数据库配置文件 mybatis-configuration.xml

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
<?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>
<!-- 可以配置多个运行环境,但是每个 SqlSessionFactory 实例只能选择一个运行环境  
  一、development:开发模式
   二、work:工作模式-->
 <environments default="development">
 <!--id属性必须和上面的default一样  -->
    <environment id="development">
    <!--事务管理器
        一、JDBC:这个配置直接简单使用了 JDBC 的提交和回滚设置。它依赖于从数据源得到的连接来管理事务范围
        二、MANAGED:这个配置几乎没做什么。它从来不提交或回滚一个连接。而它会让容器来管理事务的整个生命周期
            比如 spring 或 JEE 应用服务器的上下文,默认情况下,它会关闭连接。然而一些容器并不希望这样,
            因此如果你需要从连接中停止它,就可以将 closeConnection 属性设置为 false,比如:
            <transactionManager type="MANAGED">
                <property name="closeConnection" value="false"/>
            </transactionManager>
      -->
      <transactionManager type="JDBC"/>
      <!--dataSource 元素使用标准的 JDBC 数据源接口来配置 JDBC 连接对象源  -->
      <dataSource type="POOLED">
        <property name="driver" value="com.mysql.jdbc.Driver"/>
        <property name="url" value="jdbc:mysql://localhost:3306/mybatisdemo"/>
        <property name="username" value="root"/>
        <property name="password" value="root"/>
      </dataSource>
    </environment>
  </environments>
</configuration>

  

  ④、定义表所对应的实体类

  

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
package com.ys.bean;
 
public class Person {
    private int pid;
    private String pname;
    private int page;
     
    public int getPid() {
        return pid;
    }
    public void setPid(int pid) {
        this.pid = pid;
    }
    public String getPname() {
        return pname;
    }
    public void setPname(String pname) {
        this.pname = pname;
    }
    public int getPage() {
        return page;
    }
    public void setPage(int page) {
        this.page = page;
    }
    @Override
    public String toString() {
        return "Person [pid=" + pid + ", pname=" + pname + ", page=" + page
                "]";
    }
}

  

  ⑤、定义操作 person 表的sql映射文件personMapper.xml

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
<?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.ys.bean.personMapper">
  <!-- 根据 pid 查询 person 表中的数据
       id:唯一标识符,此文件中的id值不能重复
       resultType:返回值类型,一条数据库记录也就对应实体类的一个对象
       parameterType:参数类型,也就是查询条件的类型
   -->
  <select id="selectPersonById"
            resultType="com.ys.bean.Person" parameterType="int">
    <!-- 这里和普通的sql 查询语句差不多,对于只有一个查询条件后面的 #{pid}表示占位符,里面不一定要写pid,写啥都可以,但是不要空着;如果有多个查询条件,则要写pojo类里面的属性 -->
    select * from person where pid = #{pid}
  </select>
   
  <!-- 查询person 表所有数据 -->
  <select id="getAllPerson" resultType="com.ys.bean.Person">
    select * from person
  </select>
   
  <!-- 根据id更新数据 -->
  <update id="updatePersonById" parameterType="com.ys.bean.Person">
    update person set pname=#{pname},page=#{page} where pid = #{pid}
  </update>
   
  <!-- 向 person 表插入一条数据 -->
  <insert id="addPerson" parameterType="com.ys.bean.Person">
    insert into person(pid,pname,page) values(#{pid},#{pname},#{page})
  </insert>
   
  <!-- 根据 pid 删除数据 -->
  <delete id="deletePersonById" parameterType="Long">
    delete from person where pid=#{pid}
  </delete>
   
</mapper>

  

  ⑥、向 mybatis-configuration.xml 配置文件中注册 personMapper.xml 文件

1
2
3
4
5
<mappers>
       <!-- 注册personMapper.xml文件,
       personMapper.xml位于com.ys.bean这个包下,所以resource写成com/ys/bean/personMapper.xml-->
       <mapper resource="com/ys/bean/personMapper.xml"/>
</mappers>

  如下图所示:

 

   ⑦、创建测试类

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
package com.ys.test;
 
import java.io.InputStream;
import java.util.List;
 
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
import org.junit.Before;
import org.junit.Test;
 
import com.ys.bean.Person;
 
public class MyBatisTest {
    SqlSession session;
     
    @Before
    public void beforeLoadXML(){
        //加载 mybatis 配置文件
        InputStream inputStream = MyBatisTest.class.
                getClassLoader().getResourceAsStream("mybatis-configuration.xml");
        //构建sqlSession的工厂
        SqlSessionFactory sqlSessionFactory =
                new SqlSessionFactoryBuilder().build(inputStream);
        //根据 sqlSessionFactory 产生 session
        session = sqlSessionFactory.openSession();
    }
     
    //根据 pid 查询 person 表中的数据
    @Test
    public void testSelectById(){
        //这个字符串有 personMapper.xml 文件中 两个部分构成
        //<mapper namespace="com.ys.bean.personMapper"> 的 namespace 的值
        //<select id="selectPersonById" > id 值
        String statement = "com.ys.bean.personMapper"+".selectPersonById";
        Person p = session.selectOne(statement, 1);
        System.out.println(p);
        session.close();
    }
     
    //查询person 表所有数据
    @Test
    public void testGetAllPerson(){
        String statement = "com.ys.bean.personMapper.getAllPerson";
        List<Person> listPerson = session.selectList(statement);
        System.out.println(listPerson);
        session.close();
    }
     
    //根据id更新数据
    @Test
    public void updateById(){
        String statement = "com.ys.bean.personMapper.updatePersonById";
        Person p = new Person();
        p.setPid(1);
        p.setPname("aaa");
        p.setPage(11);
        session.update(statement, p);
        session.commit();
        session.close();
    }
     
    //向 person 表插入一条数据
    @Test
    public void addPerson(){
        String statement = "com.ys.bean.personMapper.addPerson";
        Person p = new Person();
        //由于我们设置了主键的自增长机制,故这里不需要手动设置 pid 的值
        //p.setPid(1);
        p.setPname("add");
        p.setPage(11);
        session.insert(statement, p);
        session.commit();
        session.close();
    }
     
    //根据 pid 删除person 表中的数据
    @Test
    public void deletePersonById(){
        String statement = "com.ys.bean.personMapper.deletePersonById";
        session.delete(statement, 1);
        session.commit();
        session.close();
         
    }
     
 
}

  

 

3、MyBatis 入门实例注解配置

   ①、上面的前面四步都是一样的,但是第五步不一样,我们不需要创建 personMapper.xml 文件,首先在 src 目录下创建 personMapper.java 文件

  

   内容如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
package com.ys.annocation;
 
import org.apache.ibatis.annotations.Delete;
import org.apache.ibatis.annotations.Insert;
import org.apache.ibatis.annotations.Select;
import org.apache.ibatis.annotations.Update;
 
import com.ys.bean.Person;
 
public interface PersonMapper {
     
    @Insert("insert into person(pid,pname,page) values(#{pid},#{pname},#{page})")
    public int add(Person person);
     
    @Select("select * from person where pid = #{pid}")
    public Person getPerson(int pid);
     
    @Update("update person set pname=#{pname},page=#{page} where pid = #{pid}")
    public int updatePerson(Person preson);
     
    @Delete("delete from person where pid=#{pid}")
    public int deletePerson(int pid);
 
}

  ②、向 mybatis-configuration.xml 配置文件中注册 personMapper.xml 文件

 

   ③、编写测试类

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
@Test
public void testAnnocation(){
    PersonMapper mapper = session.getMapper(PersonMapper.class);
    Person p = new Person();
    p.setPid(7);
    p.setPname("abc");
    p.setPage(11);
    //调用增加方法
    mapper.add(p);
    //调用查询方法
    Person p1 = mapper.getPerson(3);
    System.out.println(p1);
    //调用更新方法
    p.setPage(100);
    mapper.updatePerson(p);
    //调用删除方法
    mapper.deletePerson(7);
    session.commit();
    session.close();
}

 

4、MyBatis 入门实例  一对一  基于xml配置

  这里我们以老师和班级为例,假设一般班级只能拥有有一个老师,一个老师只能带一个班级。

  ①、创建实体类

  

 

  Teacher.java

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32

(c)2006-2024 SYSTEM All Rights Reserved IT常识