前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Mybatis基于注解的案例 编写Dao实现类(实际开发不需要写)

Mybatis基于注解的案例 编写Dao实现类(实际开发不需要写)

原创
作者头像
韦恩少爷的背
修改2020-02-19 14:41:03
1K0
修改2020-02-19 14:41:03
举报
文章被收录于专栏:SSM框架学习

一、基于注解的案例

Mybatis通过 xml或注解的方式将要执行各种的statement配置起来,并通过java对象和statement中sql的动态参数进行映射生成最终执行的sql语句,最后由mybatis框架执行sql并将结果映射为java对象并返回

准备步骤

最好是创建一个新的project可以对比着来看,直接把原来src下文件夹覆盖过来

pom.xml里面配置的dependencies也复制过来

不需要配置文件!!!

可以直接把IUserDao.xml文件直接删了

可以通过注解来配置,主配置文件是不能动滴(SqlMapConfig.xml)

findAll方法举例说明

在IUserDao.java中

在findAll方法上写@Select注解,并指定sql语句

代码语言:java
复制
@Select("select * from user")
List<User> findAll();

再执行方法和原来效果一样

小归纳

mybatis基于注解的入门案例:

首先可以不采取配置文件,在dao接口的方法上使用@Select注解,并且指定SQL语句

同时需要在SqlMaoConfig.xml中mapper配置时,使用class属性指定dao接口的全限定类名。

明确的是:

我们在实际开发中,都是简便越好,所以都是采取不写dao实现类的方式。

不管使用xml还是注解配置

(但是Mybatis它是支持写dao实现类的

二、编写Dao实现类

最好也是新建个工程和以前一样,用最开始的案例!!!

不要删除配置文件哟!!

在dao文件夹内搞一个impl文件夹放一个UserDaoImpl继承对应接口

由于我们写了实现类,在Mybatis中第4步使用SqlSession创建Dao接口的代理对象就不需要了

得在MybatisTest下面能拿到session对象才行

代码语言:java
复制
 private SqlSessionFactory factory;
    public UserDaoImpl(SqlSessionFactory factory){
        this.factory=factory;
    }
    public List<User> findAll() {
        SqlSession session = factory.openSession();
        List<User> users = session.selectList();
        return users;
    }
    }

为了保证这个factory必须有值,重载一下构造参数就好了(覆盖默认构造函数)

这里由于返回的是List对象,用的是session的selectList

会报错别急因为括号内是需要值的

得把我们配置信息搞进去

这时候就需要namespace来定位

在IUserDao.xml中看得到

namespace.方法名

代码语言:javascript
复制
List<User> users = session.selectList("IUserDao.findAll");

然后需要回到MybatisTest.java中

代码语言:java
复制
    @Before//用于在测试方法执行方法执行之前执行
    public void init()throws Exception{
        //1.读取配置文件 目的是将SqlMapConfig.xml的信息加载进去
        in = Resources.getResourceAsStream("SqlMapConfig.xml");
        //2.创建SqlSessionFactory工厂
        SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(in);
        //3.使用工厂创建dao对象
        userDao =new UserDaoImpl(factory);
    }

注意声明为全局变量哦

代码语言:javascript
复制
private InputStream in;
private IUserDao userDao;

这里没有session对象所以也不需要释放它了只需要in.close

这里可以选择注释掉session.close();

或者是判断是否为空,否则会空指针报错

代码语言:java
复制
 @After//用于在方法执行之后执行
    public void destory()throws Exception{
        //提交事务
        if(sqlSession != null){
            sqlSession.commit();
            //6.释放资源
            sqlSession.close();
        }
        in.close();
    }

大家如果懒得改直接用下面这个就好了

代码语言:java
复制
@Test
    public void testFindAll() throws IOException {
        //1.读取配置文件 目的是将SqlMapConfig.xml的信息加载进去
        in = Resources.getResourceAsStream("SqlMapConfig.xml");
        //2.创建SqlSessionFactory工厂
        SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(in);
        //3.使用工厂创建dao对象
        IUserDao userDao=new UserDaoImpl(factory);
        List<User> users =userDao.findAll();
        for(User user: users){
            System.out.println(user);//打印的功能
    }
        in.close();
    }

成功!!!!执行发现和以前的功能一样!!

有没有意义呢???

不写实现类也可以实现功能

当然没意义!!!!

哈哈哈哈哈哈只是为了说清楚IUserDao.xml中namespace和id

光靠id没办法定位到方法中的sql语句

你只看到了第二层以为我在第一层?这一波我在第五层

(点个赞求求了)

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 一、基于注解的案例
    • 准备步骤
      • 不需要配置文件!!!
        • findAll方法举例说明
          • 小归纳
            • 明确的是:
            • 二、编写Dao实现类
              • 当然没意义!!!!
                • 你只看到了第二层以为我在第一层?这一波我在第五层
                领券
                问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档