Mybatis通过 xml或注解的方式将要执行各种的statement配置起来,并通过java对象和statement中sql的动态参数进行映射生成最终执行的sql语句,最后由mybatis框架执行sql并将结果映射为java对象并返回
最好是创建一个新的project可以对比着来看,直接把原来src下文件夹覆盖过来
pom.xml里面配置的dependencies也复制过来
可以直接把IUserDao.xml文件直接删了
可以通过注解来配置,主配置文件是不能动滴(SqlMapConfig.xml)
在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文件夹内搞一个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语句
(点个赞求求了)
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。