MyBatis知识点复习-03Dao与Mapper代理实现
前面我们都是在使用sqlSession的方法,比如插入时,我们调用sqlSession.insert()我们传入了User.xml里面的select标签的id值"insertUser"作为方法名传入到sqlSession.insert()里面来,那么在本章节将不再使用sqlSession的这些方法((当然在讲dao时内部还会用到),而是新的方式,具体见下面
下一篇:MyBatis知识点复习-04全局配置文件的properties和alias的讲解
一.DAO讲解
这一部分是为了过渡到Mapper讲的实际开发不会写这个(当然如果你有Web的基础本部分会十分轻松)
实际上Dao只是三层架构中的第三层,即数据访问层,另外两层是web(界面)层与service(业务逻辑层)层
1.首先创建下面的目录与文件:
2.下面演示一下findUserById方法的实现
UserDaoImpl.java类代码:
package dao;
import domain.User;
import org.apache.ibatis.session.SqlSession;
public class UserDaoImpl implements UserDao {
SqlSession sqlSession;
public UserDaoImpl(SqlSession session){
sqlSession=session;
}
@Override
public User findUserById(String funcName,int id) {
User user = sqlSession.selectOne(funcName,id);
return user;
}
}
UserDao.java接口代码:
package dao;
import domain.User;
public interface UserDao {
public User findUserById(String funcName,int id);
}
删除Tset方法里面的内容使用下面代码
UserDaoImpl userDao = new UserDaoImpl(sqlSession);
User user = userDao.findUserById("findUserById", 10);
System.out.println(user);
sqlSession.commit();//提交事务,否则会事务回滚
其他的内容前面章节已经配置好了
二.DAO的Mapper代理实现
目录一我们讲解了编写dao接口UserDao,同时又手动编写了dao接口实现类UserDaoImpl类,下面的这种方式我们将不去手动实现这个接口的类,而是使用mapper代理的方式来实现
这一部分是本讲的核心内容
1.开发规范
1.mapper接口的全限定名要和mapper映射文件的namespace的值相同。
2.mapper接口的方法名称要和mapper映射文件中的statement的id相同;
3.mapper接口的方法参数只能有一个,且类型要和mapper映射文件中statement的parameterType的值保持一致。
4.mapper接口的返回值类型要和mapper映射文件中statement的resultType值或resultMap中的type值保持一致;
2.准备工作
下面红圈为新增的部分(如果你没看前面的章节你会觉得有很多多余的东西,甚至很懵逼)
首先创建下面的目录与文件:
然后SqlMapConfig.xml文件的<mappers>标签下面添加下面内容
<mapper resource="sqlMap/UserMapper.xml"></mapper>
UserMapper.java的内容:
package mapper;
import domain.User;
public interface UserMapper {
//返回插入后影响的行数
public int saveUser(User user);
}
根据上面的开发规范的3我们知道saveUser的参数只可以有一个
UserMap.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">
<mapper namespace="mapper.UserMapper">
<insert id="saveUser" parameterType="domain.User">
insert into user (username,birthday,sex,address) value(#{username},#{birthday},#{sex},#{address})
</insert>
</mapper>
注意事项:根据上面开发规范的1,2我们知道namespace的值必须是src目录下的接口的完整目录,在insert里的id必须是接口里面的方法名即saveUser,然后没指定resultType也一样可以返回int类型(即影响的行数)。
删除Tset方法里面的内容使用下面代码
User user = new User();
user.setBirthday(new Date());
user.setAddress("北京");
user.setUsername("李成");
user.setSex("男");
UserMapper mapper = sqlSession.getMapper(UserMapper.class);
mapper.saveUser(user);
sqlSession.commit();//提交事务,否则会事务回滚