改进第一个MyBatis程序

代码重构

在第一个mybatis程序中,获取SqlSession对象的操作比较复杂,此时可以考虑将过去SqlSession对象的操作封装成一个方法。SqlSession对象是由SqlSessionFactory对象创建的,SqlSessionFactory是线程安全的,所以可以使用单例模式来创建SqlSessionFactory对象。

1.创建一个MyBatisUtil工具类:

package com.monkey1024.util;

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;


/**
 * DCL的单例模式
 */
public class MyBatisUtil {

    //不需要将构造方法私有化,因为这里的单例只是保证外界使用当前工具时创建一个SqlSessionFactory对象就行
//    private MyBatisUtil() {
//
//    }

    private static volatile SqlSessionFactory sqlSessionFactory;

    public static SqlSession getSqlSession() {
        try {
            if (sqlSessionFactory == null) {
                //读取主配置文件
                InputStream input = Resources.getResourceAsStream("mybatis.xml");
                synchronized (MyBatisUtil.class) {
                    if (sqlSessionFactory == null){
                        sqlSessionFactory = new SqlSessionFactoryBuilder().build(input);
                    }
                }

            }
        } catch (IOException e) {
            e.printStackTrace();
        }

        return sqlSessionFactory.openSession();
    }


}

上面的单例模式比较特殊,里面无需将构造方法私有化,至于MyBatisUtil这个类创建几个对象无所谓,他只要保证其内部只创建一个SqlSessionFactory对象就行,这里只是将单例模式应用在创建SqlSessionFactory对象上。

2.修改StudentDaoImpl类:

package com.monkey1024.dao.impl;

import com.monkey1024.bean.Student;
import com.monkey1024.dao.StudentDao;
import com.monkey1024.util.MyBatisUtil;
import org.apache.ibatis.session.SqlSession;

public class StudentDaoImpl implements StudentDao {

    @Override
    public void insertStudent(Student student) {
        //SqlSession继承了AutoCloseable接口,所以可以自动关闭
        try(SqlSession sqlSession = MyBatisUtil.getSqlSession()) {
            //新增数据操作
            sqlSession.insert("insertStudent", student);
            //提交SqlSession
            sqlSession.commit();

        }
    }
}

SqlSession继承了AutoCloseable接口,所以可以将其放到try后面自动关闭。

从配置文件中读取数据库的信息

一般情况下为了便于管理,都会将数据库的一些信息放到配置文件中,mybatis.xml配置文件会从该配置文件中读取相关的信息。

在resources目录下创建db.properties配置文件,里面填写下面内容:

jdbc.driver=com.mysql.jdbc.Driver
jdbc.url=jdbc:mysql://127.0.0.1:3306/learnmybatis?useSSL=false
jdbc.user=root
jdbc.password=monkey1024

将以上配置文件注册到mybatis.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">
<configuration>

    <!--注册配置文件-->
    <properties resource="db.properties"/>

    <environments default="development">
        <environment id="development">
            <transactionManager type="JDBC"/>
            <dataSource type="POOLED">
                <property name="driver" value="${jdbc.driver}"/>
                <property name="url" value="${jdbc.url}"/>
                <property name="username" value="${jdbc.user}"/>
                <property name="password" value="${jdbc.password}"/>
            </dataSource>
        </environment>
    </environments>
    <mappers>
        <!--注册映射文件-->
        <mapper resource="com/monkey1024/dao/StudentMapper.xml"/>
    </mappers>
</configuration>