从本篇开始,引用借鉴博客:http://blog.csdn.net/techbirds_bao/article/details/9233599,里面是经典教程,但是有些纰漏。自己整理下,更加适合自己学习。
在前一篇入门篇我们使用的是SqlSession来执行查询语句:
User user = session.selectOne("User.selectUserById",1);
在本篇开始之前我解释一下上面这句话的意思。我们打开UserMapper.xml文件,上面查询语句跟Mapper里面的对应关系如下:

这是上篇没有说明的,以后要注意。后面的1是对应的user的id。
从本篇开始我们会摒弃直接使用SqlSession来执行sql语句,会使用接口的方式来进行sql语句的执行,这样更简洁,更安全。
为了更好的配合本文,现将开篇的表结构进行修改,最终的建表语句如下:
CREATE TABLE `t_user` ( `id` int(11) NOT NULL AUTO_INCREMENT, `user_name` varchar(50) DEFAULT NULL, `user_age` int(3) DEFAULT NULL, `user_address` varchar(200) DEFAULT NULL, PRIMARY KEY (`id`) ) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=utf8;
然后插入一两条数据:

我们将项目迁移到eclipse里面,当然你也可以继续使用myeclipse,具体结构如下:

在本篇,我们将上篇里的配置文件mybatis-config.xml换成了configuration.xml,配置信息都基本一样,只是增加了一个类别名的设置,为了让大家明了,将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> <!-- 设置实体类的别名 --> <typeAliases> <typeAlias alias="user" type="cn.clear.mybatis.model.User"/> </typeAliases> <!-- 配置数据库信息 --> <environments default="development"> <environment id="development"> <transactionManager type="JDBC"/> <dataSource type="POOLED"> <property name="driver" value="com.mysql.jdbc.Driver"/> <property name="url" value="jdbc:mysql://127.0.0.1:3306/mybatis"/> <property name="username" value="root"/> <property name="password" value="root"/> </dataSource> </environment> </environments> <!-- 映射文件 --> <mappers> <mapper resource="cn/clear/mybatis/model/UserMapper.xml"/> </mappers> </configuration>
好,下面我们就依照上面的准备,开始往下走。
在src_user源码目录下建立 cn.clear.mybaits.dao 这个包,并建立接口类 UserDao.java , 内容如下:
package cn.clear.mybatis.dao;
import java.util.List;
import cn.clear.mybatis.model.Article;
import cn.clear.mybatis.model.User;
public interface UserDao {
/**
* 根据id查询user对象
* @param id
* @return
*/
public User selectUserById(Integer id);
/**
* 查询所有user
* @return
*/
public List<User> selectAllUser();
}
注意:上面dao类里面的方法名要与UserMapper.xml里面的id名一样,所以我们将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">
<!-- 注意namespace里面关联的是UserDao的Qualified Name,这样才能使得Mapper文件与dao文件进行关联,才能顺利使用接口编程 -->
<mapper namespace="cn.clear.mybatis.dao.UserDao">
<!-- 配置User实体类与表结构信息,为了适用结果为集合的类型匹配,这里的type之所以可以直接写user,
是因为我们在configuration.xml文件里配置了类的别名 -->
<resultMap type="user" id="resultListUser">
<id property="id" column="id" />
<result property="userName" column="user_name"/>
<result property="userAge" column="user_age"/>
<result property="userAddress" column="user_address"/>
</resultMap>
<!-- 根据id查询user,其中id是唯一的并且对应UserDao类的方法名,parameterType对应的是参数类型,这里的参数是主键,主键的类型是int,
resultType表示返回的结果,但是我在使用resultType="user"时返回的总是null值,所以在不得治的时候我选择了使用resultMap。 -->
<select id="selectUserById" parameterType="int" resultMap="resultListUser">
select * from t_user where id = #{id,jdbcType=INTEGER}
</select>
<!-- 查询所有user,因为实际项目需要,这里使用的是倒序查询 -->
<select id="selectAllUser" resultMap="resultListUser">
select * from t_user order by id desc
</select>
</mapper>
配置好了之后,我们在UserTest.java类里面测试一下:
package cn.clear.mybatis.test;
import java.io.IOException;
import java.io.Reader;
import java.util.List;
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 cn.clear.mybatis.dao.UserDao;
import cn.clear.mybatis.model.Article;
import cn.clear.mybatis.model.User;
/**
* 测试mybatis
* @author clear
*
*/
public class UserTest {
//定义sessionFactory属性
private static SqlSessionFactory sessionFactory;
private static Reader reader;
static{
try {
//读取配置文件信息
reader = Resources.getResourceAsReader("configuration.xml");
//构建sessionFactory
sessionFactory = new SqlSessionFactoryBuilder().build(reader);
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
public static void main(String[] args) {
findUserByIdAndFindAllUser();
}
public static void findUserByIdAndFindAllUser() {
//根据sessionFactory打开SqlSession对象
SqlSession session = sessionFactory.openSession();
try{
//使用原始selectOne查询,注意方法里面表示Mapper文件的namespace下面id为selectUserById的查询语句
//User user = session.selectOne("cn.clear.mybatis.dao.UserDao.selectUserById",1);
//使用dao接口查询
UserDao userDao = session.getMapper(UserDao.class);
//根据id查询一条记录
User user = userDao.selectUserById(1);
System.out.println(user.getId()+" "+user.getUserName()+" "+user.getUserAge()+" "+user.getUserAddress());
System.out.println("------------------------感谢华丽丽的分割线-----------------------------");
//查询所有user
List<User> userList = userDao.selectAllUser();
for (User u : userList) {
System.out.println(u.getId()+" "+u.getUserName()+" "+u.getUserAge()+" "+u.getUserAddress());
}
}finally{
session.close();
}
}
}
然后我们执行此测试类,在console打印如下信息:
1 小子 26 广州天河万菱国际中心 ------------------------感谢华丽丽的分割线----------------------------- 2 小二 27 中国广州天河体育中心 1 小子 26 广州天河万菱国际中心
这样我们就顺利地使用了接口方式使用Mybatis进行查询。