mybatis简介

mybatis简介

myBatis是一个持久层框架,主要作用就是在java中操作数据库,其实就是在jdbc的基础上进行了封装,使用mybatis之后,开发者不用再花费精力去处理诸如注册驱动、创建Connection、配置Statement等繁琐过程。与之前学习的spring mvc要运行在web容器不同,mybatis不需要web容器,在c/s架构和b/s架构下均可运行。早期叫做iBatis,后来改名为myBatis,官网:http://www.mybatis.org/mybatis-3/
在官网上有中文版的介绍和文档,mybatis同时支持xml和注解,这里xml用的多一些。

第一个mybatis程序

这里将试用myBatis将一个Student对象中的数据存储到数据库中。

1.创建一个web的maven项目,添加mybatis的依赖jar包和mysql的数据库驱动,为了查看具体的sql信息,需要添加log4j:

<dependency>
    <groupId>org.mybatis</groupId>
    <artifactId>mybatis</artifactId>
    <version>3.4.6</version>
</dependency>
<dependency>
    <groupId>mysql</groupId>
    <artifactId>mysql-connector-java</artifactId>
    <version>5.1.46</version>
</dependency>
<dependency>
    <groupId>log4j</groupId>
    <artifactId>log4j</artifactId>
    <version>1.2.17</version>
</dependency>

除了mybatis的jar包之外,为了方便调试,这里要使用junit,其相关依赖jar包在你使用骨架创建maven项目的时候会自动加入的。
另外还需要在pom.xml文件中的build标签下添加:

  <resources>
        <resource>
            <directory>src/main/java</directory>
            <includes>
                <include>**/*.xml</include>
            </includes>
        </resource>
    </resources>

因为后面我们要在dao包下编写xml文件,如果不添加上面内容的话,maven是不会将xml文件发布到编译后的classes目录下,这样就会导致mybatis到不到该文件。

2.创建一个Student实体类:

package com.monkey1024.bean;

public class Student {

    private int id;

    private String name;

    private int age;

    private double score;

    //省略getter和setter
}

3.创建数据库表
在数据库中创建一张表t_student,表中的字段要与上面Student类中的属性名一致(不一致的话需要额外的配置,目前先写成一致的),建表语句,主键id自增:

CREATE TABLE `learnmybatis`.`t_student` (
  `id` INT NOT NULL AUTO_INCREMENT,
  `name` VARCHAR(20) NULL,
  `age` INT NULL,
  `score` DOUBLE NULL,
  PRIMARY KEY (`id`));

4.定义一个dao的接口:

package com.monkey1024.dao;


import com.monkey1024.bean.Student;

public interface StudentDao {

    void insertStudent(Student student);

}

5.添加映射文件
映射文件,一般称之为mapper,主要是在里面编写SQL语句,里面具体配置,后面会详细讲解。暂时先照着下面的写,dtd约束可以直接拷贝下面的内容。mapper的文件名随意,一般会跟dao接口放在同一个包下,这里映射文件名称定为StudentMapper.xml

<?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="monkey1024">
    <!--parameterType可省略-->
    <insert id="insertStudent" parameterType="com.monkey1024.bean.Student">
        INSERT INTO t_student(name,age,score) VALUES (#{name},#{age},#{score})
    </insert>
</mapper>

mybatis会检测到student类型的对象,所以parameterType一般不用指定,values后面的#{}中的内容是Student的属性名。

6.添加mybatis的主配置文件
主配置文件的名称同样也是可以随意命名的,这里就将其命名为mybatis.xml,将这个配置文件放到maven项目中的resources目录下。

<?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="development">
        <environment id="development">
            <transactionManager type="JDBC"/>
            <dataSource type="POOLED">
                <property name="driver" value="com.mysql.jdbc.Driver"/>
                <property name="url" value="jdbc:mysql://127.0.0.1:3306/learnmybatis?useSSL=false"/>
                <property name="username" value="root"/>
                <property name="password" value="monkey1024"/>
            </dataSource>
        </environment>
    </environments>
    <mappers>
        <!--注册映射文件-->
        <mapper resource="com/monkey1024/dao/StudentMapper.xml"/>
    </mappers>
</configuration>

7.查看日志
mybatis支持下面的日志处理:

  • SLF4J
  • Apache Commons Logging
  • Log4j 2
  • Log4j
  • JDK logging

在其官方文档中使用了Log4j作为的示例,因此这里我们也使用log4j进行处理。在resources目录下创建log4j.properties文件,里面加上下面内容:

log4j.rootLogger=trace,console

#控制台附加器
log4j.appender.console = org.apache.log4j.ConsoleAppender
log4j.appender.console.Target = System.out
log4j.appender.console.layout = org.apache.log4j.PatternLayout
log4j.appender.console.layout.ConversionPattern= [%-5p][%d{yyyy-MM-dd HH:mm:ss}]%m%n

上面的内容使用了rootLogger作为日志对象,此时可能会输出太多的日志信息,我们可以通过修改配置只查看某个namespace下的日志:

##查看monkey1024的namespace下的sql语句
log4j.logger.monkey1024=debug,console

#控制台附加器
log4j.appender.console = org.apache.log4j.ConsoleAppender
log4j.appender.console.Target = System.out
log4j.appender.console.layout = org.apache.log4j.PatternLayout
log4j.appender.console.layout.ConversionPattern= [%-5p][%d{yyyy-MM-dd HH:mm:ss}]%m%n

8.创建接口的实现类
创建StudentDao接口的实现类,其中用到的一些类:

  • SqlSessionFactoryBuilder

    作用就是创建SqlSessionFactory,在创建SqlSessionFactory之后就不再需要SqlSessionFactoryBuilder了。

  • SqlSessionFactory

    在一个应用中只创建一个SqlSessionFactory即可,即最好保证其是单例的,通过SqlSessionFactory我们可以创建出SqlSession。

  • SqlSession

    SqlSession是线程不安全的,在后面跟spring进行集成之后,可以创建出线程安全的SqlSession对象。如果单独使用的话,被忘了关闭SqlSession对象。

    package com.monkey1024.dao.impl;
    
    import com.monkey1024.bean.Student;
    import com.monkey1024.dao.StudentDao;
    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 StudentDaoImpl implements StudentDao {
    
        private SqlSession sqlSession;
    
        @Override
        public void insertStudent(Student student) {
            try {
                //读取主配置文件
                InputStream input = Resources.getResourceAsStream("mybatis.xml");
                //创建SqlSessionFactory对象
                SqlSessionFactory sessionFactory = new SqlSessionFactoryBuilder().build(input);
                //创建SqlSession对象
                sqlSession = sessionFactory.openSession();
                //新增数据操作
                sqlSession.insert("insertStudent", student);
                //提交SqlSession
                sqlSession.commit();
    
            } catch (IOException e) {
                e.printStackTrace();
            } finally {
                if (sqlSession != null){
                    sqlSession.close();
                }
            }
        }
    }
    

9.创建测试类,这里使用了junit:

package com.monkey1024.test;

import com.monkey1024.bean.Student;
import com.monkey1024.dao.StudentDao;
import com.monkey1024.dao.impl.StudentDaoImpl;
import org.junit.Test;

public class StudentTest01 {

    @Test
    public void insertStudent(){
        StudentDao studentDao = new StudentDaoImpl();
        Student student = new Student("刘德华", 52, 98.50);

        studentDao.insertStudent(student);
    }
}

顺利执行完成后,可以在数据库中找到新添加的那条数据。