JAVA程序树结构:
main
| ---------java.com.imooc.demo
| ---------config
| -----DataSourceConfiguration
| -----SessionFactoryConfiguration //此处读取了XML并使用mybatis将其设置为
| ---------dao
|------------- AreaDao.java //此处定义了interface() AreaDao,即若干个java函数,例如selectByid ,后续用于被别的JAVA代码调用
| -----------entity
|--------------- Area.java //此处定义了在调用SQL时需要用到
| -----------service
|--------AreaService.java //定义了interface() AreaService //这个类主要是供前端WEB页面操作数据库暴露的
|---------------impl
| -------- AreaServiceImpl.java //此处定义了AreaDao.java中的interface的多态中的一种。主要实现对areaDao这个实体类的操作(例如selectByid)
| -----------resource.mapper
|----------AreaDao.xml //使用mapper的注释来操作JDBC接口
注意事项:
1.AreaDao.java和AreaDao.XML的名字必须一样;且必须和mybatis-config.xml中的<mapper>一致
<mappers>
<mapper resource="mybatis/mapper/AreaDao.xml"/>
</mappers>
示例代码中并未配置mappers,但我自行撰写的代码中不配置会报错:
org.apache.ibatis.binding.BindingException: Invalid bound statement (not found): com.imooc.dao.AreaDao.queryArea
TEST代码调用关系:
1.直接调用AreaDao的interface接口(AreaDao中所有的方法都是对Area的对象的操作)
2.基于Mapper关联到对应的XML中的对应的SQL语句;并定义了读取的数据result赋值给哪个class
<mapper namespace="com.imooc.demo.dao.AreaDao">
<select id="queryArea" resultType="com.imooc.demo.entity.Area">
SELECT id,area FROM Area
</select>
3. select的数据会赋值给entity中的class Area所定义的对象。
@Test
public void testAQueryArea() {
List<Area> areaList = areaDao.queryArea();
// 验证预期值和实际值是否相符
assertEquals(2, areaList.size());
}
4.同理,如果是insert命令,则入参为Area所定义的对象
@Test
public void testBInsertArea() {
//创建一个区域对象
Area area = new Area();
area.setAreaName("测试区域");
area.setCreateTime(new Date());
area.setPriority(1);
//将该对象实例添加入库
int effectedNum = areaDao.insertArea(area);
问题:AreaDao的interface和Area的实体类什么关系?
答复:AreaDao中的每个函数的操作对象就是Area的实体类或者该实体类中的方法参数。
问题:AreaDao和Area定义的两个类的区别是?
答复:AreaDao这个类就是直接通过XML初始化的。(interface只是定义了基本的方法结构)
逻辑链路1:Java传递数据给Dao层
JAVA代码想操作数据库对象,该对象在JAVA中的体现方式是interface AreaDao
AreaDao的Dao层负责把数据映射到Area类的对应的参数(映射关系通过XML中的resultType字段关联到entity中的Area类)
然后将已经Set好参数的Area实体类,通过AreaDao层的方法传递给数据库。
int effectedNum = areaDao.insertArea(area);
逻辑链路2:Dao层如何将数据传递给SQL数据库
在dao/SessionFactoryConfiguration中定义了SqlSessionFactoryBean的类,这个类是Spring自带的一个类。其中帮助我们自动实现了性能优化+一致性检查。
注入第一步:@Bean封装为一个bean
注入第二步:Autowired或者Qualifier指定方式调用bean
AreaService.java中定义了interface AreaService,在AreaServiceImpl中完成了具体实现。
其中使用@Autowired调用AreaDao的接口
AreaService对外暴露的getAreaList()会在AreaServiceImpl完成具体实现,调用了AreaDao的方法queryAreaById。
注入:执行B代码时需要执行A代码;显式要在B中调用A。 现在可以吧A注入给B
sqlSessionFactory用于做事务的提交??
setmybatis文件--创建事务的SessionFactory
bean的命名:
预设置实体类+mybatis+jdbc+mapper
参考课程: