- 编写映射器接口
tfw.integration_demo._04_spring_web_mvc._02_crud._03_mybatis_crud._02_auto_dao_way.dao.I_UserDAO
:
……
public interface I_UserDAO extends
tfw.integration_demo._04_spring_web_mvc._02_crud._01_basic_jdbc_crud.dao.I_UserDAO
{
……
List<User> listByRange(@Param("start_row_index") int intStartRowIdx,
@Param("select_row_count") int intSelectRowCount)
throws SQLException;
}
说明
/
注意事项:
- “I_UserDAO extends tfw.……._01_basic_jdbc_crud.dao.I_UserDAO”:
所有功能都已在
tfw.……._01_basic_jdbc_crud.dao.I_UserDAO
中声明;
但部分方法的参数前需要另行添加
MyBatis
注解,所以做一道继承。
- “List<User> listByRange(@Param("start_row_index") ……, @Param("select_row_count") ……) ……”:
每个数据操作方法必须令参数能正确地传入
MyBatis
;
这个这个接口已经被多个类实现,如果将此方法修改为接收“java.util.Map”型参数,涉及的改动量过大;
如果不修改而直接沿用此方法,则需要有序、互相区分地向
MyBatis
传入不止一个参数;
添加在方法参数前的
MyBatis
注解“@Param{……}”提供了这种支持;
“start_row_index”和“select_row_count”即为参数在
MyBatis 映射文件中的名字。
- 编写 MyBatis
映射文件
src/main/resources/tfw/integration_demo/_04_spring_web_mvc/_02_crud/_03_mybatis_crud/_02_auto_dao_way/dao/impl/oracle/User.mybatis_mapping.xml
:
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper PUBLIC "-//ibatis.apache.org//DTD Mapper 3.0//EN"
"http://ibatis.apache.org/dtd/ibatis-3-mapper.dtd">
<mapper namespace="tfw.integration_demo._04_spring_web_mvc._02_crud._03_mybatis_crud._02_auto_dao_way.dao.I_UserDAO">
<!--
<insert id=""/>
……
<delete id=""/>
-->
<insert id="create"
……>
……
</insert>
……
<select id="listByRange" ……
……>
select ……
from (
select rownum rn, t.*
from (
……
) t
where rownum<=(#{start_row_index}+#{select_row_count})
)
where rn>=(#{start_row_index}+1)
</select>
……
</mapper>
说明
/
注意事项:
- 文件路径:
映射文件只要能被
MyBatis 找到,即可;映射文件的路径和映射器接口的路径没有任何关系;
在本样例中两者路径相似、相关,仅为项目结构上便于查找、管理。
- “namespace="tfw.integration_demo._04_spring_web_mvc._02_crud._03_mybatis_crud._02_auto_dao_way.dao.I_UserDAO"”:
基本上完全沿用“src/main/resources/tfw/integration_demo/_04_spring_web_mvc/_02_crud/_03_mybatis_crud/_01_manual_dao_way/dao/impl/oracle/User.mybatis_mapping.xml”,但将“namespace="……"”属性的值改为前述映射器接口。
- “#{start_row_index}”、“#{select_row_count}”:
传入的参数,名称必须和映射器接口的“@Param{……}”中的名称一致。
- 修改
MyBatis
主配置文件
src/main/resources/tfw/integration_demo/_04_spring_web_mvc/_02_crud/_03_mybatis_crud/mybatis-config.xml
,在“mappers”节点下添加此映射文件:
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE ……>
<configuration>
<!-- Connection and transaction parameters: -->
<environments ……>
……
</environments>
<!-- Mappers: -->
<mappers>
<!--
<mapper resource=".../.../XXXMapping.xml"/>
<mapper resource=".../.../YYYMapping.xml"/>
-->
<mapper resource="tfw/integration_demo/_04_spring_web_mvc/_02_crud/_03_mybatis_crud/_01_manual_dao_way/dao/impl/oracle/User.mybatis_mapping.xml"/>
<mapper resource="tfw/integration_demo/_04_spring_web_mvc/_02_crud/_03_mybatis_crud/_02_auto_dao_way/dao/impl/oracle/User.mybatis_mapping.xml"/>
</mappers>
</configuration>
- 编写测试用例
tfw.integration_demo._04_spring_web_mvc._02_crud._03_mybatis_crud._02_auto_dao_way.user_mgr_testcase._01_MyBatisDAO
,测试
DAO
的生成过程及各种功能:
……
public class _01_MyBatisDAO
{
private String strClasspathConfFile =
"tfw/integration_demo/_04_spring_web_mvc/_02_crud/_03_mybatis_crud/mybatis-config.xml";
private SqlSession session;
private I_UserDAO userDAO;
@Test
public void testObjects() throws IOException
{
SqlSessionFactoryBuilder ssfb = new SqlSessionFactoryBuilder();
System.out.println("SqlSessionFactoryBuilder:\n\t" + ssfb);
System.out.println("Configuration File:\n\t" + strClasspathConfFile);
InputStream isMyBatisCfg =
ClasspathFileToolT.getURLInputStream(strClasspathConfFile);
System.out.println("Configuration InputStream:\n\t" + isMyBatisCfg);
SqlSessionFactory ssf = ssfb.build(isMyBatisCfg);
System.out.println("SqlSessionFactory:\n\t" + ssf);
isMyBatisCfg.close();
System.out.println(
"Configuration InputStream Closed:\n\t" + isMyBatisCfg);
SqlSession session = ssf.openSession();
System.out.println("SqlSession:\n\t" + session);
I_UserDAO userDAO = session.getMapper(
tfw.integration_demo._04_spring_web_mvc._02_crud._03_mybatis_crud._02_auto_dao_way.dao.I_UserDAO.class);
System.out.println("DAO:\n\t" + userDAO);
session.close();
System.out.println("SqlSession Closed:\n\t" + session);
}
@Before
public void init() throws IOException
{
……
System.out.println(
"Configuration InputStream Closed:\n\t" + isMyBatisCfg);
session = ssf.openSession();
System.out.println("SqlSession:\n\t" + session);
userDAO = session.getMapper(
tfw.integration_demo._04_spring_web_mvc._02_crud._03_mybatis_crud._02_auto_dao_way.dao.I_UserDAO.class);
System.out.println("DAO:\n\t" + userDAO);
}
@After
public void close()
{
session.close();
System.out.println("SqlSession Closed:\n\t" + session);
}
@Test
public void testUserDAO_create() throws SQLException
{
……
}
……
}
说明
/
注意事项:
- “userDAO = session.getMapper(…….I_XXXDAO.class);”:
- 本样例不再采用“new XXXDAO(...);”的方式生成
DAO ,改由“session.getMapper(…….I_XXXDAO.class);”方式以反射、代理技术自动生成,无需再人工编写其实现类“XXXDAO”;
MyBatis
加载主配置文件时一并加载映射文件,建立映射文件和其中记录的映射器接口间的匹配关系。
- “tfw.integration_demo._04_spring_web_mvc._02_crud._03_mybatis_crud._02_auto_dao_way.dao.I_UserDAO.class”:
易错点,必须使用MyBatis 映射文件中指定的类;
由于和上级接口的类名相同,没法同时
import
,所以在此使用完整的类名。
- 经试验,实际生成的
DAO
的类型为“org.apache.ibatis.binding.MapperProxy”。