今天学Mybatis的第二种 最常用的开发模式
(昨天的那种开发方式算是第一钟)
那么来看看,它们之间差别在哪
先,建立新项目Mybatis02
然后把配置文件弄好先
现在mapper表映射XML 不一定放 类里那个包里,它放的位置不固定。 现在我将它放在config文件夹里的一个新建文件夹mappers里 。
Mapper表映射XML文件:
···
每写完一个小的配置文件(既 mapper表映射XML) 都要到 mybatis配置文件XML 中 设置好路径
笔记 只要bulid Path 过的 文件夹 ,那么在写路径的时候就可以直接省去打 已build path过的文件夹名
接着补充上 mybatis配置文件XML
mybatis配置文件:
<?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="development">
<environment id="development">
<transactionManager type="JDBC"/>
<dataSource type="POOLED">
<property name="driver" value="com.mysql.jdbc.Driver"/>
<property name="url" value="jdbc:mysql://localhost:3306/hkgoods"/>
<property name="username" value="root"/>
<property name="password" value="123456"/>
</dataSource>
</environment>
</environments>
<mappers>
<mapper resource="mappers/mybatis-conf.xml"/>
</mappers>
</configuration>
现在进入今天主题-- 学习第二种mybatis开发方式
先新建一个接口
然后使mapper表映射XML 关联到 这个接口
具体操作:
把mapper映射文件XML 里的namespace 换为接口的全路径名称 ,我这里接口的全路径名称是:com.chen.dao.GoodsDao
而且select 标签中的id 一定要和接口里的方法名字相同,不然会报错。很重要
现在,开始新建个主入口类Mybatis_start
然后再将官网的相关那几行代码复制粘贴过去,再自行修改
String resource = "mybatis-config.xml";
InputStream inputStream = Resources.getResourceAsStream(resource);
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
public class Mybatis_start {
public static void main(String[] args) {
//创建一个sqlSession
String resource = "mybatis-config.xml";
InputStream inputStream = Resources.getResourceAsStream(resource);
//创建SqlSessionFactory
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
//true表示自动提交。否则需要使用commit方法才会提交。默认是false
SqlSession session = sqlSessionFactory.openSession(true);
//-----至此 sqlsesson对象创建完毕-------
//这里开始 ,用法不一样了。以前一个实体类对应一个映射文件XML就完事了。而现在改用接口了
// 原来的mybatis配置文件 注册方式没变,变的是使用方式
//---------------------------------
//创建接口对象。这个是session对象通过动态代理自动帮我们创建的;一定要有实现接口的类,不然这个接口方法没意义
//获得映射 ,下面参数里 需要你传入一个反射对象。 下面传入当前接口的反射对象;下面类型返回的是一个接口对象,然引用赋给左边
GoodsDao gd = session.getMapper(GoodsDao.class);
System.out.println(gd);
}
}
到这里我 调试运行时发什么一个错误 ,一直说找不到souce,为此我找了很久bug。
Error parsing SQL Mapper Configuration. Cause: java.io.IOException: Could not find resource /mappers/GoodsInfoMapper.xml
问题在于:
要把那个mappers文件夹 右键 build path ---include 。这样 它系统才能识别到里面的东西
···
package test;
import java.io.IOException;
import java.io.InputStream;
import java.util.List;
import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
import com.chen.GoodsInfo;
import com.chen.dao.GoodsDao;
public class Mybatis_start {
public static void main(String[] args) {
//创建一个sqlSession
String resource = "mybatis-conf.xml";
try {
InputStream inputStream = Resources.getResourceAsStream(resource);
//创建SqlSessionFactory
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
//true表示自动提交。否则需要使用commit方法才会提交。默认是false
SqlSession session = sqlSessionFactory.openSession(true);
//-----至此 sqlsesson对象创建完毕-------
//这里开始 ,用法不一样了。以前一个实体类对应一个映射文件XML就完事了。而现在改用接口了
// 原来的mybatis配置文件 注册方式没变,变的是使用方式
//---------------------------------
//创建接口对象。这个是session对象通过动态代理自动帮我们创建的;一定要有实现接口的类,不然这个接口方法没意义
//获得映射 ,下面参数里 需要你传入一个反射对象。 下面传入当前接口的反射对象;下面类型返回的是一个接口对象,然引用赋给左边
//Proxy 是代理的意思
GoodsDao gd = session.getMapper(GoodsDao.class);
//System.out.println(gd); 在这里为了检测下gd里存的是什么东西
//这里控制台输出的是: org.apache.ibatis.binding.MapperProxy@2ff4f00f
//使用创建好的接口对象来调用方法 ( gd.selOne("2")这返回的是个对象 )
GoodsInfo goods= gd.selOne("2");
System.out.println(goods.getName());
List<GoodsInfo> list =gd.selAll();
System.out.println(list.size());
}
catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
···
运行结果
总结
接口替代了dao层
表映射文件XML就 相当于你的接口实现类