Mapper和dao

在看公司项目的时候看到了XXX.javad的一个dao类接口对应的resource同名文件夹下有着XXXmapper.xml 和XXX.xml两个文件,当时就蒙了,于是赶紧又找资料来复习下这两种实现方式,并记之

(当然还有第三种方式通过开启注解扫描器然后通过@select等等注解直接加在java/dao接口的方法上,这里就不扩展来分享了)

 

目录

基础概念

SSM中的代码实现

方式一 mapper

方式二 dao

springboot中代码的实现

方式一 mapper

方式二 dao


 

基础概念

mapper和dao都是数据层进行crud的实现方式(Dao还有层持久层的意思,常见于web开发模型中),它们的本质在我理解上来看就是对jdbc进行了一层封装,屏蔽了底层的加载数据库驱动的重复的操作,让我们把更多的时间用在关注写和实现

 

SSM中的代码实现

SSM中mybatis的实现和springboot中mybatis的实现最大的不同也就是它们的maven依赖有所不同(其实底层基本一样,只是封装层略有不同)

以下是ssm中需要导入的依赖

        <dependency>
            <groupId>org.mybatis</groupId>
            <artifactId>mybatis</artifactId>
            <version>3.4.5</version>
        </dependency>

        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>5.1.6</version>
        </dependency>

 

方式一 mapper

首先来看看文件目录

先来看看IUserDao.java接口(原代码中方法很多,本文只通过查来介绍mapper和dao的区别)

public interface IUserDao {

    /**
     * 查询所有用户
     * @return
     */
    List<User> findAll();
}

再来看看IUserDao.xml,最明显的区别就是xml中使用了<mapper namespace=“”>,需要注意以下两点

  1. namespace命名空间,作用就是对sql进行分类化管理

  2. 在mapper代理方法开发的中,namespace=mapper接口地址

<?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="com.itheima.dao.IUserDao">

    <!-- 配置 查询结果的列名和实体类的属性名的对应关系 -->
    <resultMap id="userMap" type="uSeR">
        <!-- 主键字段的对应 -->
        <id property="userId" column="id"></id>
        <!--非主键字段的对应-->
        <result property="userName" column="username"></result>
        <result property="userAddress" column="address"></result>
        <result property="userSex" column="sex"></result>
        <result property="userBirthday" column="birthday"></result>
    </resultMap>


    <!-- 查询所有 -->
    <select id="findAll" resultMap="userMap">
        <!--select id as userId,username as userName,address as userAddress,sex as userSex,birthday as userBirthday from user;-->
        select * from user;
    </select>

那么仅仅是在.xml写好<mapper namespace=“”>程序就可以自动扫描并在调用dao接口的适合成功执行吗,当然不是的,还需要配置映射文件位置SqlMapConfig.xml,这里的${jdbc.driver}的取值来源于jdbcConfig.properties,其实也可以直接写真实值

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE configuration
        PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
        "http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
    <!--配置环境-->
    <environments default="mysql">
        <!-- 配置mysql的环境-->
        <environment id="mysql">
            <!-- 配置事务 -->
            <transactionManager type="JDBC"></transactionManager>

            <!--配置连接池-->
            <dataSource type="POOLED">
                <property name="driver" value="${jdbc.driver}"></property>
                <property name="url" value="${jdbc.url}"></property>
                <property name="username" value="${jdbc.username}"></property>
                <property name="password" value="${jdbc.password}"></property>
            </dataSource>
        </environment>
    </environments>
    <!-- 配置映射文件的位置 -->
    <mappers>
        <!--<mapper resource="com/itheima/dao/IUserDao.xml"></mapper>-->
        <!-- package标签是用于指定dao接口所在的包,当指定了之后就不需要在写mapper以及resource或者class了 -->
        <package name="com.itheima.dao"></package>
    </mappers>
</configuration>

 

最后在执行的适合加载配置文件,并调用方法,这里使用junit单元测试来实现

