Mybatis基础配置

Mybatis基础配置

生命周期和作用域

SqlSessionFactoryBuilder :

​ 一旦创建了SqlSessionFactory, 就不再需要了,设置成局部变量

SqlSessionFactory :

​ 想象成数据库连接池, 一旦创建就应该一直存在, 没有理由重新建造一个, 设置为全局作用域.

​ 使用单例模式或者静态单例模式, 既可以保证只有一份, 又是全局作用域

SqlSession :

  • 连接到连接池的一个请求
  • SqlSession的实例不是线程安全的, 因此是不能被共享的, 所以它的最佳作用域是请求或方法作用域
  • 用完之后需要赶紧关闭, 否则资源被占用, 这个操作十分重要!!!

编写mybatis核心配置文件

  1. 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>
    
  2. 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&amp;characterEncoding=UTF-8&amp;useJDBCCompliantTimezoneShift=true&amp;useLegacyDatetimeCode=false&amp;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>
    
  3. 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>
    

编写mybatis工具类

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();
    }
}
posted @ 2020-04-05 23:59  逸枚俗人  阅读(139)  评论(0编辑  收藏  举报