说明:这一节我们面向接口编程,MyBatis 面向接口编程的好处是,减少了面向字符串编程出错的几率。
注意事项:
(1)配置文件中还是要写上 xml 文件的地址:
<mappers>
<mapper resource="com/liwei/mybatis/mapper/UserMapper.xml"/>
</mappers>
如果没有写,MyBatis 就加载不了配置文件。
(2)写一个接口,例如:
public interface UserMapper {
User selectUserByID(Integer id);
}
注意:接口的类名、包名要和配置文件的包名、文件名一模一样,而且配置文件的 namespace 一定要是包名 + 接口名(配置文件名)。这里又体现了约定优于配置。
3、相关代码:
public interface UserMapper {
User selectUserByID(Integer id);
}
<mapper namespace="com.liwei.mybatis.mapper.UserMapper">
<select id="selectUserByID" parameterType="int" resultType="User">
select * from `user` where id = #{id}
</select>
</mapper>
@Test
public void test02(){
SqlSession session = sqlSessionFactory.openSession();
UserMapper userMapper =session.getMapper(UserMapper.class);
try {
User user = userMapper.selectUserByID(1);
System.out.println("user => " + user);
} finally {
session.close();
}
}
Mybatis实战教程(mybatis in action)之二:以接口的方式编程
前面一章,已经搭建好了eclipse、mybatis、mysql的环境,并且实现了一个简单的查询。请注意,这种方式是用SqlSession实例来直接执行已映射的SQL语句:
session.selectOne(“com.liwei.mybatis.models.UserMapper.selectUserByID”, 1)
其实还有更简单的方法,而且是更好的方法,使用合理描述参数和SQL语句返回值的接口(比如IUserOperation.class),这样就实现了更简单,更安全的代码,对比我们在入门示例中的例子来说,就没有容易发生的字符串文字和转换的错误,下面是详细过程:
在src源码目录下建立 com.liwei.mybatis.inter 这个包,并建立接口类 IUserOperation , 内容如下:
package com.liwei.mybatis.inter;
import com.liwei.mybatis.model.User;
public interface IUserOperation {
User selectUserByID(int id);
}
注意事项(非常重要):
(1)请注意,这里面有一个方法名 selectUserByID 必须与 User.xml 里面配置的 select 的id 对应(<select id="selectUserByID"
)。
(2)这里 namespace 必须是 UserMapper 接口的路径,不然要运行的时候要报错 “is not known to the MapperRegistry”
接下来,我们重新编写测试代码:
package com.liwei.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 com.liwei.mybatis.inter.IUserOperation;
import com.liwei.mybatis.model.User;
public class TestInterface {
private static SqlSessionFactory sqlSessionFactory;
private static Reader reader;
static {
try {
reader = Resources.getResourceAsReader("Configuration.xml");
sqlSessionFactory = new SqlSessionFactoryBuilder().build(reader);
} catch (IOException e) {
e.printStackTrace();
}
}
public static void main(String[] args) {
SqlSession session = sqlSessionFactory.openSession();
try {
// 注意:使用接口的方式编程的方法调用
IUserOperation userOperation = session.getMapper(IUserOperation.class);
User user = userOperation.selectUserByID(1);
System.out.println(user.getUserAddress());
System.out.println(user.getUserName());
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
整个工程结构图现在如下: