lovebet体育官网JavaEE——Mybatis(8)–关联查询及用resultMap和association封装规则之概念关联对象。mybatis学习笔记(一)

1.创造一个之所以来波及的阐明lovebet体育官网 1

参照书籍

原著:Java Persistence with MyBatis 3. 作者:K.Siva Prasad Reddy.
译著:Java持久化之Mybatis3. 作者:娄娈.

 

mybatisDemo:基于myeclipse10,mysql,jdk1.7,mybatis3.2.2

2.创立外键约束lovebet体育官网 2

品类组织

lovebet体育官网 3

品类组织

3.查询

程序源码

v1.0

SELECT s.id id, s.name name, s.sex sex, s.age age, s.grade_id grade_id, g.id gid,
 g.grade_name grade_name FROM student s, grade g WHERE s.grade_id=g.id AND s.name='skye' 

步骤:

  • 新建表 STUDENTS,插入样本数
  • 新建一个 Java 项目,将 MyBatis-3.2.2.jar 添加到 classpath 中
  • 新建建筑 MyBatisSqlSessionFactory 单例模式类似
  • 新建映射器 StudentMapper 接口和 StudentService 类
  • 新建一个 JUnit 测试类来测试 StudentService

  在web中

1.新建表 STUDENTS,插入样本数

下以下 SQL 脚论为 MySQL 数据库中创造 STUDENTS 表插入样本数:

