一:原始Dao开发方式
【分析】原始Dao开发方法需要程序员编写Dao接口和Dao实现类。
Dao接口实现类如下
public class UserDaoImpl implements UserDao {
private SqlSessionFactory sqlSessionFactory;
public UserDaoImpl(SqlSessionFactory sqlSessionFactory) {
super();
this.sqlSessionFactory = sqlSessionFactory;
}
@Override
public User queryUserById(int id) {
// 创建SqlSession
SqlSession sqlSession = this.sqlSessionFactory.openSession();
// 执行查询逻辑
User user = sqlSession.selectOne("queryUserById", id);
// 释放资源
sqlSession.close();
return user;
}
@Override
public List<User> queryUserByUsername(String username) {
// 创建SqlSession
SqlSession sqlSession = this.sqlSessionFactory.openSession();
// 执行查询逻辑
List<User> list = sqlSession.selectList("queryUserByUsername", username);
// 释放资源
sqlSession.close();
return list;
}
@Override
public void saveUser(User user) {
// 创建SqlSession
SqlSession sqlSession = this.sqlSessionFactory.openSession();
// 执行保存逻辑
sqlSession.insert("saveUser", user);
// 提交事务
sqlSession.commit();
// 释放资源
sqlSession.close();
}
}
原始Dao开发中存在以下问题:
Dao方法体存在重复代码:从上面的代码来看的话,只有sqlSession调用特定的方法不同,那么其他的都是累赘。无论是,创建SqlSessionFactoryBuilder,加载SqlMapConfig.xml配置文件,创建SqlsessionFactory
都是比较累赘的。
再者说了,针对一个User,存在一个UserPodo,UserController,UserMapper.xml,UserService,UserDao。比以前多了一个文件,使得项目管理更加的复杂起来。所以这里推荐Mapper动态代理方式
二:Mapper动态代理方式 :它其实不是一个技术,而是一种开发规范
2.1 遵循以下这四个规范
接口方法名 = User.xml中的id名
返回值的类型与mapper.xml文件中的返回值类型要一致
方法的入参类型要与mapper.xml的入参数类型要一致
命名空间 绑定此接口
2.2 这里以User为例子
//创建一个User.java的接口
public interface UserMapper{
//遵循四个原则
//接口方法名 = User.xml中的id名
//返回值的类型与mapper.xml文件中的返回值类型要一致
//方法的入参类型要与mapper.xml的入参数类型要一致
//命名空间 绑定此接口
/*这里的传入参数,跟返回参数,方法名都是跟UserMapper.xml定义的一样*/
public User selectUserById(Integer id);
public void save(User user);
public List<User> selectUserByLikeName(String username);
public List<User> selectUserByLikeNameTwo(String username);
public List<User> selectUserByQueryVo(QueryVo queryVo);
}
<!-- namespace:命名空间,用于隔离sql,还有一个很重要的作用,后面会讲 -->
<mapper namespace="dgut.xiaozheng.mapper.UserMapper">
<!-- 保存用户信息 -->
<insert id="save" parameterType="user" useGeneratedKeys="true">
insert into tb_user(username,sex,age) values (#{username},#{sex},#{age})
</insert>
<!-- 通过id查找用户信息 -->
<select id="selectUserById" parameterType="Integer" resultType="user">
select * from tb_user where id = #{id}
</select>
<!-- 模糊名查询用户信息 -->
<select id="selectUserByLikeName" parameterType="string" resultType="user">
select * from tb_user where username like #{like}
</select>
<!-- 第二种方法,模糊查询用户信息 -->
<select id="selectUserByLikeNameTwo" parameterType="string" resultType="user">
select * from tb_user where username like '%${value}%'
</select>
<!-- two days -->
<select id="selectUserByQueryVo" parameterType="queryVo" resultType="user">
select * from tb_user where username like "%"#{user.username}"%"
</select>
</mapper>
//4、修改命名空间。命名空间直接映射的是UserMapper
<mapper namespace="dgut.xiaozheng.mapper.UserMapper">
2.3 写测试案例
@Test
public void testSelectUserByQueryVo(){
SqlSessionFactory sqlSessionFactory = MybatisUtilsForMe.getSqlSessionFactory();
SqlSession session = sqlSessionFactory.openSession();
//核心代码,getMapper()
UserMapper userMapper = session.getMapper(UserMapper.class);
QueryVo queryVo = new QueryVo();
User user = new User();
user.setUsername("欣");
queryVo.setUser(user);
List<User> userList = userMapper.selectUserByQueryVo(queryVo);
for (User user2 : userList) {
System.out.println(user2);
}
}
//它这里可以通过getMapper方法获取Mapper对象,然后直接就可以调用接口中的方法