• 07—mybatis注解配置一


    常用注解
    Select:映射查询的sql语句。
    SelectProvider:Select语句的动态sql映射。允许指定一个类名和一个方法在执行时返回运行的查询语句。有两个属性:type和mehtod,type属性是类的完全限定名,method是该类中的那个方法名。

    Insert:映射插入的sql语句。
    InsertProvider:Insert语句的动态sql映射。允许指定一个类名和一个方法在执行时返回运行的插入语句。有两个属性:type和method,typet属性是类的完全限定名,method是该类中的那个方法名。

    Update:映射更新的sql语句。
    UpdateProvider:Update语句的动态sql映射,允许指定一个类名和一个方法在执行时返回运行的更新语句。有两个属性:type和method,type属性是类的完全限定名,method是该类中的那个方法名。

    Delete:映射删除的sql语句。
    DeleteProvider:Delete语句的动态sql映射。允许指定一个类名和一个方法在执行时返回运行的删除语句。有两个属性:type和method,type属性是类的完全限定名,method是该类中的那个方法名。

    Results:多个结果映射(Result)列表。
    Options:提供配置选项的附加值,它们通常在映射语句上作为附加功能配置出现。
    One:复杂类型的单独属性值映射。必须指定Select属性,表示已对一。

    一对一
    1.创建表

    CREATE TABLE tb_card(
    id INT PRIMARY KEY AUTO_INCREMENT,
    CODE VARCHAR(18)
    );
    INSERT INTO tb_card(CODE) VALUES('150801198009191038');
    CREATE TABLE tb_person(
    id INT PRIMARY KEY AUTO_INCREMENT,
    NAME VARCHAR(18),
    sex VARCHAR(18),
    age INT,
    card_id INT UNIQUE,
    FOREIGN KEY (card_id) REFERENCES tb_card(id)
    );
    INSERT INTO tb_person(NAME,sex,age,card_id) VALUES('mingming','',28,1)

    2.创建model
    Card.java

    package org.fkit.domain;
    import java.io.Serializable;
    public class Card implements Serializable {
        private Integer id;  // 主键id
        private String code; // 身份证编号
        public Card() {
            super();
        }
        public Integer getId() {
            return id;
        }
        public void setId(Integer id) {
            this.id = id;
        }
        public String getCode() {
            return code;
        }
        public void setCode(String code) {
            this.code = code;
        }
        @Override
        public String toString() {
            return "Card [id=" + id + ", code=" + code + "]";
        }
    }
    Person.java
    package org.fkit.domain;
    import java.io.Serializable;
    public class Person implements Serializable {
        private Integer id;  // 主键id
        private String name; // 姓名
        private String sex;  // 性别
        private Integer age; // 年龄
        // 人和身份证是一对一的关系,即一个人只有一个身份证
        private Card card; 
        public Person() {
            super();
            // TODO Auto-generated constructor stub
        }
        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 String getSex() {
            return sex;
        }
        public void setSex(String sex) {
            this.sex = sex;
        }
        public Integer getAge() {
            return age;
        }
        public void setAge(Integer age) {
            this.age = age;
        }
        public Card getCard() {
            return card;
        }
        public void setCard(Card card) {
            this.card = card;
        }
        @Override
        public String toString() {
            return "Person [id=" + id + ", name=" + name + ", sex=" + sex
                    + ", age=" + age + "]";
        }
    }

    3.mapper

    CardMapper.java

    package org.fkit.mapper;
    import org.apache.ibatis.annotations.Select;
    import org.fkit.domain.Card;
    public interface CardMapper {
        @Select("SELECT * FROM TB_CARD WHERE ID = #{id} ")
        Card selectCardById(Integer id);
    }

    PersonMapper.java

    package org.fkit.mapper;
    import org.apache.ibatis.annotations.One;
    import org.apache.ibatis.annotations.Result;
    import org.apache.ibatis.annotations.Results;
    import org.apache.ibatis.annotations.Select;
    import org.apache.ibatis.mapping.FetchType;
    import org.fkit.domain.Person;
    public interface PersonMapper {
        @Select("SELECT * FROM TB_PERSON WHERE ID = #{id}")
        @Results({
            @Result(id=true,column="id",property="id"),
            @Result(column="name",property="name"),
            @Result(column="sex",property="sex"),
            @Result(column="age",property="age"),
            @Result(column="card_id",property="card",
            one=@One(
                    select="org.fkit.mapper.CardMapper.selectCardById",
                    fetchType=FetchType.EAGER))
        })
        Person selectPersonById(Integer id);
    }

    4.mybatis-config.xml

    db.properties

    driver=com.mysql.jdbc.Driver
    url=jdbc:mysql://127.0.0.1:3306/mybatis
    username=root
    password=123456

    log4j.properties

    # Global logging configuration
    log4j.rootLogger=ERROR, stdout
    # MyBatis logging configuration...
    log4j.logger.org.fkit.mapper.PersonMapper=DEBUG
    log4j.logger.org.fkit.mapper.CardMapper=DEBUG
    # Console output...
    log4j.appender.stdout=org.apache.log4j.ConsoleAppender
    log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
    log4j.appender.stdout.layout.ConversionPattern=%5p [%t] - %m%n

    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">
      <!--  XML 配置文件包含对 MyBatis 系统的核心设置 -->
    <configuration>
        <properties resource="db.properties"/>
        <!-- 指定 MyBatis 所用日志的具体实现 -->
        <settings>
            <setting name="logImpl" value="LOG4J"/>
        </settings>
        <environments default="mysql">
        <!-- 环境配置,即连接的数据库。 -->
        <environment id="mysql">
        <!--  指定事务管理类型,type="JDBC"指直接简单使用了JDBC的提交和回滚设置 -->
          <transactionManager type="JDBC"/>
          <!--  dataSource指数据源配置,POOLED是JDBC连接对象的数据源连接池的实现。 -->
          <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告诉了MyBatis去哪里找持久化类的映射文件 -->
      <mappers>
          <mapper class="org.fkit.mapper.PersonMapper"/> 
          <mapper class="org.fkit.mapper.CardMapper"/> 
      </mappers>
    </configuration>

    5测试

    FKSqlSessionFactory.java
    package org.fkit.factory;
    import java.io.InputStream;
    import org.apache.ibatis.io.Resources;
    import org.apache.ibatis.session.SqlSession;
    import org.apache.ibatis.session.SqlSessionFactory;
    import org.apache.ibatis.session.SqlSessionFactoryBuilder;
    public class FKSqlSessionFactory {
        private static SqlSessionFactory sqlSessionFactory = null;
        // 初始化创建SqlSessionFactory对象
        static{
            try {
                // 读取mybatis-config.xml文件
                InputStream inputStream = Resources.getResourceAsStream("mybatis-config.xml");
                sqlSessionFactory = new SqlSessionFactoryBuilder()
                        .build(inputStream);
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
        // 获取SqlSession对象的静态方法
        public static SqlSession getSqlSession(){
            return sqlSessionFactory.openSession();
        }
        // 获取SqlSessionFactory的静态方法
        public static SqlSessionFactory getSqlSessionFactory() {
            return sqlSessionFactory;
        }
    }

    OneToOneTest.java

    package org.fkit.test;
    import org.apache.ibatis.session.SqlSession;
    import org.fkit.domain.Person;
    import org.fkit.factory.FKSqlSessionFactory;
    import org.fkit.mapper.PersonMapper;
    public class OneToOneTest {
        public static void main(String[] args) throws Exception {
            // 获取Session实例
            SqlSession session = FKSqlSessionFactory.getSqlSession();
            // 获取PersonMapper实例
            PersonMapper pm = session.getMapper(PersonMapper.class);
            // 根据id查询Person对象,同时需要获得关联的Card对象
            Person p = pm.selectPersonById(1);
            // 查看查询到的Person对象
            System.out.println(p);
            // 查看查询到的关联的Card对象
            System.out.println(p.getCard());
            // 提交事务
            session.commit();
            // 关闭Session
            session.close();
        }
    }

    结果

    DEBUG [main] - ==>  Preparing: SELECT * FROM TB_PERSON WHERE ID = ? 
    DEBUG [main] - ==> Parameters: 1(Integer)
    DEBUG [main] - ====>  Preparing: SELECT * FROM TB_CARD WHERE ID = ? 
    DEBUG [main] - ====> Parameters: 1(Integer)
    DEBUG [main] - <====      Total: 1
    DEBUG [main] - <==      Total: 1
    Person [id=1, name=mingming, sex=男, age=28]
    Card [id=1, code=150801198009191038]

    一对多
    1.创建表
    创建表tb_clazz

    CREATE TABLE tb_clazz(
    id INT PRIMARY KEY AUTO_INCREMENT,
    CODE VARCHAR(18),
    NAME VARCHAR(18)
    );
    INSERT INTO tb_clazz(CODE,NAME) VALUES('2017001','Java双语幼儿园中班');
    创建表tb_student
    CREATE TABLE tb_student(
    id INT PRIMARY KEY AUTO_INCREMENT,
    NAME VARCHAR(18),
    sex VARCHAR(18),
    age INT,
    clazz_id INT,
    FOREIGN KEY (clazz_id) REFERENCES tb_clazz(id)
    );
    
    INSERT INTO tb_student(NAME,sex,age,clazz_id) VALUES('aa','男',23,1);
    INSERT INTO tb_student(NAME,sex,age,clazz_id) VALUES('bb','女',18,1);
    INSERT INTO tb_student(NAME,sex,age,clazz_id) VALUES('cc','男',21,1);
    INSERT INTO tb_student(NAME,sex,age,clazz_id) VALUES('dd','女',20,1);

    2.创建model
    Clazz.java

    package org.fkit.domain;
    import java.io.Serializable;
    import java.util.List;
    public class Clazz implements Serializable {
        private Integer id; // 班级id,主键
        private String code; // 班级编号
        private String name; // 班级名称
        // 班级和学生是一对多的关系,即一个班级可以有多个学生
        private List<Student> students;
        public Clazz() {
            super();
            // TODO Auto-generated constructor stub
        }
        public Integer getId() {
            return id;
        }
        public void setId(Integer id) {
            this.id = id;
        }
        public String getCode() {
            return code;
        }
        public void setCode(String code) {
            this.code = code;
        }
        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 "Clazz [id=" + id + ", code=" + code + ", name=" + name + "]";
        }
    }

    Student.java

    package org.fkit.domain;
    import java.io.Serializable;
    public class Student implements Serializable {
        private Integer id; // 学生id,主键
        private String name; // 姓名
        private String sex;  // 性别
        private Integer age; // 年龄
        // 学生和班级是多对一的关系,即一个学生只属于一个班级
        private Clazz clazz;
        public Student() {
            super();
            // TODO Auto-generated constructor stub
        }
        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 String getSex() {
            return sex;
        }
        public void setSex(String sex) {
            this.sex = sex;
        }
        public Integer getAge() {
            return age;
        }
        public void setAge(Integer age) {
            this.age = age;
        }
        public Clazz getClazz() {
            return clazz;
        }
        public void setClazz(Clazz clazz) {
            this.clazz = clazz;
        }
        @Override
        public String toString() {
            return "Student [id=" + id + ", name=" + name + ", sex=" + sex
                    + ", age=" + age + "]";
        }
    }

    3.mapper
    ClazzMapper.java

    package org.fkit.mapper;
    import org.apache.ibatis.annotations.Many;
    import org.apache.ibatis.annotations.Result;
    import org.apache.ibatis.annotations.Results;
    import org.apache.ibatis.annotations.Select;
    import org.apache.ibatis.mapping.FetchType;
    import org.fkit.domain.Clazz;
    public interface ClazzMapper {
        // 根据id查询班级信息
        @Select("SELECT * FROM TB_CLAZZ  WHERE ID = #{id}")
        @Results({
            @Result(id=true,column="id",property="id"),
            @Result(column="code",property="code"),
            @Result(column="name",property="name"),
            @Result(column="id",property="students",
            many=@Many(
                    select="org.fkit.mapper.StudentMapper.selectByClazzId",
                    fetchType=FetchType.LAZY))
        })
        Clazz selectById(Integer id);        
    }

    StudentMapper.java

    package org.fkit.mapper;
    import java.util.List;
    import org.apache.ibatis.annotations.Result;
    import org.apache.ibatis.annotations.Results;
    import org.apache.ibatis.annotations.Select;
    import org.fkit.domain.Student;
    public interface StudentMapper {
        // 根据班级id查询班级所有学生
        @Select("SELECT * FROM TB_STUDENT WHERE CLAZZ_ID = #{id}")
        @Results({
            @Result(id=true,column="id",property="id"),
            @Result(column="name",property="name"),
            @Result(column="sex",property="sex"),
            @Result(column="age",property="age")
        })
        List<Student> selectByClazzId(Integer clazz_id);    
    }

    4.mybatis-config.xml
    db.properties

    driver=com.mysql.jdbc.Driver
    url=jdbc:mysql://127.0.0.1:3306/mytestdb
    username=root
    password=root

    log4j.properties

    # Global logging configuration
    log4j.rootLogger=ERROR, stdout
    # MyBatis logging configuration...
    log4j.logger.org.fkit.mapper.ClazzMapper=DEBUG
    log4j.logger.org.fkit.mapper.StudentMapper=DEBUG
    # Console output...
    log4j.appender.stdout=org.apache.log4j.ConsoleAppender
    log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
    log4j.appender.stdout.layout.ConversionPattern=%5p [%t] - %m%n

    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">
      <!--  XML 配置文件包含对 MyBatis 系统的核心设置 -->
    <configuration>
        <properties resource="db.properties"/>
        <!-- 指定 MyBatis 所用日志的具体实现 -->
        <settings>
            <setting name="logImpl" value="LOG4J"/>
            <!-- 要使延迟加载生效必须配置下面两个属性 -->
            <setting name="lazyLoadingEnabled" value="true"/>
            <setting name="aggressiveLazyLoading" value="false"/>
        </settings>
        <environments default="mysql">
        <!-- 环境配置,即连接的数据库。 -->
        <environment id="mysql">
        <!--  指定事务管理类型,type="JDBC"指直接简单使用了JDBC的提交和回滚设置 -->
          <transactionManager type="JDBC"/>
          <!--  dataSource指数据源配置,POOLED是JDBC连接对象的数据源连接池的实现。 -->
          <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告诉了MyBatis去哪里找持久化类的映射文件 -->
      <mappers>
          <mapper class="org.fkit.mapper.ClazzMapper"/> 
          <mapper class="org.fkit.mapper.StudentMapper"/> 
      </mappers>
    </configuration>

    5.测试
    FKSqlSessionFactory.java

    package org.fkit.factory;
    import java.io.InputStream;
    import org.apache.ibatis.io.Resources;
    import org.apache.ibatis.session.SqlSession;
    import org.apache.ibatis.session.SqlSessionFactory;
    import org.apache.ibatis.session.SqlSessionFactoryBuilder;
    public class FKSqlSessionFactory {
        private static SqlSessionFactory sqlSessionFactory = null;
        // 初始化创建SqlSessionFactory对象
        static{
            try {
                // 读取mybatis-config.xml文件
                InputStream inputStream = Resources.getResourceAsStream("mybatis-config.xml");
                sqlSessionFactory = new SqlSessionFactoryBuilder()
                        .build(inputStream);
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
        // 获取SqlSession对象的静态方法
        public static SqlSession getSqlSession(){
            return sqlSessionFactory.openSession();
        }
        // 获取SqlSessionFactory的静态方法
        public static SqlSessionFactory getSqlSessionFactory() {
            return sqlSessionFactory;
        }
    }

    结果:

    DEBUG [main] - ==>  Preparing: SELECT * FROM TB_CLAZZ WHERE ID = ? 
    DEBUG [main] - ==> Parameters: 1(Integer)
    DEBUG [main] - <==      Total: 1
    1 2017001 Java双语幼儿园中班
    DEBUG [main] - ==>  Preparing: SELECT * FROM TB_STUDENT WHERE CLAZZ_ID = ? 
    DEBUG [main] - ==> Parameters: 1(Integer)
    DEBUG [main] - <==      Total: 4
    Student [id=1, name=jack, sex=男, age=23]
    Student [id=2, name=rose, sex=女, age=18]
    Student [id=3, name=tom, sex=男, age=21]
    Student [id=4, name=alice, sex=女, age=20]


    多对多

    1.创建表

    CREATE TABLE `t_student` (
      `id` int(11) NOT NULL AUTO_INCREMENT,
      `student_name` varchar(20) DEFAULT NULL,
      PRIMARY KEY (`id`)
    )
    INSERT INTO t_student (student_name)VALUES ('小米');
    INSERT INTO t_student (student_name)VALUES ('小王');
    INSERT INTO t_student (student_name)VALUES ('小李');
    
    CREATE TABLE `t_courses` (
      `id` int(11) NOT NULL AUTO_INCREMENT,
      `courses_name` varchar(20) DEFAULT NULL,
      PRIMARY KEY (`id`)
    )
    INSERT INTO t_courses (courses_name)VALUES ('java');
    INSERT INTO t_courses (courses_name)VALUES ('c#');
    INSERT INTO t_courses (courses_name)VALUES ('php');
    INSERT INTO t_courses (courses_name)VALUES ('vb');
    INSERT INTO t_courses (courses_name)VALUES ('javascript');
    
    CREATE TABLE `t_stu_cou` (
      `id` int(11) NOT NULL AUTO_INCREMENT,
      `stu_id` int(11) DEFAULT NULL,
      `cou_id` int(11) DEFAULT NULL,
      PRIMARY KEY (`id`),
      KEY `stu_id` (`stu_id`),
      KEY `cou_id` (`cou_id`),
      CONSTRAINT `t_stu_cou_ibfk_1` FOREIGN KEY (`stu_id`) REFERENCES `t_student` (`id`),
      CONSTRAINT `t_stu_cou_ibfk_2` FOREIGN KEY (`cou_id`) REFERENCES `t_courses` (`id`)
    )  
    
    INSERT INTO t_stu_cou (stu_id,cou_id)VALUES (1,1);
    INSERT INTO t_stu_cou (stu_id,cou_id)VALUES (1,2);
    INSERT INTO t_stu_cou (stu_id,cou_id)VALUES (1,3);
    
    INSERT INTO t_stu_cou (stu_id,cou_id)VALUES (2,2);
    INSERT INTO t_stu_cou (stu_id,cou_id)VALUES (2,3);
    INSERT INTO t_stu_cou (stu_id,cou_id)VALUES (2,4);

    2.创建model
    CoursesBean.java

    package org.fkit.domain;
    import java.io.Serializable;
    import java.util.List;
    public class CoursesBean implements Serializable{
        private static final long serialVersionUID = 1L;
        private Integer id;
        private String name;
       // 使用 List<StudentBean>集合,是说明学习这门课程的所有学生
        private List<StudentBean> student;
        public CoursesBean() {
            super();
        }
        public CoursesBean(Integer id, String name, List<StudentBean> student) {
            super();
            this.id = id;
            this.name = name;
            this.student = student;
        }
        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<StudentBean> getStudent() {
            return student;
        }
        public void setStudent(List<StudentBean> student) {
            this.student = student;
        }
        @Override
        public String toString() {
            return "CoursesBean [id=" + id + ", name=" + name + ", student="
                    + student + "]";
        }
    }

    StudentBean.java

    package org.fkit.domain;
    import java.io.Serializable;
    import java.util.List;
    public class StudentBean implements Serializable{
        private static final long serialVersionUID = 1L;
        private Integer id;
        private String name;    
        private List<CoursesBean> courses;
        public StudentBean() {
            super();
        }
        public StudentBean(Integer id, String name, List<CoursesBean> courses) {
            super();
            this.id = id;
            this.name = name;
            this.courses = courses;
        }
        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<CoursesBean> getCourses() {
            return courses;
        }
        public void setCourses(List<CoursesBean> courses) {
            this.courses = courses;
        }
        @Override
        public String toString() {
            return "StudentBean [id=" + id + ", name=" + name + ", courses="
                    + courses + "]";
        }
    }

    3.mapper
    CoursesMapper.java

    package org.fkit.mapper;
    import org.apache.ibatis.annotations.Result;
    import org.apache.ibatis.annotations.Results;
    import org.apache.ibatis.annotations.Select;
    import org.apache.ibatis.mapping.FetchType;
    import org.fkit.domain.CoursesBean;
    import org.fkit.domain.StudentBean;
    
    import java.util.List;
    
    import org.apache.ibatis.annotations.Many;
    
    /**
     * @author Administrator
     *
     */
    public interface CoursesMapper {
        
        /**
         * 根据id查询课程
         * @param id
         * @return
         */
        @Select("select * from t_courses where id=#{id}")
        @Results({
            @Result(id=true,column="id",property="id"),
            @Result(column="courses_name",property="name"),
        })
        public CoursesBean findCouById(int id);
        
        /**
         * 根据学生id查询学生的所有课程
         * @param id
         * @return
         */
        @Select("select * from t_courses where id in (select cou_id from t_stu_cou where stu_id = #{id})")
        @Results({
            @Result(id=true,column="id",property="id"),
            @Result(column="courses_name",property="name"),
        })
        public List<CoursesBean> findCoursesByStudent(int id);
    
        /**
         * 要求查课时,将选课的学生一并查出
         * @param id
         * @return
         */
        @Select("select * from t_courses where id=#{id}")
        @Results({
            @Result(id=true,column="id",property="id"),
            @Result(column="courses_name",property="name"),
            @Result(column="id",property="student",
            many=@Many(select="org.fkit.mapper.StudentMapper.findStudentByCourses",fetchType=FetchType.LAZY))
        })
        public CoursesBean findCouAndStu(int id);
    
    
    }

    StudentMapper.java

    package org.fkit.mapper;
    import java.util.List;
    import org.apache.ibatis.annotations.Many;
    import org.apache.ibatis.annotations.Result;
    import org.apache.ibatis.annotations.Results;
    import org.apache.ibatis.annotations.Select;
    import org.apache.ibatis.mapping.FetchType;
    import org.fkit.domain.CoursesBean;
    import org.fkit.domain.StudentBean;
    
    public interface StudentMapper {
        /**
         * 根据id值查询学生信息
         * @param id
         * @return
         */
        @Select("select * from t_student where id = #{id}")
        @Results({
            @Result(id=true,column="id",property="id"),
            @Result(column="student_name",property="name")
        })
        public StudentBean findStuById(int id);
    
        
        /**
         * 根据课程id查询课程的所有学生
         * @param id
         * @return
         */
        @Select(" select * from t_student where id in (select stu_id from t_stu_cou where cou_id=#{id})")
        @Results({
            @Result(id=true,column="id",property="id"),
            @Result(column="student_name",property="name")
        })
        public List<StudentBean> findStudentByCourses(int id);
        /**
         * 要求查询学生时,将学生选择的课程查出
         * @param id
         * @return
         */
        @Select("select * from t_student where id=#{id}")
        @Results({
            @Result(id=true,column="id",property="id"),
            @Result(column="student_name",property="name"),
            @Result(column="id",property="courses",
            many=@Many(select="org.fkit.mapper.CoursesMapper.findCoursesByStudent",fetchType=FetchType.LAZY))
        })
        public StudentBean findStuAndCou(int id);
    
    }

    4.mybatis-config.xml
    db.properties

    driver=com.mysql.jdbc.Driver
    url=jdbc:mysql://127.0.0.1:3306/mybatis
    username=root
    password=123456

    log4j.properties

    # Global logging configuration
    log4j.rootLogger=ERROR, stdout
    # MyBatis logging configuration...
    log4j.logger.org.fkit.mapper.PersonMapper=DEBUG
    log4j.logger.org.fkit.mapper.CardMapper=DEBUG
    # Console output...
    log4j.appender.stdout=org.apache.log4j.ConsoleAppender
    log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
    log4j.appender.stdout.layout.ConversionPattern=%5p [%t] - %m%n

    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">
    <!-- XML 配置文件包含对 MyBatis 系统的核心设置 -->
    <configuration>
        <properties resource="db.properties" />
        <!-- 指定 MyBatis 所用日志的具体实现 -->
        <settings>
            <setting name="logImpl" value="LOG4J" />
        </settings>
        <!-- 为JAVA Bean起类别名 -->
        <typeAliases>
            <package name="org.fkit.domain" />
        </typeAliases>
        <environments default="mysql">
            <!-- 环境配置,即连接的数据库。 -->
            <environment id="mysql">
                <!-- 指定事务管理类型,type="JDBC"指直接简单使用了JDBC的提交和回滚设置 -->
                <transactionManager type="JDBC" />
                <!-- dataSource指数据源配置,POOLED是JDBC连接对象的数据源连接池的实现。 -->
                <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告诉了MyBatis去哪里找持久化类的映射文件 -->
        <mappers>
            <mapper class="org.fkit.mapper.CoursesMapper" />
            <mapper class="org.fkit.mapper.StudentMapper" />
        </mappers>
    </configuration>

    5.测试
    ManyToManyTest.java

    package org.fkit.test;
    import java.io.IOException;
    import java.io.InputStream;
    import java.util.List;
    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.fkit.domain.CoursesBean;
    import org.fkit.domain.StudentBean;
    import org.fkit.mapper.CoursesMapper;
    import org.fkit.mapper.StudentMapper;
    public class ManyToManyTest {
        public static void main(String[] args) throws IOException {
            // 读取mybatis-config.xml文件
            InputStream inputStream = Resources.getResourceAsStream("mybatis-config.xml");
            // 初始化mybatis,创建SqlSessionFactory类的实例
            SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder()
                    .build(inputStream);
            // 创建Session实例
            SqlSession session = sqlSessionFactory.openSession();
            ManyToManyTest t = new ManyToManyTest();
            // 根据用户id查询用户,测试一对多
            //t.testSelectCoursesById(session);
            // 根据订单id查询订单,测试多对多
            t.testSelectStudentById(session);
            
            // 提交事务
            session.commit();
            // 关闭Session
            session.close();
    
        }
        public void testSelectStudentById(SqlSession session){
            // 获得UserMapper接口的代理对象
            StudentMapper sm = session.getMapper(StudentMapper.class);
            // 调用selectUserById方法
            StudentBean stu = sm.findStuAndCou(2);
            System.out.println(stu);
            // 查看查询到的user对象信息
            System.out.println(stu.getId() + " " + stu.getName());
            // 查看user对象关联的订单信息
            List<CoursesBean> CoursesList = stu.getCourses();
            for(CoursesBean item : CoursesList){
                System.out.println(item);
            }
        }
        // 测试多对多,查询订单Order(多)的时候级联查询订单的商品Article(多)  
        public void testSelectCoursesById(SqlSession session){
            // 获得OrderMapper接口的代理对象
            CoursesMapper cm = session.getMapper(CoursesMapper.class);
            // 调用selectOrderById方法
            CoursesBean course = cm.findCouAndStu(2);
            System.out.println(course);
            // 查看查询到的order对象信息
            System.out.println(course.getId() + " " + course.getName());
            // 查看order对象关联的商品信息
            List<StudentBean> studentlist = course.getStudent();
            for(StudentBean stu : studentlist){
                System.out.println(stu);
            }
        }
    }

    你最喜欢的代码:一对多

                          一对多

                          多对多

  • 相关阅读:
    关于利用注射点判断数据库web是否分离
    springmvc中使用MockMvc测试controller
    springmvc中使用MockMvc测试controller
    小哥哥教你100%安装Win10专业版永久激活版(全网独一无二)
    Python爬虫入门教程 62-100 30岁了,想找点文献提高自己,还被反爬了,Python搞起,反爬第2篇
    服务器Servlet返回信息在浏览器无法显示
    nacos 系列
    如何用产品经理的思维设计移动报表
    【讲师专访】Oracle ACE 总监侯圣文:不懂开发的运维终将被淘汰
    我非要捅穿这 Neutron(四)Open vSwitch in Neutron
  • 原文地址:https://www.cnblogs.com/itmu89/p/6625880.html
Copyright © 2020-2023  润新知