1 前言
在核心配置文件(mybatis-config.xml)中,引入映射文件(如:StudentMapper.xml)的方法如下。其缺点是:当映射文件较多时,需要引入的映射文件也较多,使得 mybatis-config.xml 文件代码量剧增。
<!-- 引入映射文件 -->
<mappers>
<mapper resource="StudentMapper.xml"/>
</mappers>
通过 package 管理映射文件的引入,能够避免 mybatis-config.xml 文件因映射文件过多而剧增,方法如下。
<!-- 引入映射文件 -->
<mappers>
<package name="com.mapper"/>
</mappers>
2 实验环境
(1)导入 JAR 包
其中,前2个 jar 包下载地址见 →log4j-1.2.17.jar、mybatis-3.4.1.jar,将 jar 包放入 lib 目录下,并选中所有 jar 包,右键,选择【Add to Build Path】。
(2)配置文件
log4j.xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE log4j:configuration SYSTEM "log4j.dtd">
<log4j:configuration xmlns:log4j="http://jakarta.apache.org/log4j/">
<appender name="STDOUT" class="org.apache.log4j.ConsoleAppender">
<param name="Encoding" value="UTF-8" />
<layout class="org.apache.log4j.PatternLayout">
<param name="ConversionPattern" value="%-5p %d{MM-dd HH:mm:ss,SSS} %m (%F:%L)\n" />
</layout>
</appender>
<logger name="java.sql">
<level value="debug" />
</logger>
<logger name="org.apache.ibatis">
<level value="info" />
</logger>
<root>
<priority value="debug" />
<appender-ref ref="STDOUT" />
</root>
</log4j:configuration>
注意:log4j.xml文件名不能随意更改。
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"></properties>
<!-- 设置连接数据库的环境,default用于设置默认使用的数据库环境 -->
<environments default="mysql">
<!-- 设置某个具体的数据库环境 -->
<environment id="mysql">
<transactionManager type="JDBC" />
<dataSource type="POOLED">
<property name="driver" value="${jdbc.driver}" />
<property name="url" value="${jdbc.url}" />
<property name="username" value="${jdbc.username}" />
<property name="password" value="${jdbc.password}" />
</dataSource>
</environment>
</environments>
<!-- 引入映射文件 -->
<mappers>
<package name="com.mapper"/>
</mappers>
</configuration>
注意:<package> 标签的作用是:将 name 值指定的包里的映射文件都引入。
jdbc.properties
# K = V
jdbc.driver=com.mysql.jdbc.Driver
jdbc.url=jdbc:mysql://localhost:3306/users?characterEncoding=UTF-8
jdbc.username=root
jdbc.password=0.
3 案例分析
首先在 MySQL 中创建数据库:users,再在此数据库中创建表:students,包含sid(int)、sname(varchar) 2个字段,其中,sid 设置了自增,students 表中数据如下:
3.1 方法一(映射文件和 DAO 接口在同一包下)
工作目录如下:
注意:DAO 接口(StudentMapper.java)与映射文件(StudentMapper.xml) 在同一个包下。
Student.java
package com.bean;
public class Student {
private Integer sid;
private String sname;
public Integer getSid() {
return sid;
}
public void setSid(Integer sid) {
this.sid = sid;
}
public String getSname() {
return sname;
}
public void setSname(String sname) {
this.sname = sname;
}
@Override
public String toString() {
return "Student [sid=" + sid + ", sname=" + sname + "]";
}
}
注意:尽量保持 Student 类中属性名与数据库中 students 表格的属性名同名,如果不同名,在查询时需要使用别名,使得别名与 Student 类中对应属性名同名。
StudentMapper.java
package com.mapper;
import com.bean.Student;
public interface StudentMapper {
public Student getStudentById(Integer sid);
}
StudentMapper.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">
<mapper namespace="com.mapper.StudentMapper">
<!-- public Student getStudentById(Integer sid); -->
<select id="getStudentById" resultType="com.bean.Student">
select sid,sname from students where sid = #{sid}
</select>
</mapper>
注意:namespace 需要指向 StudentMapper.java;<select> 标签中 id 值需要与 StudentMapper.java 中相应方法名同名,resultType 为该方法返回值的数据类型。
Test.java
package com.test;
import java.io.IOException;
import java.io.InputStream;
import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
import com.bean.Student;
import com.mapper.StudentMapper;
public class Test {
public static void main(String[] args) throws IOException {
InputStream is=Resources.getResourceAsStream("mybatis-config.xml");
SqlSessionFactory sqlSessionFactory=new SqlSessionFactoryBuilder().build(is);
SqlSession sqlSession=sqlSessionFactory.openSession(true); //自动提交事务
//getMapper:会通过动态代理动态生成StudentMapper的代理实现类
StudentMapper mapper=sqlSession.getMapper(StudentMapper.class);
Student student=mapper.getStudentById(1001); //查询一条数据
System.out.println(student);
}
}
控制台输出如下:
DEBUG 06-11 21:34:52,042 ==> Preparing: select sid,sname from students where sid = ? (BaseJdbcLogger.java:145)
DEBUG 06-11 21:34:52,071 ==> Parameters: 1001(Integer) (BaseJdbcLogger.java:145)
DEBUG 06-11 21:34:52,089 <== Total: 1 (BaseJdbcLogger.java:145)
Student [sid=1001, sname=张三]
3.1 方法一(映射文件和 DAO 接口在不同包下)
工作目录如下:
注意:DAO 接口(StudentMapper.java)与映射文件(StudentMapper.xml) 分别在 src 和 conf 两个文件夹的 com.mapper 包下(两个包必须同名)。
以上是在 Package Explorer 视图下看到的工作目录,在 Navigator(【Window】→【Show View】→【Navigator】)视图下,可以看到 StudentMapper.java 与 StudentMapper.xml 仍在同一文件下,如下所示: