-
Mapper代理实现dao的开发
如图所示,lib中是我们需要导入的jar包,log4j这个包还是日志输出,方便我们查看结果过程的.主要的是mysql和mybatis这两个. config里面是我们需要的属性文件和配置文件.jdbc.properties里面和以前一样是四个参数.log4j.properties决定哪些日志需要输出及样式.
- 它是通过mapper的接口+mapper的映射来实现的,那我们不免思考一下,我们真正调用的是实现类中的方法,那只有接口如何调用呢?答案就是mapper代理会根据接口和映射帮我们创建对象
- 不过同过mapper代理实现dao的开发是有要求的
- mapper的接口和mapper的映射同包同名(注册映射方便)
- mapper映射文件的namespace和接口的完全限定名保持一致--这样才能让接口和映射建立关联
- 标签的id和方法的名称保持一致
- 标签的输入参数类型和方法的参数类型一致
- 标签的输出结果类型和方法的返回值类型一致
- 下面就来说一下代码时如何实现的
- 这里的lib文件是我们需要的jar包.主要还是mysql和mybatis,log4j这个jar包是日志相关的.这里主要是为了结果中能看到日志导入的.mapper中使我们同名的映射配置文件和接口.pojo是实现类的包.(我们封装输出结果用的类).test是这里暂时用于测试的类.
- 下面我们看一下全局配置文件的mybatis.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"> <!-- 这里只要拿到上面的全局配置约束就OK了 --> <configuration> <!-- 加载java属性文件 --> <properties resource="jdbc.properties"></properties> <!-- 别名 --> <typeAliases> <package name="pojo"/> </typeAliases> <!-- 配置环境 --> <environments default="dev"> <environment id="dev"> <transactionManager type="JDBC"></transactionManager> <dataSource type="POOLED"> <property name="driver" value="${driver}"/> <property name="url" value="${url}"/> <property name="username" value="${username}"/> <property name="password" value="${password}"/> </dataSource> </environment> </environments> <!-- 映射器 --> <mappers> <!-- 批量注册映射文件: 刚才我们说过要用mapper代理的话需要mapper的接口和映射文件 框架会根据这两个东西生成实现类对象 那mapper接口和映射文件必须同包同名 下面的mapper是随便起的,不过习惯用mapper.就相当于原来的dao,实现和数据库交互的 --> <package name="mapper"/> </mappers> </configuration>
映射配置文件.UserMapper.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"> <!-- 映射约束信息抄过来 --> <!-- 以前说过传统的dao开发存在硬编码问题, 采用mapper映射是采用方法调用的方式 ,希望我们创建的接口和这个映射产生关联, 希望接口的方法和映射里面的标签建立连接 --> <mapper namespace="mapper.UserMapper"> <!-- 1.namespace必须是接口的完全限定名称 --> <select id="queryAll" resultType="userinfo"> <!-- 映射标签的id和接口方法的名称保持一致 --> select * from userinfo </select> <!-- 我们以前说过输出参数可以不考虑 --> <select id="queryById" resultType="userinfo"><!-- 标签的输出结果类型和方法的返回值类型一致 --> select * from userinfo where uid = #{uid} </select> </mapper>
接口中的代码
-
package mapper; import java.util.List; import pojo.UserInfo; public interface UserMapper { List<UserInfo> queryAll(); UserInfo queryById(int uid); }
实体类中的代码
-
package pojo; public class UserInfo { private int uid; private String username; private String password; public int getUid() { return uid; } public void setUid(int uid) { this.uid = uid; } public String getUsername() { return username; } public void setUsername(String username) { this.username = username; } public String getPassword() { return password; } public void setPassword(String password) { this.password = password; } @Override public String toString() { return "UserInfo [uid=" + uid + ", username=" + username + ", password=" + password + "]"; } public UserInfo(int uid, String username, String password) { super(); this.uid = uid; this.username = username; this.password = password; } public UserInfo() { super(); // TODO Auto-generated constructor stub } }
测试的代码
-
package test; import java.io.IOException; import java.io.Reader; 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 mapper.UserMapper; public class Test { public static void main(String[] args) throws IOException { Reader reader = Resources.getResourceAsReader("mybatis.xml"); SqlSessionFactory ssf = new SqlSessionFactoryBuilder().build(reader); SqlSession session = ssf.openSession(true); //我们需要用下面的方法得到mapper对象,然后调用内部的查询方法来实现 UserMapper mapper = session.getMapper(UserMapper.class); System.out.println(mapper.queryAll()); session.close(); } }
上面的测试中,我们只是用方法调用的方式与数据库实现了交互,解决了原来的硬编码问题.代码中的一些注释是相应的解释,就不在文章中重复出现了.可以边读代码变看注释哦