再谈Mybatis

前言

    上回说到Mybatis的基础知识,如何连接数据库,xml如何配置,Mapper文件怎么创建,如何在哪里加载Mapper文件,已经如何获取sqlSession,想要了解可以跳转Mybatis基础

mybatis-conf.xml重新配置

    和之前的配置大差不多但是我们这次却在里面添加了很多别的东西,先看代码,再进行介绍。
    代码如下:

<configuration>
    <properties resource="jdbc.properties"/>
    <settings>
        <setting name="mapUnderscoreToCamelCase" value="false"/>
    </settings>

    <typeAliases>
        <typeAlias type="com.xxx.mybatis.bean.Student2" alias="Student2"/>
        <typeAlias type="com.xxx.mybatis.bean.City" alias="City"/>
    </typeAliases>
    <environments default="yanfa5">
        <environment id="yanfa5">
            <transactionManager type="MANAGED"/>
            <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 class="com.xxx.mybatis.dao.Student2Dao"/>
        <mapper resource="mapper/City.xml" />
        <mapper resource="mapper/Student2.xml"/>
    </mappers>
</configuration>

    此时我们看到了代码中多了一些别的代码,我们一一介绍下来:

<settings>
        <setting name="mapUnderscoreToCamelCase" value="true"/>
</settings>

    这行代码的作用是如果我们的pojo类中的属性与数据库中的列名存在差异的话,我们查询出来的结果是null,所以我们要设置这行称为“小驼峰”的代码,value为true时,则输出结果便和数据库的一样了。
    但是如果我们不想这样做的话还有一种别的方法,来将pojo类中的属性和数据库中的列名产生映射,成为高级集合映射,虽然两者的名字不一样,但是还是能够产生共鸣,看代码:

<mapper namespace="com.xxx.mybatis.dao.Student2Dao">
    <resultMap id="stu" type="Student2">
        <result property="id" column="id"/>
        <result property="nickName" column="nick_name"/>
    </resultMap>
    <select id="queryResultMap" resultMap="stu">
        select * from student2;
    </select>
</mapper>

    如上面的代码,我们可以看到这些代码还是在Mapper中,所以我们还是需要将这xml文件写在之前建好的mapper的包中,以便以后加载此mapper文件是方便书写路径,介绍代码:

<mapper namespace="com.xxx.mybatis.dao.Student2Dao">

    dao层类,Student2Dao中为查询方法,因为没有使用注解方法,所以要在mapper中书写sql语句,所以正好建resultMao标签,namespace为找到这个dao层类。

<resultMap id="stu" type="Student2">
        <result property="id" column="id"/>
        <result property="nickName" column="nick_name"/>
</resultMap>

    resultMap高级集合映射,此代码就是将数据库列名和pojo类属性连接到一块,resultMap的属性有三个,此时我们使用两个,id为名字我们可以随便写一个(符合规范的)以后会用到,type为格式,返回值的全限定类名,或类型别名。而result中的属性很多,我们此时也用到了两个,property为需要映射到pojo类的属性名称。colum则为数据表的列名或者标签别名(此时我们发现及时两者的名字不一样但还是能够产生映射)。

<select id="queryResultMap" resultMap="stu">
        select * from student2;
    </select>

    设置好resultMao后我们就要书写sql语句了,此时id为pojo类中的方法(或者接口中的方法),resultMap为之前设置好的resultMap的id。
    这里展示一下接口中的方法:

public interface Student2Dao {
    List<Student2> queryResultMap();
}

    此时我们需要在测试类中获取sqlSession然后调用接口的方法,但是今天我们在外面写了一个工具类来获取sqlSession,代码如下

 private static ConcurrentHashMap<String, SqlSessionFactory> factoryMap = new MyConcurrentHashMap();

    private static MyBatisTools myBatisTools;

    private MyBatisTools() {}

    public static MyBatisTools getInstance() {
        if(myBatisTools == null) {
            synchronized (MyBatisTools.class) {
                if(myBatisTools == null) {
                    myBatisTools = new MyBatisTools();
                }
            }
        }
        log.debug("当前一共有: " + factoryMap.size() +"个SqlSessionFactory实例");
        log.debug("他们分别是: " + factoryMap);
        return myBatisTools;
    }

    public SqlSessionFactory getSessionFactory(String env) {
        try {
            // 1. 读入配置文件
            InputStream in = Resources.getResourceAsStream("mybatis_conf.xml");
            // 2. 构建SqlSessionFactory(用于获取sqlSession)
            SqlSessionFactory sessionFactory = null;
            synchronized (factoryMap) {
                if(factoryMap.containsKey(env)) {
                    return factoryMap.get(env);
                } else {
                    sessionFactory = new SqlSessionFactoryBuilder().build(in, env);
                    factoryMap.put(env, sessionFactory);
                }
            }
            return sessionFactory;
        } catch (Exception e) {
            log.error("初始化SqlSessionFactory失败", e);
            return null;
        }
    }

    public SqlSession openSession() {
        return getSessionFactory(null).openSession();
    }

    public SqlSession openSession(boolean autoCommit) {
        return getSessionFactory(null).openSession(autoCommit);
    }

    public SqlSession openSession(ExecutorType executorType, boolean autoCommit) {
        return getSessionFactory(null).openSession(executorType, autoCommit);
    }

    配置完这个工具类后我们可以通过这个工具类来获取sqlSession,代码如下:

 Student2Dao studentDao = null;//多次获取可以这样方式方便
student2Dao = MyBatisTools.getInstance().openSession().getMapper(Student2Dao.class);

    至此我们可以使用获得到的sqlSession来调用方法,随后和上次我们讲的方式一样,这里我们只谈了数据库的查,增删改和这些差不了多少,但是如果where后面后条件的话,我们在接口的方法中需要定义param来定义参数,否则将会报错,还有#{}之前也介绍过,今天到此,我们随后再次深度剖解Mybatis。

猜你喜欢

转载自blog.csdn.net/dianjishamaoxian/article/details/93530045