public class MybatisTest {

    private InputStream in;
    private SqlSession sqlSession;
    private IUserDao userDao;

    @Before//用于在测试方法执行之前执行
    public void init()throws Exception{
        //1.读取配置文件,生成字节输入流
        in = Resources.getResourceAsStream("SqlMapConfig.xml");
        //2.获取SqlSessionFactory
        SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(in);
        //3.获取SqlSession对象
        sqlSession = factory.openSession();
        //4.获取dao的代理对象
        userDao = sqlSession.getMapper(IUserDao.class);
    }

    @After//用于在测试方法执行之后执行
    public void destroy()throws Exception{
        //提交事务
        sqlSession.commit();
        //6.释放资源
        sqlSession.close();
        in.close();
    }


    @Test
    public void testFindAll(){
        //5.执行查询所有方法
        List<User> users = userDao.findAll();
        for(User user : users){
            System.out.println(user);
        }

    }
}

 

方式二 dao

最明显的区别就是增加了一步<bean id = "">需要注入spring容器,原因如下

 

通过dao方式开发的话,dao的实现类在实现接口的同时,需要继承SqlSessionDaoSupport类,这个类中有获取SqlSession的方法,因为sqlSessionFactory已经在beans.xml文件中配置好了(下面有写),spring会自动注入进去,继承了SqlSessionDaoSupport类就可以直接通过getSqlSession()方法来获取sqlSession。然后就可以操作数据库了。

上面也说了,要获取sqlSession必须得有sqlSessionFactory才行啊,这就需要spring来注入了,所以我们在beans.xml中配置一下该dao

<!-- 原始dao方法 -->
<bean id="userDao" class="ssm.dao.impl.UserDaoImpl">
    <property name="sqlSessionFactory" ref="sqlSessionFactory" />
</bean>

这段话为转载https://blog.csdn.net/eson_15/article/details/51684968

本文主要目的为大致复习区别,由于dao方式开发在目前基本用不到,想深刻理解其区别的同学直接点击进入大佬链接

 

springboot中代码的实现

与ssm区别,取mybatis包而代之的是springboot有自己的整合包mybatis-spring-boot-starter,封装了很多扫描的配置简化了开发

    <dependency>  
            <groupId>mysql</groupId>  
            <artifactId>mysql-connector-java</artifactId>  
    </dependency>  
        
    <dependency>  
            <groupId>org.mybatis.spring.boot</groupId>  
            <artifactId>mybatis-spring-boot-starter</artifactId>  
            <version>1.3.0</version>  
    </dependency>  

方式一 mapper

mapper文件配置一样,区别在于少了繁琐的SqlMapConfig.xml和单独的数据库配置文件jdbcConfig.properties

代替它们的是springboot启动默认扫描的配置文件application.properties


spring.datasource.driver-class-name=com.mysql.jdbc.Driver
spring.datasource.url=jdbc:mysql://localhost:3306/db_library
spring.datasource.username=root
spring.datasource.password=4008

mybatis.type-aliases-package=com.example.entity
mybatis.mapperLocations=classpath:mappers/*.xml

而最重要的mapper扫描在springboot也被浓缩成了一个注解@Mapper()加在主启动类上


/**
 * 指定所扫的包,会自动扫描指定包下的全部标有@Component的类,并注册成bean,
 * 当然包括@Component下的子注解@Service,@Repository,@Controller。
 * @author 85060
 *
 */
@SpringBootApplication(scanBasePackages={"com.itheima.*"})
@MapperScan("com.itheima.dao")
public class SpringBootDemoApplication {

    public static void main(String[] args) {
        SpringApplication.run(SpringBootDemoApplication.class, args);
    }
}
复制代码

 

方式二 dao

暂时空着,2021年springboot+dao的组合感觉比较少见了,如果遇到再来填坑

 

菜鸟复习文,如果有什么意见欢迎评论提出哟

 

  • 44
    点赞
  • 128
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值