Java MyBatis

1、MyBatis的基本使用

step:

  1. 数据准备

数据库表
在这里插入图片描述
实体类

public class Student {
    private Integer id;
    private String name;
    private Integer age;

    public Student() {
    }

    public Student(Integer id, String name, Integer age) {
        this.id = id;
        this.name = name;
        this.age = age;
    }

    public Integer getId() {
        return id;
    }

    public void setId(Integer id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public Integer getAge() {
        return age;
    }

    public void setAge(Integer age) {
        this.age = age;
    }

    @Override
    public String toString() {
        return "Student{" +
                "id=" + id +
                ", name='" + name + '\'' +
                ", age=" + age +
                '}';
    }
}
  1. 导入mybatis的相关jar包

  导入数据库驱动jar包和mybatisjar包
在这里插入图片描述
  右键选择Add as Library…添加到引用类库中就可以使用了

在这里插入图片描述

  1. 在resources目录下创建映射配置文件
<?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="StudentMapper">
    <select id="selectAll" resultType="com.zyk.Student">
        select * FROM student
    </select>
</mapper>
  1. 加载核心配置文件
<?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>
    <environments default="mysql">
        <environment id="mysql">
            <transactionManager type="JDBC"></transactionManager>
            <dataSource type="POOLED">
                <property name="driver" value="com.mysql.jdbc.Driver" />
                <property name="url" value="jdbc:mysql://localhost:3306/db2" />
                <property name="username" value="root" />
                <property name="password" value="root" />
            </dataSource>
        </environment>
    </environments>

    <mappers>
        <mapper resource="StudentMapper.xml"/>
    </mappers>
</configuration>
  1. 测试
import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
import org.junit.Test;

import java.io.InputStream;
import java.util.List;

public class Demo01 {

    @Test
    public void selectAll() throws Exception{
        // 1.加载核心配置文件
        InputStream is = Resources.getResourceAsStream("MyBatisConfig.xml");

        // 2.获取SqlSession工厂对象
        SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(is);

        // 3.通过SqlSession工厂对象获取SqlSession对象
        SqlSession sqlSession = sqlSessionFactory.openSession();

        // 4.执行映射配置文件中的sql语句,接受结果
        List<Student> list = sqlSession.selectList("StudentMapper.selectAll");

        // 5.处理结果
        for (Student student : list) {
            System.out.println(student);
        }

        // 6.释放资源
        sqlSession.close();
        is.close();
    }
}

在这里插入图片描述

2、Mybatis核心方法

返回值方法名说明
InputStreamgetResourceAsStream(String fileName)通过类加载器返回指定资源的字节输入流
SqlSessionFactorybuild(InputStream is)通过指定资源字节输入流获取SqlSession工厂对象
SqlSessionopenSession()获取SqlSeession构建者对象,并开启手动提交事务
SqlSessionopenSession(boolean autoCommit)获取SqlSession构建者对象,如果参数为true,则开启自动提交事务
  • Resources 加载资源的工具类
  • SqlSessionFactoryBuilder 获取SqlSessionFactory工厂对象的类
  • SqlSessionFactory 获取SqlSession构建者对象的工厂接口,指定事务的提交方式
  • SqlSession 构建者对象接口、执行sql语句、管理事务、接口代理

3、mybatis的配置文件

约束标签

<!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Config 3.0//EN" "http://mybatis.org/dtd/mybatis-3-config.dtd">

<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">

mapper:映射文件的根标签
namespace:名称空间
id:唯一标识
resultType:指定结果映射对象类型
parameterType:指定参数映射对象类型
#{属性名}:获取属性值

<mapper namespace="StudentMapper">

    <select id="selectAll" resultType="com.zyk.Student">
        select * FROM student
    </select>

    <select id="selectById" resultType="com.zyk.Student" parameterType="java.lang.Integer">
        select * from student where id = #{id}
    </select>

