Mapper接口和原理
之前代码存在的问题
查询单个用户的java代码:
//Get one
@Test
public void testGetOne() throws Exception{
SqlSession session = MyBatisUtil.getSqlSession();
//******************************************
User user = session.selectOne("com.gx.mybatis.hello.UserMapper.get", 1l);
//******************************************
System.out.println(user);
session.close();
}
使用namespace.id
的方式去找到SQL
元素, 并执行SQL
语句
**该方式存在的问题: **
-
因为传入的是
String
类型的参数, 存在拼写错误的可能. 一旦写错, 只有在运行时期才能发现本应该这样写: com.gx.mybatis.hello.UserMapper.get -> 正确
存在拼写错误: com.gx.mybatis.hello.UserMapper.got -> 错误 -
传入的
MyBatis
需要的参数类型是不会被检查的
在SqlSession
中传递的参数类型都是Object
类型
- 每一个操作的代码模板都是相同的
解决方案: 使用Mapper
接口. 类似Dao
接口, 在mapper
接口中定义每一个操作方法
Mapper接口
步骤:
- 创建一个
Mapper
接口 - 创建
SqlSession
- 通过
SqlSession
创建Mapper
对象 - 通过
Mapper
对象完成CRUD
创建UserMapper接口
*UserMaper代码如下: *
public interface UserMapper {
void save(User u);
void update(User u);
void delete(Long id);
User get(Long id);
List<User> getAll();
}
Mapper组件: Mapper接口 + Mapper文件:
Mapper
文件和Mapper
接口应该在同一个包中Mapper
文件中的namespace
设置为对应Mapper
接口的全限定名称Mapper
文件中的操作元素的ID
对应Mapper
接口中的方法名称
测试代码:
//Get one
@Test
public void testGet() throws Exception{
SqlSession session = MyBatisUtil.getSqlSession();
//之前
//User user = session.selectOne("com.gx.mybatis.hello.mapper.UserMapper.get", 1l);
//********************************
//mapper接口
UserMapper usermapper = session.getMapper(UserMapper.class);
User user = usermapper.get(1l);
//********************************
System.out.println(user);
session.close();
}
//Get all
@Test
public void testGetAll() throws Exception{
SqlSession session = MyBatisUtil.getSqlSession();
//之前
//List<User> users = session.selectList("com.gx.mybatis.hello.mapper.UserMapper.getAll");
//********************************
//Mapper接口
UserMapper usermapper = session.getMapper(UserMapper.class);
List<User> users = usermapper.getAll();
//********************************
for (User u : users) {
System.out.println(u);
}
session.close();
}