mybatis框架之mybatis中dao层开发的两种方法
作者:盡盡
这篇文章主要介绍了mybatis框架之mybatis中dao层开发的两种方法,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
一、原始dao的开发方式
即开发dao接口和dao实现类。
首先添加Dao接口
public interface UserDao { // 1、 根据用户ID查询用户信息 public User findUserById(int id) throws Exception; // 2、 根据用户名称模糊查询用户列表 public List<User> findUsersByName(String name) throws Exception; // 3、 添加用户 public void insertUser(User user) throws Exception; }
然后实现其接口即可
public class UserDaoImpl implements UserDao { // 依赖注入,将工程在外面创建 private SqlSessionFactory sqlSessionFactory; public UserDaoImpl(SqlSessionFactory sqlSessionFactory) {//将外面创建的工厂传递进来(以后spring) this.sqlSessionFactory = sqlSessionFactory; } @Override public User findUserById(int id) throws Exception { // 创建SqlSession SqlSession sqlSession = sqlSessionFactory.openSession(); // 调用SqlSession的增删改查方法 // 第一个参数:表示statement的唯一标示 User user = sqlSession.selectOne("test.findUserById", id); System.out.println(user); // 关闭资源 sqlSession.close(); return user; } @Override public List<User> findUsersByName(String name) { // 创建SqlSession SqlSession sqlSession = sqlSessionFactory.openSession(); // 调用SqlSession的增删改查方法 // 第一个参数:表示statement的唯一标示 List<User> list = sqlSession.selectOne("test.findUsersByName", name); System.out.println(list); // 关闭资源 sqlSession.close(); return list; } @Override public void insertUser(User user) { // 创建SqlSession SqlSession sqlSession = sqlSessionFactory.openSession(); // 调用SqlSession的增删改查方法 // 第一个参数:表示statement的唯一标示 sqlSession.insert("test.insertUser", user); System.out.println(user.getId()); // 提交事务 sqlSession.commit(); // 关闭资源 sqlSession.close(); } }
那么在测试类中
public class UserDaoTest { private SqlSessionFactory sqlSessionFactory; @Before public void setUp() throws Exception { // 读取配置文件 // 全局配置文件的路径 String resource = "SqlMapConfig.xml"; InputStream inputStream = Resources.getResourceAsStream(resource); // 创建SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream); } @Test public void testFindUserById() throws Exception { // 创建UserDao UserDao dao = new UserDaoImpl(sqlSessionFactory); User user = dao.findUserById(1); System.out.println(user); } }
二、Mapper代理的开发方式
分析上面的代码会发现有大量的重复的模板代码,并且存在硬编码【如sqlSession.insert("test.insertUser", user);】,
为了解决以上问题,故采用开发mapper接口(相当于dao接口)来进行dao的开发,即通过开发mapper接口,将自动生成其代理类来进行操作。
其中Mapper代理使用的是jdk的代理策略。
如果采用Mapper代理的方式开发需要满足如下开发规范
- mapper接口的全限定名要和mapper映射文件的namespace值一致。
- mapper接口的方法名称要和mapper映射文件的statement的id一致。
- mapper接口的方法参数类型要和mapper映射文件的statement的parameterType的值一致,而且它的参数是一个。
- mapper接口的方法返回值类型要和mapper映射文件的statement的resultType的值一致。
首先开发mapper接口
public interface UserMapper { // 1、 根据用户ID查询用户信息 public User findUserById(int id) throws Exception; // 2、 添加用户 public void insertUser(User user) throws Exception; }
之后创建User的映射文件,在config下创建mapper目录然后创建UserMapper.xml(这是mybatis的命名规范,当然,也不是必须是这个名称)。
由其规范可以确定其映射文件如下
(接口在包com.itheima.mybatis.mapper.UserMapper下面):
<mapper namespace="com.itheima.mybatis.mapper.UserMapper"> <!-- 根据用户ID查询用户信息 --> <select id="findUserById" parameterType="int" resultType="User"> SELECT * FROM USER WHERE id =#{id} </select> <!-- 添加用户 --> <insert id="insertUser" parameterType="com.itheima.mybatis.po.User"> <selectKey keyProperty="id" resultType="int" order="AFTER"> SELECT LAST_INSERT_ID() </selectKey> INSERT INTO USER (username,birthday,sex,address) VALUES(#{username},#{birthday},#{sex},#{address}) </insert> </mapper>
之后将映射文件加到全局配置文件即可。
然后便可以进行测试
public class UserMapperTest { private SqlSessionFactory sqlSessionFactory; @Before public void setUp() throws Exception { // 读取配置文件 // 全局配置文件的路径 String resource = "SqlMapConfig.xml"; InputStream inputStream = Resources.getResourceAsStream(resource); // 创建SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream); } @Test public void testFindUserById() throws Exception { // 创建UserMapper对象 SqlSession sqlSession = sqlSessionFactory.openSession(); // 由mybatis通过sqlsession来创建代理对象 UserMapper mapper = sqlSession.getMapper(UserMapper.class); User user = mapper.findUserById(1); System.out.println(user); sqlSession.close(); } @Test public void testInsertUser() throws Exception { // 创建UserMapper对象 SqlSession sqlSession = sqlSessionFactory.openSession(); // 由mybatis通过sqlsession来创建代理对象 UserMapper mapper = sqlSession.getMapper(UserMapper.class); User user = new User(); user.setUsername("东哥hm19"); user.setAddress("宝盛西里24号楼"); mapper.insertUser(user); System.out.println(user.getId()); sqlSession.commit(); sqlSession.close(); } }
总结
以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。