前面一章,已经搭建好了Intellij idea,mybatis,mysql的环境,并且实现了一个简单的查询。请注意,这种方式是用SqlSession实例来直接执行已映射的SQL语句:
User user = session.selectOne("com.nextflower.Study.entity.User.selectUserByID", 1);
其实还有更简单的方法,而且是更好的方法,使用合理描述参数和SQL语句返回值的接口(比如UserDao.class),这样现在就可以至此那个更简单,更安全的代码,没有容易发生的字符串文字和转换的错误.下面是详细过程。
1、在src源码目录下建立 com.nextflower.Study.dao 这个包,并建立接口类 UserDao, 内容如下:
package com.nextflower.Study.dao;
import com.nextflower.Study.entity.User;
/**
* Created by root on 2016/3/6.
*/
public interface UserDao {
public User selectUserByID(int id);
}
请注意,这里面有一个方法名 selectUserByID 必须与 User.xml 里面配置的 select 的id 对应
(select id=”selectUserByID”)
2、这里我们提供一个新的User映射文件:User2.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">
<mapper namespace="com.nextflower.Study.dao.UserDao">
<select id="selectUserByID" parameterType="int" resultType="User">
select * from `user` where id = #{id}
</select>
</mapper>
3、测试代码如下:执行testInterface()方法即可。
package com.nextflower.TestCase.Mybatis;
import com.nextflower.Study.dao.UserDao;
import com.nextflower.Study.entity.User;
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 org.junit.After;
import org.junit.Before;
import org.junit.Test;
import java.io.Reader;
/**
* 测试使用mybatis的示例代码
* Created by root on 2016/3/6.
* @author nextflower
*/
public class MybatisTest {
private static SqlSessionFactory sqlSessionFactory;
private static Reader reader;
@Before
public void before() {
try{
reader = Resources.getResourceAsReader("Configuration.xml");
sqlSessionFactory = new SqlSessionFactoryBuilder().build(reader);
}catch(Exception e){
e.printStackTrace();
}
}
@Test
public void test() {
SqlSession session = sqlSessionFactory.openSession();
try {
User user = session.selectOne("com.nextflower.Study.entity.UserDao.selectUserByID", 1);
System.out.println(user.getUserAddress());
System.out.println(user.getUserName());
} finally {
session.close();
}
}
@Test
public void testInterface() {
SqlSession session = sqlSessionFactory.openSession();
try {
UserDao userDao=session.getMapper(UserDao.class);
User user = userDao.selectUserByID(1);
System.out.println(user.getUserAddress());
System.out.println(user.getUserName());
} finally {
session.close();
}
}
@After
public void after() {
}
}
4、测试结果如下:
PS:
这种方式,要注意的一个地方就是。在User2.xml 的配置文件中,mapper namespace=”com.nextflower.Study.dao.UserDao” ,命名空间非常重要,不能有错,必须与我们定义的package 和 接口一致。如果不一致就会出错。
代码地址:
本文示例代码开源中国地址