MyBatis学习总结[2]-接口式调用
创建接口
package me.dao;
import java.util.List;
import me.model.User;
public interface UserDao {
/**
*注意,
*1.mapper.xml文件中namespace要设置为接口的全名,即包名+接口名
*2.select标签的Id要与接口方法名一直
*/
List<User> selectById(@Param("id")int 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与映射的接口相对应 -->
<mapper namespace="me.dao.UserDao">
<!-- id与接口中的方法名相对应 -->
<select id="selectById" parameterType="int" resultType="User">
select * from users where id = #{id}
</select>
</mapper>
配置文件
<!-- 在配置文件的最下面添加 -->
<mappers>
<!--
mapper的属性有3个
1.resource,指定类路径下的mapper.xml文件
2.url,完全限定资源定位符
3.class,指定接口
如果指定了接口,就只能用接口的注解方式执行查询了,不再
映射mapper文件中的配置
mappers还有一个标签
<package name=""/>
用来指定一个包下的所有接口,效果为同时指定多个class
*对于每个元素有且只能有一种注册方式,即上述几种之一*
-->
<!-- 注册Mapper -->
<mapper resource="me/mapper/UserMapper.xml"/>
</mappers>
Service类中调用方法
package me.service;
import java.io.InputStream;
import java.util.List;
import me.dao.UserDao;
import me.model.Car;
import me.model.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;
public class UserService {
String resource = "conf.xml";
InputStream is = UserService.class.getClassLoader().getResourceAsStream(
resource);
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder()
.build(is);
SqlSession session = sqlSessionFactory.openSession();
public void selectUserById(int id) {
//利用session的getMapper方法获得UserDao的代理类(com.sun.proxy.$Proxy5)
UserDao udao=session.getMapper(UserDao.class);
List<User> list= udao.selectById(id);
for (User user : list) {
System.out.println(user.getName()+" "+user.getCar());
}
}
public void close(){
session.close();
}
}
接口的注解方式实现
当查询语句较简单的时候推荐
package me.dao;
import java.util.List;
import org.apache.ibatis.annotations.Select;
import me.model.User;
public interface UserDao {
/**
*使用是只需要,再接口内的方法名上添加注解并把sql语句写到value里即可
*使用注解的方法的调用方式和配置了xml的方法一致
*注意,
*mapper里使用resource的时候也可以使用注解,但是
*在xml配置了语句的方法就不可再配置注解
*/
@Select("select * from users where id = #{id}")
List<User> selectById(@Param("id")int id);
}
测试类
package me.service;
import static org.junit.Assert.*;
import org.junit.AfterClass;
import org.junit.BeforeClass;
import org.junit.Test;
public class UserServiceTest {
static UserService s=null;
@BeforeClass
public static void before(){
s=new UserService();
}
@Test
public void test() {
s.selectUserById(2);
}
@AfterClass
public static void after(){
s.close();
}
}