mybatis一对多,和多对一的项目搭建

第一步:新建数据库表和导入依赖

1.新建student,classRoom,teacher表

2.导入依赖

<dependencies>
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>5.1.6</version>
        </dependency>
        <dependency>
            <groupId>org.mybatis</groupId>
            <artifactId>mybatis</artifactId>
            <version>3.5.5</version>
        </dependency>
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>4.12</version>
        </dependency>
        <dependency>
            <groupId>log4j</groupId>
            <artifactId>log4j</artifactId>
            <version>1.2.17</version>
        </dependency>
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <version>1.18.12</version>
        </dependency>
    </dependencies>

  //可以把resources 和java 文件夹下的xml ,properties 文件打包到项目
    <build>
        <resources>
            <resource>
                <directory>src/main/resources</directory>
                <includes>
                    <include>**/*.properties</include>
                    <include>**/*.xml</include>
                </includes>
                <filtering>true</filtering>
            </resource>
            <resource>
                <!--为了在打包项目时,把java目录下的xml 打包进去 -->
                <directory>src/main/java</directory>
                <includes>
                    <include>**/*.properties</include>
                    <include>**/*.xml</include>
                </includes>
                <filtering>true</filtering>
            </resource>
        </resources>
    </build>

 

第二步:新建pojo实体类,student,classRoom,teacher

//student 学生类
package pojo;

import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;

import java.io.Serializable;

@Data
@AllArgsConstructor
@NoArgsConstructor
public class Student implements Serializable {
    private Integer id;
    private String name;
    private Integer tid;
//  在这里做多对一,就是多个学生对应一个老师
    private Teacher teacher;
}

//老师类
package pojo;

import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;

import java.util.List;

@Data
@AllArgsConstructor
@NoArgsConstructor
public class Teacher {
    private Integer id;
    private String name;
    private String sex;
    //一个老师教很多个班,这是一对多的关联
    private List<ClassRoom> classRoomList;
}

//教室类
package pojo;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
@Data
@AllArgsConstructor
@NoArgsConstructor
public class ClassRoom {
    private Integer id;
    private String roomNum;
    private Integer tid;

}

 

第三步:新建mapper数据接口类,和对应xml文件

//student类的mapper接口
package mapper;
import org.apache.ibatis.annotations.Param;
import org.apache.ibatis.annotations.Select;
import pojo.Student;

import java.security.PublicKey;
import java.util.List;
public interface StudentMapper {
//    @Select("select * from student")
    public List<Student> getStudentList();
    @Select("select * from student where id=#{id}")
    public Student getStudent(@Param("id") Integer id);
}

//studentMapper对应的mapperXml文件
<?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="mapper.StudentMapper">
    <select id="getStudentList" resultMap="studentTeacher">
        select s.id sid,s.name sname,t.name tname,t.sex tsex from student s,teacher t where s.tid=t.id
    </select>
    <resultMap id="studentTeacher" type="student">
        <result column="sid" property="id"></result>
        <result column="sname" property="name"></result>
<!--    这里学生和老师是多对一的关系,这里用association    -->
        <association property="teacher" javaType="teacher">
            <result column="tname" property="name"></result>
            <result column="tsex" property="sex"></result>
        </association>
    </resultMap>

</mapper>


//teacher类的mapper接口
package mapper;
import pojo.Teacher;

import java.util.List;

public interface TeacherMapper {
    public List<Teacher> getTeacherList();
}

//teacherMapper接口对应的mapperXml文件
<?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="mapper.TeacherMapper">
    <select id="getTeacherList" resultMap="teacherClassRoom">
        select t.id tid,t.name tname,c.room_num croomNum  from teacher t LEFT JOIN classRoom c  on  t.id=c.tid
    </select>
    <resultMap id="teacherClassRoom" type="teacher">
        <result column="tid" property="id"></result>
        <result column="tname" property="name"></result>
<!--    这里是老师和教室一对多的关系,所以这里用 collection  -->
        <collection property="classRoomList" ofType="classRoom">
            <result column="croomNum" property="roomNum"></result>
        </collection>
    </resultMap>
</mapper>

 

第四步:新建mybaits 工具类

