mybatis的两种Dao开发方式

使用MyBatis开发Dao,通常有两个方法,即原始Dao开发方法和Mapper动态代理开发方法

  1. 原始Dao

    使用MyBatis开发DAO实现以下的功能:根据用户id查询一个用户信息

    SqlSession中封装了对数据库的操作,如:查询、插入、更新、删除等。

    通过SqlSessionFactory创建SqlSession,而SqlSessionFactory是通过SqlSessionFactoryBuilder进行创建。

    SqlSessionFactoryBuilder用于创建SqlSessionFacoty,SqlSessionFacoty一旦创建完成就不需要SqlSessionFactoryBuilder了,因为SqlSession是通过SqlSessionFactory生产,所以可以将SqlSessionFactoryBuilder当成一个工具类使用,最佳使用范围是方法范围即方法体内局部变量。

    SqlSessionFactory是一个接口,接口中定义了openSession的不同重载方法,SqlSessionFactory的最佳使用范围是整个应用运行期间,一旦创建后可以重复使用,通常以单例模式管理SqlSessionFactory。

    SqlSession是一个面向用户的接口, sqlSession中定义了数据库操作方法。

    每个线程都应该有它自己的SqlSession实例。SqlSession的实例不能共享使用,它也是线程不安全的(因为SqlSession底层对应的是Connection连接)。因此最佳的范围是请求或方法范围

  • 编写映射文件如下

    <?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">

    <!-- namespace:命名空间,用于隔离sql -->

    <mapper namespace="test">

    <!-- 根据id查询用户 -->

    <select id="queryUserById" parameterType="Integer"

    resultType="com.mybatis.pojo.User">

    select * from user where id = #{id}

    </select>

    </mapper>

  • Dao接口

    public interface UserDao {

    /**

    * 根据id查询用户

    * @param id

    * @return

    */

    User queryUserById(int id);

    }

  • Dao实现类 publicclass UserDaoImpl implements UserDao {

    private SqlSessionFactory sqlSessionFactory;

    public UserDaoImpl(SqlSessionFactory sqlSessionFactory) {

    super();

    this.sqlSessionFactory = sqlSessionFactory;

    }

    @Override

    public User queryUserById(intid) {

    // 创建SqlSession

    SqlSession sqlSession = this.sqlSessionFactory.openSession();

    // 执行查询逻辑

    User user = sqlSession.selectOne("test.queryUserById", id);

    // 释放资源

    sqlSession.close();

    returnuser;

    }

    }

  • Dao测试publicclass UserDaoTest {

    private SqlSessionFactory sqlSessionFactory;

    @Before

    publicvoid init() throws Exception {

    // 创建SqlSessionFactoryBuilder

    SqlSessionFactoryBuilder sqlSessionFactoryBuilder = new SqlSessionFactoryBuilder();

    // 加载SqlMapConfig.xml配置文件

    InputStream inputStream = Resources.getResourceAsStream("SqlMapConfig.xml");

    // 创建SqlsessionFactory

    this.sqlSessionFactory = sqlSessionFactoryBuilder.build(inputStream);

    }

    @Test

    publicvoid testQueryUserById() {

    // 创建DAO

    UserDao userDao = new UserDaoImpl(this.sqlSessionFactory);

    // 执行查询

    User user = userDao.queryUserById(2);

    System.out.println(user);

    }

    }

  1. 动态代理 Mapper动态代理方式

Mapper 动态代理开发方式只需要程序员开发 Mapper 接口(相当于 Dao 接口),Mybatis框架会根据接口定义创建接口的动态代理对象,代理对象的方法同 Dao接口实现类中的方法。

  Mapper 接口开发需要遵循以下 4 个规范:

  • Mapper 映射文件中的 namespace 与 mapper 接口的类路径相同。
  • Mapper 接口方法名和 Mapper 映射文件中定义的每个 Sql 的 id 相同
  • Mapper 接口方法的输入参数类型和 Mapper 映射文件中定义的每个 Sql 的 ParameterType 的类型相同
  • Mapper 接口方法的输出参数类型和 Mapper 映射文件中定义的每个 Sql 的 resultType 的类型相同

   采用动态代理的方法开发

namespace必须写接口的全类名

id属性必须与接口中的方法名称一致

resultType:可以使用别名

parameterType:也可以使用别名

定义Mapper映射文件UserMapper.xml,放在resources的mapper目录下,

UserMapper.xml配置文件内容

<!-- namespace:命名空间,用于隔离sql -->

<!-- 还有一个很重要的作用,使用动态代理开发DAO,1. namespace必须和Mapper接口类路径一致 -->

<mapper namespace="com.wqy.mapper.UserMapper">

<!-- 查询所有用户 -->

<!-- 2. id必须和Mapper接口方法名一致 -->

<!-- 3. parameterType必须和接口方法参数类型一致 -->

<!-- 4. resultType必须和接口方法返回值类型一致 -->

创建UserMapper接口代码如下:

测试