CREATE TABLE STUDENTS
(
  stud_id int(11) NOT NULL AUTO_INCREMENT,
  name varchar(50) NOT NULL,
  email varchar(50) NOT NULL,
  dob date DEFAULT NULL,
  PRIMARY KEY (stud_id)
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=latin1;
/*Sample Data for the students table */
  insert into students(stud_id,name,email,dob)
 values (1,'Student1','student1@gmail.com','1983-06-25');
  insert into students(stud_id,name,email,dob)
 values (2,'Student2','student2@gmail.com','1983-06-25');

StudentMapper.class

2.新建一个 Java Maven项目,修改pom.xml文件为:

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <groupId>look</groupId>
    <artifactId>mybatisDemo</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <dependencies>
        <dependency>
            <groupId>org.mybatis</groupId>
            <artifactId>mybatis</artifactId>
            <version>3.2.2</version>
        </dependency>
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>5.1.22</version>
            <scope>runtime</scope>
        </dependency>
        <dependency>
            <groupId>org.slf4j</groupId>
            <artifactId>slf4j-api</artifactId>
            <version>1.7.5</version>
        </dependency>
        <dependency>
            <groupId>org.slf4j</groupId>
            <artifactId>slf4j-log4j12</artifactId>
            <version>1.7.5</version>
            <scope>runtime</scope>
        </dependency>
        <dependency>
            <groupId>log4j</groupId>
            <artifactId>log4j</artifactId>
            <version>1.2.17</version>
            <scope>runtime</scope>
        </dependency>
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>4.11</version>
            <scope>test</scope>
        </dependency>
    </dependencies>
    <build>
        <plugins>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-compiler-plugin</artifactId>
                <configuration>
                    <source>1.7</source>
                    <target>1.7</target>
                </configuration>
            </plugin>
        </plugins>
    </build>
</project>
//利用关联查询的方法从数据库获取学生的信息以及班级信息
    public Students getStuAndGrade(Integer id);

3. 新建 log4j.properties 文件,添加到 classpath 中

log4j.rootLogger=DEBUG, stdout
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern=%d [%-5p] %c - %m%n

  StudentMapper.xml

4.新建 mybatis-config.xml 和映射器 StudentMapper.xml 配置文件

    1. 始建 MyBatis 的要紧布局文件
      mybatis-config.xml,其中囊括数据库连接信息,类型别名等等,然后拿其加以到
      classpath 中;

<?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>
    <typeAliases>
        <typeAlias alias="Student" type="com.look.domain.Student" />
    </typeAliases>
    <environments default="development">
        <environment id="development">
            <transactionManager type="JDBC" />
            <dataSource type="POOLED">
                <property name="driver" value="com.mysql.jdbc.Driver" />
                <property name="url" value="jdbc:mysql://localhost:3306/test" />
                <property name="username" value="root" />
                <property name="password" value="123456" />
            </dataSource>
        </environment>
    </environments>
    <mappers>
        <mapper resource="com/look/mapper/StudentMapper.xml" />
    </mappers>
</configuration>
    1. 创办 SQL 映射器 XML 配置文件 StudentMapper.xml 并且将它在
      com.look.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.look.mapper.StudentMapper">
    <resultMap type="Student" id="StudentResult">
        <id property="studId" column="stud_id" />
        <result property="name" column="name" />
        <result property="email" column="email" />
        <result property="dob" column="dob" />
    </resultMap>
    <select id="findAllStudents" resultMap="StudentResult">
        SELECT * FROM STUDENTS
    </select>
    <select id="findStudentById" parameterType="int" resultType="Student">
        SELECT STUD_ID AS STUDID, NAME, EMAIL, DOB
        FROM STUDENTS WHERE
        STUD_ID=#{Id}
    </select>
    <insert id="insertStudent" parameterType="Student">
        INSERT INTO
        STUDENTS(STUD_ID,NAME,EMAIL,DOB)
        VALUES(#{studId
        },#{name},#{email},#{dob})
    </insert>
</mapper>

上述的 StudentMapper,xml 文件包含的投的 SQL 语句可以通过 ID
加上名空间调用。

<?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.dao.StudentMapperPlus">

    <!--public Students getStuAndGrade(Integer id);-->
    <resultMap type="com.person.Students" id="myStu">
        <id column="id" property="id"/>
        <result column="name" property="name"/>
        <result column="sex" property="sex"/>
        <result column="age" property="age"/>
        <result column="gid" property="grade.id"/>
        <result column="grade_name" property="grade.gradeName"/>
    </resultMap>
    <select id="getStuAndGrade" resultMap="myStu">
        SELECT s.id id, s.name name, s.sex sex, s.age age,
         s.grade_id grade_id, g.id gid, g.grade_name grade_name
         FROM student s, grade g WHERE s.grade_id=g.id AND s.id=#{id}
    </select>

</mapper>

5.新建 MyBatisSqlSessionFactory 单例类

新建 MyBatisSqlSessionFactory.java 类文件,实例化它,使其所有一个
SqlSessionFactory 单例对象:

package com.look.util;

import java.io.*;
import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.*;

public class MyBatisSqlSessionFactory {
    private static SqlSessionFactory sqlSessionFactory;

    public static SqlSessionFactory getSqlSessionFactory() {
        if (sqlSessionFactory == null) {
            InputStream inputStream;
            try {
                inputStream = Resources
                        .getResourceAsStream("mybatis-config.xml");
                sqlSessionFactory = new SqlSessionFactoryBuilder()
                        .build(inputStream);
            } catch (IOException e) {
                throw new RuntimeException(e.getCause());
            }
        }
        return sqlSessionFactory;
    }

    public static SqlSession openSession() {
        return getSqlSessionFactory().openSession();
    }
}

上述的代码段被,我们创建了一个 SqlSessionFactory
对象,我们拿动用其来取 SqlSession 对象与推行映射的SQL 语句。

  Test

6.新建 StudentMapper 接口和 StudentService 类

开创一个 StudentMapper 接口,其定义的方法名和当 Mapper XML
配置文件定义之 SQL 映射语句名称相同;
以创造一个 StudentService.java 类,包含了一部分业务操作的贯彻。

  • 首先, 创建 JavaBean Student.java

  • 始建映射器 Mapper 接口 StudentMapper.java 其法签名与
    StudentMapper.xml 中定义之 SQL 映射定义名相同

  • 而今创办 StudentService.java 实现对表 STUDENTS 的数据库操作

  • 乃吧足以通过非通过 Mapper 接口执行映射的 SQL 语句。

Student student = (Student)sqlSession.
selectOne("com.look.mapper.StudentMapper.findStudentById",
studId);

然,使用 Mapper 接口是超级实践,我们可因种类安全之计调用映射的 SQL
语句。

@Test
    public void test5() throws IOException {
        String resource ="conf/com/mybatis-config.xml";
        InputStream inputStream = Resources.getResourceAsStream(resource);

        SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
        SqlSession openSession = sqlSessionFactory.openSession();

        try{
            StudentMapperPlus mapper = openSession.getMapper( StudentMapperPlus.class );

            Students students = mapper.getStuAndGrade(1);
            System.out.println(students);
        }finally{
            openSession.close();
        }
    }

7.新建一个 JUnit 测试类来测试 StudentService27

新建一个 JUnit 测试类测试 StudentSerivce.java 中定义之方式

   使用association的StudentMapper.xml    其余不更换

8. 它们是怎么工作的

第一,我们配备了 MyBatis 最要的布文件-mybatis-config.xml,里面富含了
JDBC 连接参数;配置了映射器Mapper XML 配置文件文件,里面含了 SQL
语句的照。

咱俩以 mybatis-config.xml 内的信创建了 SqlSessionFactory
对象。每个数据库环境应当就一个
SqlSessionFactory 对象实例,所以我们应用了单例模式只开创一个
SqlSessionFactory 实例。

咱们创建了一个映射器 Mapper 接口-StudentMapper,其定义之主意签名与于
StudentMapper.xml 中定义的一心一样(即映射器 Mapper 接口中之章程名和
StudentMapper.xml 中的 id 的价相同)。注意 StudentMapper.xml 中namespace
的价值为设置成 com.mybatis3.mappers.StudentMapper,是 StudentMapper
接口的毕限定名。这要是我们得以以接口来调用映射的 SQL 语句。

以 StudentService.java 中,我们以各级一个方式吃开创了一个新的
SqlSession,并于章程效果就后关
SqlSession。每一个线程应该发生她自己之 SqlSession 实例。 SqlSession
对象实例不是线程安全的,并且不为共享。所以 SqlSession
的作用域最好就是其所当点子的作用域。从 Web 应用程序角度达看,SqlSession
应该存在吃 request 级别作用域上。

<!--
        使用association定义关联的单个对象的封装规则;
     -->
    <resultMap type="com.person.Students" id="myStu1">
        <id column="id" property="id"/>
        <result column="name" property="name"/>
        <result column="sex" property="sex"/>
        <result column="age" property="age"/>

        <!--  association可以指定联合的javaBean对象
        property="grade":指定哪个属性是联合的对象
        javaType:指定这个属性对象的类型[不能省略]
        -->
        <association property="grade" javaType="com.person.Grade">
            <id column="gid" property="id"/>
            <result column="grade_name" property="gradeName"/>
        </association>
    </resultMap>
    <select id="getStuAndGrade" resultMap="myStu1">
        SELECT s.id id, s.name name, s.sex sex, s.age age,
         s.grade_id grade_id, g.id gid, g.grade_name grade_name
         FROM student s, grade g WHERE s.grade_id=g.id AND s.id=#{id}
    </select>