MyBatis开发-->接口方式编程

从本篇开始,引用借鉴博客: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进行查询。

原文地址:https://www.cnblogs.com/clear5/p/5000866.html