springboot-3:数据库读写操作

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

 

参考课程:

https://www.imooc.com/learn/945

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值