SSM之Mybatis Dao的基本写法和mapper代理

sqlSession 在哪使用

它是线程不安全的,因为它还处理数据域属性,因此使用在方法体内使用,当成局部变量使用

1、原始dao实现

思路:需要向dao实现类中注入sqlfactory ,然后在方法体内通过selfactory创建session。

实现类:

public class UserDaoImpl implements UserDao {

    //注入SqlSessionFactory
    private SqlSessionFactory sqlSessionFactory;
    //暂且通过构造函数进行注入
    public UserDaoImpl(SqlSessionFactory sqlSessionFactory) {
        this.sqlSessionFactory = sqlSessionFactory;
    }

 @Override
    public User findUserById(int id) throws Exception {
        // 线程不安全,因此通过方法体创建
        SqlSession sqlSession = sqlSessionFactory.openSession();
        User user = sqlSession.selectOne("test.findUserById",id);
        sqlSession.close();
        return user;
    }
}

问题在哪?

1、dao接口实现类的方法存在大量重复代码。
2、调用sqlsession方法时将statement的参数硬编码了。
3、调用sqlsession方法时,由于使用泛型,在编译阶段不会判断参数类型问题

2、mapper代理实现

第一步:创建UserMapper.java 接口
public interface UserMapper {
      User findUserById(int id) throws  Exception;
}
第二步: 创建userMapper.xml配置文件(在普通的dao实现中,也是需要),命名空间namespace等于UserMapper.java的地址
<mapper namespace="cn.itcast.mybatis.sqlMapper.UserMapper">
第三步:接口的方法定义,满足以下规范:
  1. 方法的名称等于xml中的id

  2. java中 方法的 输入参数和返回值 和 xml 中parametertype 和resulttype 一致

第四步:再把userMapper.xml配置文件写入核心配置文件中。

测试一下

@Test
    public void testMapperDao() throws Exception {
        // mybatis配置文件
        String resource = "SqlMapConfig.xml";
        // 得到配置文件流
        InputStream inputStream =  Resources.getResourceAsStream(resource);
        //创建会话工厂,传入mybatis配置文件的信息
        SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);

        //需要获得session对象
        SqlSession sqlSession = sqlSessionFactory.openSession();
        // 用对象开启mapper
        UserMapper userMapper = sqlSession.getMapper(UserMapper.class);
        // 通过userMapper调用方法,等价于调用daoImpl的实现
        User user = userMapper.findUserById(1);
        System.out.println(user.toString());

    }

显示成功

User [id=1, username=王五, sex=2, birthday=null, address=null]

这时有两个问题需要思考?

问题1 如果返回是多个User怎么办?

解决:mapper代理会根据接口方法的返回值,内部自动选择调用selectOne 或者 selectList。

public interface UserMapper {
      //查
      User findUserById(int id) throws  Exception;
      List<User> findUserByName(String name) throws Exception;

      // 增
      void insertUser(User user) throws Exception;

      //删
      void deleteUserById(int id) throws Exception;

      //更新
      void updateUser(User user) throws Exception;
}

问题2:输入的参数只能有一个,因为配置文件中的paramtype只能对应一个。如果希望传入多个参数怎么办?

解决是:把参数封装成类,然后通过parameterType引入。

猜你喜欢

转载自blog.csdn.net/qq_37591656/article/details/86375535