    <insert id="insert" parameterType="com.zyk.Student">
        insert into student values (#{id},#{name},#{age})
    </insert>

    <update id="update" parameterType="com.zyk.Student">
        update student set name = #{name},age = #{age} where id = #{id}
    </update>

    <delete id="delete" parameterType="java.lang.Integer">
        delete from student where id = #{id}
    </delete>

</mapper>

configuration:核心标签
environments:配置数据库环境
default:表示默认使用的是那个数据库环境
mappers:引入映射配置文件的标签

<configuration>
    <environments default="mysql">
    	<!--id 数据库环境的唯一标识-->
        <environment id="mysql">
        	<!--事务管理标签 type 表示事务处理类型-->
            <transactionManager type="JDBC"></transactionManager>
            <!--dataSource 数据源信息 type 表示使用连接池-->
            <dataSource type="POOLED">
            	<!--property 获取数据库配置信息-->
                <property name="driver" value="com.mysql.jdbc.Driver" />
                <property name="url" value="jdbc:mysql://localhost:3306/db2" />
                <property name="username" value="root" />
                <property name="password" value="root" />
            </dataSource>
        </environment>
    </environments>

    <mappers>
        <mapper resource="StudentMapper.xml"/>
    </mappers>
</configuration>

jdbc.properties配置文件的使用

driver=com.mysql.jdbc.Driver
url=jdbc:mysql://localhost:3306/db2
username=root
password=root

通过 ${键名} 的方式引入

<dataSource type="POOLED">
	<property name="driver" value="${driver}" />
	<property name="url" value="${url}" />
	<property name="username" value="${username}" />
	<property name="password" value="${password}" />
</dataSource>

起别名

<configuration>
	<typeAliases type="com.zyk.Student" alias="Student"/>
	<package name="com.zyk"/>
</configuration>
别名数据类型
stringjava.lang.String
longjava.lang.Long
intjava.lang.Integer
doublejava.lang.Double
booleanjava.lang.Boolean

4、 MyBatis接口代理

  所谓接口代理是指省略掉Dao层接口的实现类编写,由MyBatis框架根据接口的定义来创建该接口的动态代理对象。

实现规则:

  1. 映射配置文件中的名称空间必须和 Dao 层接口的全类名相同。
  2. 映射配置文件中的增删改查标签的 id 属性必须和 Dao 层接口的方法名相同。
  3. 映射配置文件中的增删改查标签的 parameterType 属性必须和 Dao 层接口方法的参数相同。
  4. 映射配置文件中的增删改查标签的 resultType 属性必须和 Dao 层接口方法的返回值相同。

step

  1. 删除接口层的实现类,只保留接口类
package com.zyk.mapper;

import com.zyk.bean.Student;

import java.util.List;

/*
    持久层接口
 */
public interface StudentMapper {
    //查询全部
    public abstract List<Student> selectAll();

    //根据id查询
    public abstract Student selectById(Integer id);

    //新增数据
    public abstract Integer insert(Student stu);

    //修改数据
    public abstract Integer update(Student stu);

    //删除数据
    public abstract Integer delete(Integer id);

}
  1. 修改映射配置文件
<?xml version="1.0" encoding="UTF-8" ?>
<!--MyBatis的DTD约束-->
<!DOCTYPE mapper
        PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
        "http://mybatis.org/dtd/mybatis-3-mapper.dtd">

<!--
    mapper:核心根标签
    namespace属性:名称空间
-->
<mapper namespace="com.zyk.mapper.StudentMapper">

    <sql id="select" >SELECT * FROM student</sql>

    <!--
        select:查询功能的标签
        id属性:唯一标识
        resultType属性:指定结果映射对象类型
        parameterType属性:指定参数映射对象类型
    -->
    <select id="selectAll" resultType="student">
        <include refid="select"/>
    </select>

    <select id="selectById" resultType="student" parameterType="int">
        <include refid="select"/> WHERE id = #{id}
    </select>

    <insert id="insert" parameterType="student">
        INSERT INTO student VALUES (#{id},#{name},#{age})
    </insert>

    <update id="update" parameterType="student">
        UPDATE student SET name = #{name},age = #{age} WHERE id = #{id}
    </update>

    <delete id="delete" parameterType="int">
        DELETE FROM student WHERE id = #{id}
    </delete>
    
</mapper>
  1. 修改service层接口的实现类,采用接口代理方式实现功能
package com.zyk.service.impl;

import com.zyk.bean.Student;
import com.zyk.mapper.StudentMapper;
import com.zyk.service.StudentService;
import com.zyk.utils.MyBatisUtils;
import org.apache.ibatis.session.SqlSession;

import java.io.IOException;
import java.io.InputStream;
import java.util.List;

/*
    业务层实现类
 */
public class StudentServiceImpl implements StudentService {

    @Override
    public List<Student> selectAll() {
        // 获取SqlSession对象
        SqlSession sqlSession = MyBatisUtils.getSqlSession();
        // 获取StudentMapper接口的实现类对象
        StudentMapper mapper = sqlSession.getMapper(StudentMapper.class);
        // 调用实现类对象中的方法来完成操作
        List<Student> list = mapper.selectAll();
        // 释放资源
        sqlSession.close();
        // 返回结果
        return list;
    }

	@Override
    public Student selectById(Integer id) {
        // 获取SqlSession对象
        SqlSession sqlSession = MyBatisUtils.getSqlSession();
        // 获取StudentMapper接口的实现类对象
        StudentMapper mapper = sqlSession.getMapper(StudentMapper.class);
        // 调用实现类对象中的方法来完成操作
        Student stu = mapper.selectById(id)
        // 释放资源
        sqlSession.close();
        // 返回结果
        return stu;
    }

	@Override
    public Integer insert(Student stu) {
		// 获取SqlSession对象
        SqlSession sqlSession = MyBatisUtils.getSqlSession();
        // 获取StudentMapper接口的实现类对象
        StudentMapper mapper = sqlSession.getMapper(StudentMapper.class);
        // 调用实现类对象中的方法来完成操作
        Integer result = mapper.insert(stu)
        // 释放资源
        sqlSession.close();
        // 返回结果
        return result;
	}

	@Override
    public Integer update(Student stu) {
        // 获取SqlSession对象
        SqlSession sqlSession = MyBatisUtils.getSqlSession();
        // 获取StudentMapper接口的实现类对象
        StudentMapper mapper = sqlSession.getMapper(StudentMapper.class);
        // 调用实现类对象中的方法来完成操作
    	Integer result = mapper.update(stu);
		// 释放资源
        sqlSession.close();
        // 返回结果
        return result;
    }	

	@Override
    public Integer delete(Integer id) {
        // 获取SqlSession对象
        SqlSession sqlSession = MyBatisUtils.getSqlSession();
        // 获取StudentMapper接口的实现类对象
        StudentMapper mapper = sqlSession.getMapper(StudentMapper.class);
        // 调用实现类对象中的方法来完成操作
    	Integer result = mapper.delete(id);
		// 释放资源
        sqlSession.close();
        // 返回结果
        return result;
    }	
}
package com.zyk.utils;

import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;

import java.io.IOException;
import java.io.InputStream;

/*
    工具类
 */
public class MyBatisUtils {
    // 私有构造
    private MyBatisUtils() {}

    // 声明工厂对象
    private static SqlSessionFactory sqlSessionFactory;

    // 提供静态代码块,读取核心配置文件,并给工厂对象赋值
    static {
        try {
            InputStream is = Resources.getResourceAsStream("MyBatisConfig.xml");
            new SqlSessionFactoryBuilder().build(is);
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    // 静态方法,获取SqlSession对象
    public static SqlSession getSqlSession() {
        return sqlSessionFactory.openSession(true);
    }
}

@Param注解
  当接口中参数大于一个时,由于配置文件的resultType属性唯一,所以可以通过加@param注解的方式处理

public interface StudentMapper {
	List<Student> selectByNameOrAge(@Param("name") String name, @Param("age") Integer age);
}	
<select id="selectByNameOrAge" resultType="student">
	SELECT * FROM student WHERE name=#{name} OR age=#{age}
</select>

5、动态sql语句

  之前在xml文件中写的sql语句都是写死的,并且查询语句也是固定不变的,很不灵活。当业务逻辑复杂时,需要使用动态sql语句来完成不同需求功能。例如查询条件可以是一个两个或三个。

<where>:条件标签,如果有动态条件,则使用该标签代替where关键字。
<if>:条件判断标签。
	<if test="条件判断">
		查询条件拼接
	</if>
<foreach>:循环遍历标签,适用于多个参数或者的关系
collection:参数容量类型,(list-集合,array-数组)
open:开始的SQL语句
close:结束的SQL语句
item:参数变量名。
separator:分隔符
	<foreach collection="" open="" close="" item="" separator="">
		获取参数
	</foreach>
<sql>:抽取sql语句标签
<sql id="片段唯一标识" >抽取的sql语句</sql>
<include>:引入sql片段标签
<include refid="片段唯一标识"/>
<?xml version="1.0" encoding="UTF-8" ?>
<!--MyBatis的DTD约束-->
<!DOCTYPE mapper
        PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
        "http://mybatis.org/dtd/mybatis-3-mapper.dtd">

<mapper namespace="com.zyk.mapper.StudentMapper">

	<sql id="select" >SELECT * FROM student</sql>

    <select id="selectCondition" resultType="student" parameterType="student">
        <include refid="select"/>
        <where>
            <if test="id != null">
                id = #{id}
            </if>
            <if test="name != null">
                AND name = #{name}
            </if>
            <if test="age != null">
                AND age = #{age}
            </if>
        </where>
    </select>

    <select id="selectByIds" resultType="student" parameterType="list">
        <include refid="select"/>
        <where>
            <foreach collection="list" open="id IN (" close=")" item="id" separator=",">
                #{id}
            </foreach>
        </where>
    </select>
</mapper>
public interface StudentMapper {
    //多条件查询
    public abstract List<Student> selectCondition(Student stu);

    //根据多个id查询
    public abstract List<Student> selectByIds(List<Integer> ids);
}
public class Test01 {

    @Test
    public void selectCondition() throws Exception{
        //1.加载核心配置文件
        InputStream is = Resources.getResourceAsStream("MyBatisConfig.xml");

        //2.获取SqlSession工厂对象
        SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(is);

        //3.通过工厂对象获取SqlSession对象
        SqlSession sqlSession = sqlSessionFactory.openSession(true);

        //4.获取StudentMapper接口的实现类对象
        StudentMapper mapper = sqlSession.getMapper(StudentMapper.class);

        Student stu = new Student();
        stu.setId(2);
        stu.setName("李四");
        //stu.setAge(24);

        //5.调用实现类的方法,接收结果
        List<Student> list = mapper.selectCondition(stu);

        //6.处理结果
        for (Student student : list) {
            System.out.println(student);
        }

        //7.释放资源
        sqlSession.close();
        is.close();
    }

	@Test
    public void selectByIds() throws Exception{
        //1.加载核心配置文件
        InputStream is = Resources.getResourceAsStream("MyBatisConfig.xml");

        //2.获取SqlSession工厂对象
        SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(is);

        //3.通过工厂对象获取SqlSession对象
        SqlSession sqlSession = sqlSessionFactory.openSession(true);

        //4.获取StudentMapper接口的实现类对象
        StudentMapper mapper = sqlSession.getMapper(StudentMapper.class);

        List<Integer> ids = new ArrayList<>();
        ids.add(1);
        ids.add(2);
        ids.add(3);

        //5.调用实现类的方法,接收结果
        List<Student> list = mapper.selectByIds(ids);

        //6.处理结果
        for (Student student : list) {
            System.out.println(student);
        }

        //7.释放资源
        sqlSession.close();
        is.close();
    }
    
}

6、分页插件

  1. 导入jar包 jsqlparser、pagehelper

在这里插入图片描述

  1. 在核心配置文件中集成分页插件
<configuration>
	<plugins>
		<plugin interceptor="com.github.pagehelper.PageInterceptor"></plugin>
	</plugins>
</configuration>	
  1. 使用分页助手
    PageHelper.startPage(pageNum, pageSize);
    mapper.selectAll();

配置文件

<?xml version="1.0" encoding="UTF-8" ?>
<!--MyBatis的DTD约束-->
<!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Config 3.0//EN" "http://mybatis.org/dtd/mybatis-3-config.dtd">

<!--configuration 核心根标签-->
<configuration>

    <!--引入数据库连接的配置文件-->
    <properties resource="jdbc.properties"/>

    <!--配置LOG4J-->
    <settings>
        <setting name="logImpl" value="log4j"/>
    </settings>

    <!--起别名-->
    <typeAliases>
        <typeAlias type="com.zyk.bean.Student" alias="student"/>
        <!--<package name="com.zyk.bean"/>-->
    </typeAliases>

    <!--集成分页助手插件-->
    <plugins>
        <plugin interceptor="com.github.pagehelper.PageInterceptor"></plugin>
    </plugins>

    <!--environments配置数据库环境,环境可以有多个。default属性指定使用的是哪个-->
    <environments default="mysql">
        <!--environment配置数据库环境  id属性唯一标识-->
        <environment id="mysql">
            <!-- transactionManager事务管理。  type属性,采用JDBC默认的事务-->
            <transactionManager type="JDBC"></transactionManager>
            <!-- dataSource数据源信息   type属性 连接池-->
            <dataSource type="POOLED">
                <!-- property获取数据库连接的配置信息 -->
                <property name="driver" value="${driver}" />
                <property name="url" value="${url}" />
                <property name="username" value="${username}" />
                <property name="password" value="${password}" />
            </dataSource>
        </environment>
    </environments>

    <!-- mappers引入映射配置文件 -->
    <mappers>
        <!-- mapper 引入指定的映射配置文件   resource属性指定映射配置文件的名称 -->
        <mapper resource="StudentMapper.xml"/>
    </mappers>
</configuration>

代码演示

import com.github.pagehelper.PageHelper;
import com.github.pagehelper.PageInfo;
import com.zyk.bean.Student;
import com.zyk.mapper.StudentMapper;
import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
import org.junit.Test;

import java.io.InputStream;
import java.util.List;

public class Test01 {
    @Test
    public void selectPaging() throws Exception{
        //1.加载核心配置文件
        InputStream is = Resources.getResourceAsStream("MyBatisConfig.xml");

        //2.获取SqlSession工厂对象
        SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(is);

        //3.通过工厂对象获取SqlSession对象
        SqlSession sqlSession = sqlSessionFactory.openSession(true);

        //4.获取StudentMapper接口的实现类对象
        StudentMapper mapper = sqlSession.getMapper(StudentMapper.class);

        //通过分页助手来实现分页功能
        // 第一页:显示3条数据
        //PageHelper.startPage(1,3);
        // 第二页:显示3条数据
        //PageHelper.startPage(2,3);
        // 第三页:显示3条数据
        PageHelper.startPage(3,3);

        //5.调用实现类的方法,接收结果
        List<Student> list = mapper.selectAll();

        //6.处理结果
        for (Student student : list) {
            System.out.println(student);
        }

        //获取分页相关参数
        PageInfo<Student> info = new PageInfo<>(list);
        System.out.println("总条数:" + info.getTotal());
        System.out.println("总页数:" + info.getPages());
        System.out.println("当前页:" + info.getPageNum());
        System.out.println("每页显示条数:" + info.getPageSize());
        System.out.println("上一页:" + info.getPrePage());
        System.out.println("下一页:" + info.getNextPage());
        System.out.println("是否是第一页:" + info.isIsFirstPage());
        System.out.println("是否是最后一页:" + info.isIsLastPage());

        //7.释放资源
        sqlSession.close();
        is.close();
    }
}

7、多表操作

  • 多表操作一对一
      人和身份证、学生和学号、员工和员工号都属于一对一的多表操作。

step

  • 数据准备
  1. 数据库表
    在这里插入图片描述
    在这里插入图片描述
  2. 实体类对象
package com.zyk.bean;

public class Person {
    private Integer id;
    private String name;
    private Integer age;

    public Person() {
    }

    public Person(Integer id, String name, Integer age) {
        this.id = id;
        this.name = name;
        this.age = age;
    }

    public Integer getId() {
        return id;
    }

    public void setId(Integer id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public Integer getAge() {
        return age;
    }

    public void setAge(Integer age) {
        this.age = age;
    }

    @Override
    public String toString() {
        return "Person{" +
                "id=" + id +
                ", name='" + name + '\'' +
                ", age=" + age +
                '}';
    }
}
package com.zyk.bean;

public class Card {
    private Integer id;
    private String number;

    private Person p;   // 所属人的对象

    public Card() {
    }

    public Card(Integer id, String number, Person p) {
        this.id = id;
        this.number = number;
        this.p = p;
    }

    public Integer getId() {
        return id;
    }

    public void setId(Integer id) {
        this.id = id;
    }

    public String getNumber() {
        return number;
    }

    public void setNumber(String number) {
        this.number = number;
    }

    public Person getP() {
        return p;
    }

    public void setP(Person p) {
        this.p = p;
    }

    @Override
    public String toString() {
        return "Card{" +
                "id=" + id +
                ", number='" + number + '\'' +
                ", p=" + p +
                '}';
    }
}
  1. jdbc.properties
driver=com.mysql.jdbc.Driver
url=jdbc:mysql://localhost:3306/db2
username=root
password=root
  1. MybatisConfig.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"/>

    <!--配置log4j-->
    <settings>
        <setting name="logImpl" value="log4j"/>
    </settings>

    <!--起别名-->
    <typeAliases>
        <package name="com.zyk.bean"/>
    </typeAliases>

    <!--配置数据库环境-->
    <environments default="mysql">
        <environment id="mysql">
            <transactionManager type="JDBC"></transactionManager>
            <dataSource type="POOLED">
                <property name="driver" value="${driver}"/>
                <property name="url" value="${url}"/>
                <property name="username" value="${username}"/>
                <property name="password" value="${password}"/>
            </dataSource>
        </environment>
    </environments>

    <!--引入映射配置文件-->
    <mappers>

    </mappers>

</configuration>
  • 功能实现
  1. 引入配置文件
<!--引入映射配置文件-->
    <mappers>
        <mapper resource="com/zyk/one_to_one/OneToOneMapper.xml"/>
    </mappers>
  1. 编写接口
package com.zyk.table01;

import com.zyk.bean.Card;

import java.util.List;

public interface OneToOneMapper {
    // 查询全部
    public abstract List<Card> selectAll();
}
  1. 编写映射配置文件
<?xml version="1.0" encoding="UTF-8" ?>
<?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.zyk.table01.OneToOneMapper">
    <!--配置字段和实体类对象熟悉的映射关系-->
    <resultMap id="oneToOne" type="Card">
        <id column="cid" property="id"/>
        <result column="number" property="number"/>
        <!--
            association:配置被包含对象的映射关系
            property:被包含对象的变量名
            javaType:被包含对象的数据类型
        -->
        <association property="p" javaType="Person">
            <id column="pid" property="id"/>
            <result column="name" property="name"/>
            <result column="age" property="age"/>
        </association>
    </resultMap>
    <select id="selectAll" resultMap="oneToOne">
        select c.id cid, number, pid, NAME, age FROM card c, person p where c.pid=p.id
    </select>
</mapper>
  1. 编写测试类
package com.zyk.table01;

import com.zyk.bean.Card;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.junit.Test;
import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;


import java.io.InputStream;
import java.util.List;

public class Test01 {
    @Test
    public void selectAll() throws Exception {
        // 1. 加载核心配置文件
        InputStream is = Resources.getResourceAsStream("MybatisConfig.xml");

        // 2. 获取SqlSession工厂对象
        SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(is);

        // 3. 通过工厂对象获取SqlSession对象
        SqlSession sqlSession = sqlSessionFactory.openSession(true);

        // 4. 获取接口的实现类对象
        OneToOneMapper mapper = sqlSession.getMapper(OneToOneMapper.class);

        // 5. 调用接口类的方法,结束结果
        List<Card> list = mapper.selectAll();

        // 6. 处理结果
        for (Card card : list) {
            System.out.println(card);
        }

        // 7. 释放资源
        sqlSession.close();
        is.close();
    }
}
  • 多表操作一对多
      一个班级可以有多个学生,一个老师可以有多个学生,一个班级可以有多个老师。

step

  • 数据准备
  1. 数据库表

在这里插入图片描述
在这里插入图片描述

  1. 实体类对象
package com.zyk.bean;

import java.util.List;

public class Classes {
    private Integer id;
    private String name;

    private List<Student> students;

    public Classes() {}

    public Classes(Integer id, String name, List<Student> students) {
        this.id = id;
        this.name = name;
        this.students = students;
    }

    public Integer getId() {
        return id;
    }

    public void setId(Integer id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public List<Student> getStudents() {
        return students;
    }

    public void setStudents(List<Student> students) {
        this.students = students;
    }

    @Override
    public String toString() {
        return "Classes{" +
                "id=" + id +
                ", name='" + name + '\'' +
                ", students=" + students +
                '}';
    }
}
package com.zyk.bean;

public class Student {
    private Integer id;
    private String name;
    private Integer age;

    public Student() {}

    public Student(Integer id, String name, Integer age) {
        this.id = id;
        this.name = name;
        this.age = age;
    }

    public Integer getId() {
        return id;
    }

    public void setId(Integer id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public Integer getAge() {
        return age;
    }

    public void setAge(Integer age) {
        this.age = age;
    }

    @Override
    public String toString() {
        return "Student{" +
                "id=" + id +
                ", name='" + name + '\'' +
                ", age=" + age +
                '}';
    }
}
  1. jdbc.properties
driver=com.mysql.jdbc.Driver
url=jdbc:mysql://localhost:3306/db2
username=root
password=root
  1. MybatisConfig.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"/>

    <!--配置log4j-->
    <settings>
        <setting name="logImpl" value="log4j"/>
    </settings>

    <!--起别名-->
    <typeAliases>
        <package name="com.zyk.bean"/>
    </typeAliases>

    <!--配置数据库环境-->
    <environments default="mysql">
        <environment id="mysql">
            <transactionManager type="JDBC"></transactionManager>
            <dataSource type="POOLED">
                <property name="driver" value="${driver}"/>
                <property name="url" value="${url}"/>
                <property name="username" value="${username}"/>
                <property name="password" value="${password}"/>
            </dataSource>
        </environment>
    </environments>

    <!--引入映射配置文件-->
    <mappers>

    </mappers>

</configuration>
  • 功能实现
  1. 引入配置文件
<!--引入映射配置文件-->
    <mappers>
        <mapper resource="com/zyk/one_to_many/OneToManyMapper.xml"/>
    </mappers>
  1. 编写接口
package com.zyk.table02;

import com.zyk.bean.Classes;

import java.util.List;

public interface OneToManyMapper {
    // 查询全部
    public abstract List<Classes> selectAll();
}
  1. 编写编写映射配置文件
<?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.zyk.table02.OneToManyMapper">
<resultMap id="oneToMany" type="Classes">
    <id column="cid" property="id"/>
    <result column="cname" property="name"/>

    <!--
        collection:配置被包含的集合对象映射关系
        property:被包含对象的变量名
        ofType:被包含对象的实际数据类型
    -->
    <collection property="students" ofType="com.zyk.bean.Student">
        <id column="sid" property="id"/>
        <result column="sname" property="name"/>
        <result column="sage" property="age"/>
    </collection>
</resultMap>
<select id="selectAll" resultMap="oneToMany">
        SELECT c.id cid,c.name cname,s.id sid,s.name sname,s.age sage FROM classes c,student s WHERE c.id=s.cid
    </select>
</mapper>
  1. 编写测试类
package com.zyk.table02;

import com.zyk.bean.Classes;
import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
import org.junit.Test;

import java.io.InputStream;
import java.util.List;

public class Test02 {
    @Test
    public void selectAll() throws Exception {
        // 1. 加载核心配置文件
        InputStream is = Resources.getResourceAsStream("MybatisConfig.xml");

        // 2. 获取SqlSession工厂对象
        SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(is);

        // 3. 通过工厂对象获取SqlSession对象
        SqlSession sqlSession = sqlSessionFactory.openSession(true);

        // 4. 获取接口的实现类对象
        OneToManyMapper mapper = sqlSession.getMapper(OneToManyMapper.class);

        // 5. 调用接口类的方法,结束结果
        List<Classes> list = mapper.selectAll();

        // 6. 处理结果
        for (Classes classes : list) {
            System.out.println(classes);
        }

        // 7. 释放资源
        sqlSession.close();
        is.close();
    }
}
  • 多表操作多对多

  学生和课程,一个学生可以选多门课程,一个课程也可以被多个学生选择。

step

  • 数据准备
  1. 数据库表

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

  1. 实体类对象
package com.zyk.bean;

public class Course {
    private Integer id;
    private String name;
	
	/*
		空参构造、全参构造
		get、set方法
		重写toString
	*/
}
package com.zyk.bean;

public class Student {
    private Integer id;
    private String name;
    private Integer age;
	
	// 添加约束条件
	private List<Course> courses;
	/*
		空参构造、全参构造
		get、set方法
		重写toString
	*/
}
  1. 同上(一对一和一对多)
  2. 同上(一对一和一对多)
  • 功能实现
  1. 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="com.zyk.table03.ManyToManyMapper">
    <resultMap id="manyToMany" type="com.zyk.bean.Student">
        <id column="sid" property="id"/>
        <result column="sname" property="name"/>
        <result column="sage" property="age"/>
        <collection property="courses" ofType="Course">
            <id column="cid" property="id"/>
            <result column="cname" property="name"/>
        </collection>
    </resultMap>
    <select id="selectAll" resultMap="manyToMany">
        select sc.sid, s.name sname, s.age sage, sc.cid, c.name cname from student s, course c, stu_cr sc where sc.sid=s.id and sc.cid=c.id
    </select>
</mapper>
  1. 接口类
package com.zyk.table03;

import com.zyk.bean.Student;

import java.util.List;

public interface ManyToManyMapper {
    // 查询全部
    public abstract List<Student> selectAll();
}
  1. 实现类
package com.zyk.table03;


import com.zyk.bean.Course;
import com.zyk.bean.Student;
import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
import org.junit.Test;
import java.io.InputStream;
import java.util.List;

public class Test03 {

    @Test
    public void selectAll() throws Exception {
        // 1. 加载核心配置文件
        InputStream is = Resources.getResourceAsStream("MybatisConfig.xml");

        // 2. 获取SqlSession工厂对象
        SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(is);

        // 3. 通过工厂对象获取SqlSession对象
        SqlSession sqlSession = sqlSessionFactory.openSession(true);

        // 4. 获取接口的实现类对象
        ManyToManyMapper mapper = sqlSession.getMapper(ManyToManyMapper.class);

        // 5. 调用接口类的方法,结束结果
        List<Student> list = mapper.selectAll();

        // 6. 处理结果
        for (Student student : list) {
            System.out.println(student.getId() + "," + student.getName() + "," + student.getAge());
            List<Course> courses = student.getCourses();
            for (Course cours : courses) {
                System.out.println("\t" + cours);
            }
        }

        // 7. 释放资源
        sqlSession.close();
        is.close();
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值