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