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

一、基于注解的案例

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语句

@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对象才行

 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.方法名

List<User> users = session.selectList("IUserDao.findAll");

然后需要回到MybatisTest.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);
    }

注意声明为全局变量哦

private InputStream in;
private IUserDao userDao;

这里没有session对象所以也不需要释放它了只需要in.close
这里可以选择注释掉session.close();
或者是判断是否为空,否则会空指针报错

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

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

@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语句

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

(点个赞求求了)

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值