? 一旦创建了SqlSessionFactory, 就不再需要了,设置成局部变量
? 想象成数据库连接池, 一旦创建就应该一直存在, 没有理由重新建造一个, 设置为全局作用域.
? 使用单例模式或者静态单例模式, 既可以保证只有一份, 又是全局作用域
pom.xml
   <!--防止报错用的-->
	<build>
        <resources>
            <resource>
                <directory>src/main/resources</directory>
                <includes>
                    <include>**/*.properties</include>
                    <include>**/*.xml</include>
                </includes>
                <filtering>true</filtering>
            </resource>
            <resource>
                <directory>src/main/java</directory>
                <includes>
                    <include>**/*.properties</include>
                    <include>**/*.xml</include>
                </includes>
                <filtering>true</filtering>
            </resource>
        </resources>
    </build>
mybatis-config.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>
    <!--每一个xml的作用是等地位的,但是由于这个xml通过标签引入了别的xml,
    就相当于这是个主xml的意味了,同时需要注意的是xml文件中各个标签的位置非常重要,否则会报错-->
    <!--引入外部配置文件,由于在一个包下,所以不用去写路径,
    相当于把测试一中的value专门写到一个地方去,并且外部配置的优先级更高-->
    <properties resource="config.properties"/>
    <!--取别名-->
    <typeAliases>
        <!--当类名比较少的时候,分别给每一个类取上别名-->
        <typeAlias type="com.xiong.pojo.User" alias="User"/>
        <!--当类名比较多的时候,通过引入包,使得自动扫描对应包下类,
        这种默认不可以自定义别名,除非再额外使用@Alias的注解-->
        <package name="com.xiong.pojo"/>
    </typeAliases>
    <!-- 对数据库连接的配置文件 -->
    <environments default="development2">
        <!--测试一-->
        <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/mybatis?useUnicode=true&characterEncoding=UTF-8&useJDBCCompliantTimezoneShift=true&useLegacyDatetimeCode=false&serverTimezone=UTC"/>
                <property name="username" value="root"/>
                <property name="password" value="123456"/>
            </dataSource>
        </environment>
        <!--测试二-->
        <environment id="development2">
            <transactionManager type="JDBC"/>
            <dataSource type="POOLED">
                <property name="driver" value="${driver}"/>
                <property name="url" value="${url}"/>
                <property name="username" value="${username}"/>
                <property name="password" value="${password}"/>
            </dataSource>
        </environment>
    </environments>
    <!-- mapper.xml文件的路径配置 -->
    <mappers>
        <mapper resource="com/xiong/dao/UserMapper.xml"/>
    </mappers>
</configuration>
mapper.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">
<!--用配置文件的方式来取代接口的实现类-->
<!--使用别名来减少完全限定名的冗余,别名在mybatis-config.xml中设置-->
<!--绑定对应的接口-->
<mapper namespace="com.xiong.dao.UserMapper">
    <!--这里已经使用了别名进行优化-->
    <insert id="addUser" parameterType="User">
-- 在这里对象的属性可以直接用,直接写User类中的id,name和pwd,这里需要与属性名相对应
        insert into mybatis.user(id, name, pwd) value (#{id},#{name},#{pwd})
    </insert>
    <!--使用map自定义程度高,可以不用User类对象中的属性-->
    <insert id="addUserSimple" parameterType="map">
        insert into user (id, name, pwd) values (#{userId},#{username},#{password});
    </insert>
    <update id="updateUser" parameterType="User">
        update mybatis.user set name = #{name},pwd=#{pwd} where id=#{id} ;
    </update>
    <delete id="deleteUser" parameterType="int">
        delete from mybatis.user where id=#{id};
    </delete>
    <!--id就是对应的方法名,相当于用下面的sql语句重写了该方法
        resultType是sql语句的返回值
        parameterType是对应的参数类型-->
    <select id="getUserList" resultType="User">
        select * from mybatis.user
    </select>
    <select id="getUserById" resultType="User" parameterType="int">
        select * from mybatis.user where id = #{id}
    </select>
    <select id="getUserLike" resultType="User">
-- 模糊查询的sql,拼接的时候需要防止sql注入
        select * from mybatis.user where name like #{value}
    </select>
</mapper>
public class MybatisUtils {
    //提升作用域
    private static SqlSessionFactory sqlSessionFactory;
    static {
        //使用Mybatis第一步,获取sqlSessionFactory
        //固定代码
        InputStream inputStream = null;
        try {
            String resource = "mybatis-config.xml";
            inputStream = Resources.getResourceAsStream(resource);
            sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
// 既然有了 SqlSessionFactory,顾名思义,我们可以从中获得 SqlSession 的实例。
// org.apache.ibatis.session.SqlSession 提供了在数据库执行 org.apache.ibatis.jdbc.SQL 命令所需的所有方法。
// 你可以通过 SqlSession 实例来直接执行已映射的 SQL 语句。例如:
    public static SqlSession getSqlSession(){
        return sqlSessionFactory.openSession();
    }
}
原文:https://www.cnblogs.com/yimeisuren/p/12640077.html