Mybaits深入了解(三)----mybatis开发Dao的方法

来源:互联网 发布:银行家算法的例题详解 编辑:程序博客网 时间:2024/06/08 14:09

  • 原始dao开发方法
    • dao的接口
    • dao的实现类
    • 测试程序
    • 原始dao开发问题
  • Mapper代理方法
    • Mapperxml映射文件
    • Mapperjava接口文档
    • 加载UserMapperxml文件
    • 测试

原始dao开发方法


    程序员写代码的时候,需要写dao接口和dao实现类。而且还需要向dao实现类中注入SqlSessionFactory,在方法体内通过SqlSessionFactory创建SqlSession。下面举个栗子:

dao的接口

package cn.itcast.mybatis.dao;import java.util.List;import cn.itcast.mybatis.po.User;/** * dao接口,用户管理 * @author Administrator * */public interface UserDao {    //根据Id查询用户信息    public User findUserById(int id) throws Exception;    //根据用户名查询用户列表    public List<User> findUserByName(String name) throws Exception;    //添加用户信息    public void insertUser(User user) throws Exception;    //删除用户信息    public void deleteUser(int id) throws Exception;}

dao的实现类

package cn.itcast.mybatis.dao;/** * dao接口实现类 */import java.util.Date;import java.util.List;import org.apache.ibatis.session.SqlSession;import org.apache.ibatis.session.SqlSessionFactory;import cn.itcast.mybatis.mapper.UserMapper;import cn.itcast.mybatis.po.User;public class UserDaoImpl implements UserDao {    //需要向dao实现类中注入SqlSessionFactory    //这里通过构造方法注入    private SqlSessionFactory sqlSessionFactory;    public UserDaoImpl(SqlSessionFactory sqlSessionFactory){        this.sqlSessionFactory=sqlSessionFactory;    }    public User findUserById(int id) throws Exception {        SqlSession sqlSession=sqlSessionFactory.openSession();        User user=sqlSession.selectOne("test.findUserById",id);        sqlSession.close();        return user;    }    public List<User> findUserByName(String name) throws Exception{        SqlSession sqlSession=sqlSessionFactory.openSession();        List<User> list=sqlSession.selectList("test.findUserByName",name);        sqlSession.close();        return list;    }    public void insertUser(User user) throws Exception {        SqlSession sqlSession=sqlSessionFactory.openSession();        sqlSession.insert("test.insertUser",user);        //提交事务        sqlSession.commit();        sqlSession.close();    }    public void deleteUser(int id) throws Exception {        SqlSession sqlSession=sqlSessionFactory.openSession();        sqlSession.insert("test.deleteUser",id);        //提交事务        sqlSession.commit();        sqlSession.close();    }}

测试程序

package cn.itcast.mybatis.dao;import static org.junit.Assert.*;import java.io.InputStream;import org.apache.ibatis.io.Resources;import org.apache.ibatis.session.SqlSessionFactory;import org.apache.ibatis.session.SqlSessionFactoryBuilder;import org.junit.Before;import org.junit.Test;import cn.itcast.mybatis.po.User;public class UserDaoImplTest {    private SqlSessionFactory sqlSessionFactory;    @Before    public void setUp() throws Exception {        //配置文件        String resource="SqlMapConfig.xml";        //得到配置文件流        InputStream inputStream=Resources.getResourceAsStream(resource);        // 使用SqlSessionFactoryBuilder从xml配置文件中创建SqlSessionFactory        sqlSessionFactory=new SqlSessionFactoryBuilder().build(inputStream);    }    @Test    public void testFindUserById() throws Exception{        //构造UserDao对象        UserDao userDao=new UserDaoImpl(sqlSessionFactory);        //调用UserDao的方法        User user=userDao.findUserById(1);        System.out.println(user);    }}

原始dao开发问题

  1. 在dao的接口实现类中出现大量的模板方法,比如上面的例子中每个方法中都有opensession,closesession的方法。
  2. 调用SqlSession方法时,将statement的Id硬编码了,每个方法中都需要写statement Id,如果名称发生变化,不利于修改。
  3. 调用SqlSession方法时,由于sqlSession的方法(selectOne,selectList…)使用泛型,即使传入的变量类型错误,在编译阶段也不报错。不利于开发。

    

Mapper代理方法


    Mapper接口开发方法只需要开发Mapper接口(相当于Dao接口),由Mybatis框架根据接口定义创建接口的动态代理对象,代理对象的方法体,同上边Dao接口实现类方法。
    Mapper接口开发需要遵循以下规范:

1、 Mapper.xml文件中的namespace与mapper接口的类路径相同。
2、 Mapper接口方法名和Mapper.xml中定义的每个statement的id相同
3、Mapper接口方法的输入参数类型和mapper.xml中定义的每个sql 的parameterType的类型相同
4、 Mapper接口方法的输出参数类型和mapper.xml中定义的每个sql的resultType的类型相同

    以上的规范主要是对下边的代码进行统一生成:

User user = sqlSession.selectOne("test.findUserById", id);sqlSession.insert("test.insertUser", user);

    

Mapper.xml(映射文件)

    定义mapper映射文件UserMapper.xml(内容同Users.xml),需要修改namespace的值为 UserMapper接口路径。将UserMapper.xml放在classpathmapper目录 下。

<?xml version="1.0" encoding="UTF-8" ?><!DOCTYPE mapperPUBLIC "-//mybatis.org//DTD Mapper 3.0//EN""http://mybatis.org/dtd/mybatis-3-mapper.dtd"><mapper namespace="cn.itcast.mybatis.mapper.UserMapper">

    

Mapper.java(接口文档)

/** * 用户管理mapper */Public interface UserMapper {    //根据用户id查询用户信息    public User findUserById(int id) throws Exception;    //查询用户列表    public List<User> findUserByUsername(String username) throws Exception;    //添加用户信息    public void insertUser(User user)throws Exception; }

    接口的定义有如下特点:

  • Mapper接口方法名和Mapper.xml中定义的statement的id相同
  • Mapper接口方法的输入参数类型和mapper.xml中定义的statement的parameterType的类型相同
  • Mapper接口方法的输出参数类型和mapper.xml中定义的statement的resultType的类型相同

    

加载UserMapper.xml文件

    修改SqlMapConfig.xml文件:

<!-- 加载映射文件 -->  <mappers>    <mapper resource="mapper/UserMapper.xml"/>  </mappers>

    

测试

Public class UserMapperTest extends TestCase {    private SqlSessionFactory sqlSessionFactory;    protected void setUp() throws Exception {        //mybatis配置文件        String resource = "sqlMapConfig.xml";        InputStream inputStream = Resources.getResourceAsStream(resource);        //使用SqlSessionFactoryBuilder创建sessionFactory        sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);    }    Public void testFindUserById() throws Exception {        //获取session        SqlSession session = sqlSessionFactory.openSession();        //获取mapper接口的代理对象        UserMapper userMapper = session.getMapper(UserMapper.class);        //调用代理对象方法        User user = userMapper.findUserById(1);        System.out.println(user);        //关闭session        session.close();    }    @Test    public void testFindUserByUsername() throws Exception {        SqlSession sqlSession = sqlSessionFactory.openSession();        UserMapper userMapper = sqlSession.getMapper(UserMapper.class);        List<User> list = userMapper.findUserByUsername("张");        System.out.println(list.size());    }Public void testInsertUser() throws Exception {        //获取session        SqlSession session = sqlSessionFactory.openSession();        //获取mapper接口的代理对象        UserMapper userMapper = session.getMapper(UserMapper.class);        //要添加的数据        User user = new User();        user.setUsername("张三");        user.setBirthday(new Date());        user.setSex("1");        user.setAddress("北京市");        //通过mapper接口添加用户        userMapper.insertUser(user);        //提交        session.commit();        //关闭session        session.close();    }}
3 0