package myUntil;

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 MybatisUntil {
    private static SqlSessionFactory sqlSessionFactory;

    static {

        try {
            //使用mybatis 第一步,获取sqlSessionFactory对象,这个对象时生成sqlSession的
            String resource= "mybatis-config.xml";
            InputStream inputStream= Resources.getResourceAsStream(resource);
            sqlSessionFactory=new SqlSessionFactoryBuilder().build(inputStream);
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
    //有了sqlSessionFactory,我们既可以用sqlSessionFactory来open 一个个的sqlSession
    //sqlSession是可以操作数据库,他包含了所有的sql 语句操作
    public static SqlSession getSqlSession(){
        return  sqlSessionFactory.openSession();
    }
}

 

第五步:配置mybatis核心配置文件

<?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>
<!--        <setting name="logImpl" value="STDOUT_LOGGING"/>-->
        <setting name="logImpl" value="log4j"/>
<!--    开启驼峰命名    -->
        <setting name="mapUnderscoreToCamelCase" value="true"/>
    </settings>
<!--    <properties resource="db.properties"/>-->
    <!--别名    -->
    <typeAliases>
<!--        &lt;!&ndash;设置User类的别名为user        &ndash;&gt;-->
<!--        <typeAlias type="pojo.User" alias="user"></typeAlias>-->
<!--        设置pojo包下的所有实体类的别名为类名的首字母小写  -->
        <package name="pojo"/>
    </typeAliases>

    <environments default="develoment">
        <environment id="develoment">
            <transactionManager type="JDBC"></transactionManager>
            <dataSource type="POOLED">
                <property name="driver" value="com.mysql.jdbc.Driver"/>
                <property name="url" value="jdbc:mysql://47.112.227.192:3306/spring?useUnicode=true&amp;characterEncoding=utf-8&amp;useSSL=false&amp;serverTimezone=GMT%2B8"/>
                <property name="username" value="root"/>
                <property name="password" value="123456"/>
            </dataSource>
        </environment>
    </environments>

    <!--每一个mapper 都要在mybatis 的核心配置文件中注册    -->
    <mappers >
<!--        用resource映射的话就用全路径-->
        <mapper resource="mapper/studentMapper.xml"></mapper>
<!--        <mapper resource="mapper/studentMapper.xml"></mapper>-->
<!--    用class 映射的话,要用接口的类的全限定类名    -->
<!--        <mapper class="mapper.StudentMapper"></mapper>-->
        <mapper resource="mapper/teacherMapper.xml"></mapper>
    </mappers>
</configuration>

 

第六步:配置日志文件,log4j.properties

### 设置###
log4j.rootLogger = debug,console,file

### 输出信息到控制抬 ###
log4j.appender.console = org.apache.log4j.ConsoleAppender
log4j.appender.console.Target = System.out
log4j.appender.console.Threshold = DEBUG 
log4j.appender.console.layout = org.apache.log4j.PatternLayout
log4j.appender.console.layout.ConversionPattern = [%-5p] %d{yyyy-MM-dd HH:mm:ss,SSS} method:%l%n%m%n

### 输出DEBUG 级别以上的日志到=E://logs/error.log ###
log4j.appender.file = org.apache.log4j.DailyRollingFileAppender
log4j.appender.file.File = ./logs/log.log
log4j.appender.file.Append = true
log4j.appender.file.MaxFilesSize=10mb
log4j.appender.file.Threshold = DEBUG 
log4j.appender.file.layout = org.apache.log4j.PatternLayout
log4j.appender.file.layout.ConversionPattern = %-d{yyyy-MM-dd HH:mm:ss}  [ %t:%r ] - [ %p ]  %m%n

### 日志输出级别 ###
log4j.logger.org.mybatis =debug
log4j.logger.java.sql =debug
log4j.logger.java.sql.Statement =debug
log4j.logger.java.sql.ResultSet =debug
log4j.logger.java.sql.Preparedstatement =debug

 

第七步:测试

package test;

import lombok.ToString;
import mapper.StudentMapper;
import mapper.TeacherMapper;
import myUntil.MybatisUntil;
import org.apache.ibatis.session.SqlSession;
import org.junit.Test;
import pojo.Student;
import pojo.Teacher;

import java.util.List;

//测试带注解的接口
public class MyAnoTest {
//  获取全部学生
    @Test
    public void getStudentList(){
        SqlSession sqlSession= MybatisUntil.getSqlSession();
        StudentMapper studentMapper= sqlSession.getMapper(StudentMapper.class);

        List<Student> studentList = studentMapper.getStudentList();

            System.out.println("studentList:"+studentList);

    }

//    获取单个学生
    @Test
    public void getStudent(){
        SqlSession sqlSession= MybatisUntil.getSqlSession();
        StudentMapper studentMapper= sqlSession.getMapper(StudentMapper.class);

        Student student = studentMapper.getStudent(1);
        System.out.println("student:"+student);


    }

//    获取全部老师
    @Test
    public void getTeacher(){
        SqlSession sqlSession= MybatisUntil.getSqlSession();
        TeacherMapper teacherMapper = sqlSession.getMapper(TeacherMapper.class);

        List<Teacher> teacherList = teacherMapper.getTeacherList();
        System.out.println("teacherList:"+teacherList);

        sqlSession.close();
    }


}

 

posted @ 2020-09-08 16:07  呆马and鸽子  阅读(165)  评论(0编辑  收藏  举报