美文网首页
mybatis学习笔记(一)

mybatis学习笔记(一)

作者: LOOK_LOOK | 来源:发表于2017-06-08 10:32 被阅读59次

    参考书籍

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

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

    项目结构

    项目结构

    程序源码

    v1.0

    步骤:

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

    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');
    

    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>
    

    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
    

    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 加上名空间调用。

    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 语句。

    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 语句。

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

    新建一个 JUnit 测试类测试 StudentSerivce.java 中定义的方法

    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 级别作用域上。

    相关文章

      网友评论

          本文标题:mybatis学习笔记(一)

          本文链接:https://www.haomeiwen.com/subject/rrtvxxtx.html