mapper 动态代理
在之前的所有例子中,我们在dao
接口的实现类中写了一些获取sqlSession
并调用其方法的代码,这些代码并没有什么实质的作用,具体的SQL操作语句我们是写在userMapper.xml
文件中的,因此 MyBatis 可以抛开这些实现类,直接通过dao
接口来定位到mapper
中的 SQL 语句,这种方式被称为mapper
的动态代理。
在之前我们mapper
的namespace
的值为test
,现在我们要将其修改为org.example.dao.UserDao
。将mapper
和dao
关联起来。
<mapper namespace="org.example.dao.UserDao">
</mapper>
这样 MyBatis 就会将当前的UserMapper.xml
文件与UserDao
接口对应上。UserDao
中的方法名与UserMapper.xml
文件中的id
名称必须保持一致,这样 MyBatis 就能将方法和sql
语句对应起来。
通过mapper
代理的方式,要求我们必须将mapper
和dao
放在同一目录下。在Maven工程中我们约定配置放在resources
目录下。为了保证mapper和dao在统一层级,我们需要在resources
下新建org.example.dao
目录,将userMapper.xml
放在此目录中。同时修改mybatis.xml
中的sql
映射文件路径为org/example/dao/userMapper.xml
。
这样Maven在编译时会将mapper文件放到target
对应的目录中,例如(org/example/dao
)
在不使用Dao的实现类后,获取SqlSession的操作,我们可以放到测试类中完成。
import org.apache.ibatis.session.SqlSession;
import org.example.dao.UserDao;
import org.example.pojo.User;
import org.example.util.MyBatisUtil;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;
import java.sql.Date;
import java.util.List;
public class UserTest {
private SqlSession sqlSession;
private UserDao userDao;
@Before
public void initUserDao() {
sqlSession = MyBatisUtil.getSqlSession();
userDao = sqlSession.getMapper(UserDao.class);
}
@After
public void closeSqlSession() {
if (sqlSession != null) {
sqlSession.close();
}
}
@Test
public void selectUserTest() {
User user = userDao.selectUser(1);
System.out.println(user);
}
@Test
public void selectUserLickName() {
List<User> users = userDao.selectLikeName("John");
for (User user : users) {
System.out.println(user);
}
}
@Test
public void insertUserTest() {
Date date = new Date(System.currentTimeMillis());
User user = new User("John 123111", "123@qq.com", 20, "Male", date);
Integer i = userDao.insertUser(user);
if (i > 0) {
System.out.println("Insert user successfully!");
} else {
System.out.println("Insert user failed!");
}
}
@Test
public void testSelectAllUsers() {
List<User> users = userDao.selectUsers();
for (User user : users) {
System.out.println(user);
}
}
}
最后更新于
这有帮助吗?