上一节博客里面介绍了MyBatis的简单应用实例。这一篇博客讲以一下mybatis配置文件中各个标签的意义。
上一节实例的mybatis配置文件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>
<properties resource="jdbc.properties"/>
<typeAliases>
<typeAlias alias="Student" type="com.test.model.Student"/>
</typeAliases>
<environments default="development">
<environment id="development">
<transactionManager type="JDBC" />
<dataSource type="POOLED">
<property name="driver" value="${jdbc.driverClassName}" />
<property name="url" value="${jdbc.url}" />
<property name="username" value="${jdbc.username}" />
<property name="password" value="${jdbc.password}" />
</dataSource>
</environment>
</environments>
<mappers>
<mapper resource="com/test/mappers/StudentMapper.xml" />
</mappers>
</configuration>
这里对各个标签进行说明:
1.<environments>标签:这个标签用来配置工程的环境。这个标签中使用<environment>标签来定义各种环境,上面的配置文件中只定义了一个开发环境,并指定了当前工程使用这个环境。下面我们在定义一个测试环境,并指定工程使用这个测试环境:
<?xml version="1.0" encoding="UTF-8" ?>这里在<environments>标签中又使用<environment>定义了一个环境,取id为test,并指定了当前工程使用test环境(<environments>标签的default属性指定使用哪个环境)。这两个环境中的配置可以是不同的(我们这里直接进行了复制,定义的是相同的)。在一正规的企业,开发工程的时候可能会定义多个环境,比如说定义一个开发环境,开发环境使用mysql数据库,定义一个正式环境,当正式发布的时候使用,正式环境使用oracle数据库。这里定义多个环境,并可以设定当前工程使用哪个环境目的是为了能够更好的开发。
<!DOCTYPE configuration
PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
<properties resource="jdbc.properties"/>
<typeAliases>
<typeAlias alias="Student" type="com.test.model.Student"/>
</typeAliases>
<environments default="test">
<environment id="development">
<transactionManager type="JDBC" />
<dataSource type="POOLED">
<property name="driver" value="${jdbc.driverClassName}" />
<property name="url" value="${jdbc.url}" />
<property name="username" value="${jdbc.username}" />
<property name="password" value="${jdbc.password}" />
</dataSource>
</environment>
<environment id="test">
<transactionManager type="JDBC" />
<dataSource type="POOLED">
<property name="driver" value="${jdbc.driverClassName}" />
<property name="url" value="${jdbc.url}" />
<property name="username" value="${jdbc.username}" />
<property name="password" value="${jdbc.password}" />
</dataSource>
</environment>
</environments>
<mappers>
<mapper resource="com/test/mappers/StudentMapper.xml" />
</mappers>
</configuration>
2.<transactionManager />标签定义事务管理器,这个标签中type属性的取值有JDBC和MANAGED(托管)两种。其中:
JDBC:应用程序负责管理数据库连接的生命周期;
MANAGED : 由应用服务器负责管理数据库连接的生命周期; ( tomcat这种免费的服务器是没有这种功能的,一般商业服务器才有此功能, 如JBOSS,WebLogic)
3.<dataSource>标签,用来配置数据源,也就是配置数据库连接。这个标签的type属性有三种取值,分别为:
UNPOOLED:没有连接池,每次数据库操作,MyBatis 都会创建一个新的连接,用完后,关闭;适合小并发项目;
POOLED:用上了连接池,mybatis一开始就创建多个连接,当需要的时候就取出一个连接,不需要的时候放回连接池;
JNDI:使用应用服务器配置JNDI 数据源获取数据库连接;
4.<properties/>标签,用来配置数据库连接的各种属性值。上面的配置中通过resource属性引入了一个配置文件,把各个属性值都写在了这个配置文件中。这种引入配置文件的方式比较方便好用。当然也可以不使用配置文件这种方式,而是直接配置。直接配置为:
<properties>
<property name="jdbc.driverClassName" value="com.mysql.jdbc.Driver"/>
<property name="jdbc.url" value="jdbc:mysql://localhost:3306/db_mybatis"/>
<property name="jdbc.username" value="root"/>
<property name="jdbc.password" value="123456"/>
</properties>
以后的时候还是使用引入配置文件的配置方法。
5.<typeAliases>标签,用来给要存入数据库的类取别名。上面的配置文件中给com.test.model.Student这个类取别名为Student,以后工程中用到com.test.model.Student这个类的时候,直接使用它的别名Student即可。上一个博客中实例中的StudentMapper.xml文件中就使用了这个别名:
<mapper namespace="com.test.mappers.StudentMapper">
<insert id="add" parameterType="Student" >
insert into t_student values(null,#{name},#{age})
</insert>
</mapper>
在这里定义输入参数类型的时候就使用了定义的别名Student。如果不定义别名的话,这里要写这个类的全名。
上面定义别名的方式(<typeAlias alias="Student" type="com.test.model.Student"/>)并不是最好的,因为如果有100多个类的话,需要写100多条定义语句,这样太麻烦了,可以使用一下方式:
<typeAliases>
<package name="com.test.model"/>
</typeAliases>
这种方式是把包com.test.model下所有的类都取别名,别名默认是类名(第一种方式的别名可以随意取,但是这种方式的别名是有规律的,用类名充当别名)。以后开发的时候都使用这种取别名的方式。
6.<mappers>标签,引入映射文件。这里使用了<mapper resource="com/test/mappers/StudentMapper.xml" />这种方式来引入映射文件,resource属性的值就是映射文件的名字。还可以使用以下方式引入映射文件:
<mappers>
<mapper class="com.test.mappers.StudentMapper"/>
</mappers>
这里是使用了class属性,这个属性的值是映射的类名。
以上两种方式都不是最好的,理由同上,如果有100多个类的话,要写100多条这样的语句。这样太麻烦。可以使用以下的方式:
<mappers>
<package name="com.test.mappers"/>
</mappers>
这种方式的把这个包下面的所有映射文件都引入。
7.配置log4j日志:
之前讲Hibernate的时候讲过log4j日志,这里就不再介绍log4j了,而是直接给出配置方法。
7.1工程的src目录中新建log4j配置文件log4j.properties:
log4j.rootLogger=info,appender1,appender2按照之前学习的知道这个配置的意义:定义了输出日志的级别是info级别,日志输出到appender1和appender2中,其中appender1是控制台,appender2是文件,appender2的文件是C盘下的logFile.txt文件。最后两句定义了输出日志的格式。
log4j.appender.appender1=org.apache.log4j.ConsoleAppender
log4j.appender.appender2=org.apache.log4j.FileAppender
log4j.appender.appender2.File=C:/logFile.txt
log4j.appender.appender1.layout=org.apache.log4j.TTCCLayout
log4j.appender.appender2.layout=org.apache.log4j.TTCCLayout
7.2把log4j的jar包添加到工程中。
完成7.1和7.2之后就可以使用log4j了。修改上一节博客中的测试方法为:
package com.test.service;
import org.apache.ibatis.session.SqlSession;
import org.apache.log4j.Logger;
import com.test.mappers.StudentMapper;
import com.test.model.Student;
import com.test.util.SqlSessionFactoryUtil;
public class StudentTest {
private static Logger logger = Logger.getLogger(StudentTest.class);
public static void main(String[] args) {
SqlSession sqlSession = SqlSessionFactoryUtil.openSession();
StudentMapper studentMapper = sqlSession.getMapper(StudentMapper.class);
Student student = new Student("李四",11);
int result = studentMapper.add(student);
sqlSession.commit();
if(result > 0){
logger.info("添加成功");
}
}
}
这里使用log4j来输出信息。运行程序:
控制台输出格式如上。根据配置在C盘会新建一个logFile.txt文件,也会把这个语句输出到这个文件中。