代理
代理分为静态代理和动态代理。此处先不说静态代理,因为Mybatis中使用的代理方式是动态代理。
动态代理分为两种方式:
- 基于JDK的动态代理–针对有接口的类进行动态代理
- 基于CGLIB的动态代理–通过子类继承父类的方式去进行代理。
XML方式
开发方式
只需要开发Mapper接口(dao接口)和Mapper映射文件,不需要编写实现类。
开发规范
Mapper接口开发方式需要遵循以下规范:
- Mapper接口的类路径与Mapper.xml文件中的namespace相同。
- Mapper接口方法名称和Mapper.xml中定义的每个statement的id相同。
- Mapper接口方法的输入参数类型和mapper.xml中定义的每个sql 的parameterType的类型相同。
- Mapper接口方法的返回值类型和mapper.xml中定义的每个sql的resultType的类型相同。
样例代码
对比入门demo的代码结构,路径由phase01变为phase02,移除dao文件夹,剩余变动内容:
- UserDao 更名为 UserMapper
路径:com.osmond.mybatis.phase02.mapper.UserMapper.java
public interface UserMapper {
User findUserById(int id);
}
- 测试类
public class UserMapperTest {
private SqlSessionFactory sqlSessionFactory;
@Before
public void init() throws Exception {
String resource = "phase02/SqlMapConfig.xml";
InputStream inputStream = Resources.getResourceAsStream(resource);
sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
}
@Test
public void testFindUserById() {
// 创建UserMapper对象
SqlSession sqlSession = sqlSessionFactory.openSession();
UserMapper userMapper = sqlSession.getMapper(UserMapper.class);
// 调用UserMapper对象的API
User user = userMapper.findUserById(1);
System.out.println(user);
}
}
注解方式
开发方式
只需要编写mapper接口文件接口。
示例代码
在xml的基础上以新添加接口的方式演示:
- UserMapper类添加接口 listAllUser()
public interface UserMapper {
...
@Select("select * from user")
List<User> listAllUser();
}
- 测试类:
public class UserMapperTest {
...
@Test
public void testListAllUser(){
// 创建UserMapper对象
SqlSession sqlSession = sqlSessionFactory.openSession();
UserMapper userMapper = sqlSession.getMapper(UserMapper.class);
// 调用UserMapper对象的API
List<User> userList = userMapper.listAllUser();
System.out.println(userList);
}
}