前言
上回说到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。