public class UserMapperTest {

private SqlSessionFactory sqlSessionFactory;

@Before

public void init() throws Exception {

// 创建SqlSessionFactoryBuilder

SqlSessionFactoryBuilder sqlSessionFactoryBuilder = new SqlSessionFactoryBuilder();

// 加载SqlMapConfig.xml配置文件

InputStream inputStream = Resources.getResourceAsStream("SqlMapConfig.xml");

// 创建SqlsessionFactory

this.sqlSessionFactory = sqlSessionFactoryBuilder.build(inputStream);

}

@Test

public void testQueryUserById() {

// 获取sqlSession

SqlSession sqlSession = this.sqlSessionFactory.openSession();

// 从sqlSession中获取Mapper接口的代理对象

UserMapper userMapper = sqlSession.getMapper(UserMapper.class);

// 执行查询方法

List<User>users = userMapper.findAll();

//遍历users

  //......

sqlSession.close();

}

}

原文地址:https://www.cnblogs.com/Cyan-W/p/9865633.html

时间: 2024-12-18 03:19:28

mybatis的两种Dao开发方式的相关文章

关于MyBatis的两种写法

刚接触MyBatis是在Jike的视频中学习的,但是之后又发现和项目中的MyBatis的用法不太一致.上网找了好多资料,发现网上的教程分为两种写法: 第一种,是jike视频中的写法,写好map.xml文件之后,在MyBatis基本配置文件指定好这个map文件的位置后就直接 User user = (User) session.selectOne("selectUser", "3"); 第二种就是 mapper接口式,叫做面向接口编程. 先定义一个UserMapper

springmvc+mybatis的两种配置和应用方式

一.不用写dao层实现的方式 1.导入依赖包,我的pom.xml文件配置如下: <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/

mybatis的两种分页方式:RowBounds和PageHelper

原理:拦截器. 使用方法: RowBounds:在mapper.java中的方法中传入RowBounds对象. RowBounds rowBounds = new RowBounds(offset, page.getPageSize()); // offset起始行 // limit是当前页显示多少条数据 public List<ProdProduct> findRecords(HashMap<String,Object> map,RowBounds rowBounds); map

MyBatis中id回填的两种方式

在一种场景下需要刚刚插入数据的ID,如果数据少可以先看数据库,记下ID,但数据很多,假设一万个用户并发,每个用户都插入自己的ID,就很难记下来. 下面给定一个场景: 1 User user = new User("张三","123456",new Date());//此时user没有id 2 userDao.insertUser(user); 3 sqlSession.commit();//此时数据已经插入到数据库中,数据库中有id,但user依然没有id 4 Sy

app开发有两种方式!企业该如何选择适合自己的手机APP开发?

智能手机已经成为如今社会最重要的工具,各类App从各个角度重塑大家的生活,App自然也成为创业的人的首选,对于传统的企业来说,也需要开发自己的App抢占线上市场. ? 但是因为App开发技术门槛比较高,而且作为非标准化产品,所以价格不透明,从几千到几十万不等.本文,上海艾艺APP开发公司为大家进行分析市场上最常见的两种App开发方式,希望对大家有所帮助! ? 第一种:模板 ? 百度或者淘宝搜索App开发,我们会发现很多非常便宜的App模板,很多人发现需要的APP模式功能和模板类似,就直接购买.利

MyBatis开发Dao层的两种方式(Mapper动态代理方式)

MyBatis开发原始Dao层请阅读我的上一篇博客:MyBatis开发Dao层的两种方式(原始Dao层开发) 接上一篇博客继续介绍MyBatis开发Dao层的第二种方式:Mapper动态代理方式 Mapper接口开发方法只需要程序员编写Mapper接口(相当于Dao接口),由Mybatis框架根据接口定义创建接口的动态代理对象,代理对象的方法体同上一篇博客中Dao接口实现类方法. Mapper接口开发需要遵循以下规范: (1)Mapper.xml文件中的namespace与mapper接口的类路

常用的两种spring、mybatis 配置方式

在之前的文章中总结了三种方式,但是有两种是注解sql的,这种方式比较混乱所以大家不怎么使用,下面总结一下常用的两种总结方式: 一. 动态代理实现 不用写dao的实现类 这种方式比较简单,不用实现dao层,只需要定义接口就可以了,这里只是为了记录配置文件所以程序写的很简单: 1.整体结构图: 2.三个配置文件以及一个映射文件 (1).程序入口以及前端控制器配置 web.xml <?xml version="1.0" encoding="UTF-8"?> &

SpringBoot集成Mybatis实现多表查询的两种方式(基于xml)

 下面将在用户和账户进行一对一查询的基础上进行介绍SpringBoot集成Mybatis实现多表查询的基于xml的两种方式.   首先我们先创建两个数据库表,分别是user用户表和account账户表     user表:  account表:  然后创建实体类        **第一种通过创建子类的方式查询                             需求:查询所有的用户基础信息以及其所属的账户中的金额     1.创建想要得到多表查询数据的实体类(子类)            

mybatis“集合嵌套查询”和“集合嵌套结果”两种方法实现数据库一对多关系

两个实体类分别如下:User用户类和Goods商品类.一个用户对应多个商品(一对多) package com.leo.entity; import java.util.List; public class User { private Integer id; private String username; private Integer age; private String address; private List<Goods> goodsList; public List<Goo