知识点:
一、mybatis创建dao代理对象
StudentDao dao = sqlSession.getMapper(StudentDao.class);
List<Student> student = dao.selectStudents();
要使用dao对象,就要使用getMapper()方法。需要哪些条件:
- 获取SqlSession对象,需要使用SqlSessionFactory的openSession()方法。
- 而获取SqlSessionFactory对象,需要读取主配置文件。
所以在整合中需要改为由spring创建SqlSessionFactory和dao对象
二、mybatis主配置文件
- 数据库信息标签,在整合中,会使用独立的连接池替换mybatis默认自己带的,把连接池类也交给spring创建(如:阿里的druid连接池)
- mapper文件的位置信息标签
===========================================================================================
通过以上说明,得知需要让spring创建出以下3个对象:
- 独立的连接池类的对象,使用阿里的druid连接池
- SqlSessionFactory对象(由源代码可知SqlSession由SqlSessionFactory的openSession()方法获取,不需要创建对象,所以不用bean另外创建对象)
- dao对象
程序流程步骤:
-
新建maven项目
-
加入maven的依赖
1)spring依赖
2)mybatis依赖
3)单元测试依赖(模板自带)
4)mysql驱动
5)spring的事务的依赖
6)mybatis和spring集成的依赖:mybatis官方提供的,用来在spring项目中创建mybatis的SqlSessionFactory,dao对 象的。
-
创建实体类
-
创建dao类和mapper.xml文件
-
创建mybatis主配置文件
-
创建Service接口和实现类,属性是dao
-
创建spring的配置文件:声明mybatis的对象交给spring创建
1)数据源(写法固定)
2)SqlSessionFactory(写法固定,具体解释看个人总结)
3)Dao对象
4)声明自定义的service
-
创建测试类,获取Service对象,通过service调用dao完成数据库的访问
个人总结知识点:
-
dao包和service包的功能和关系:
dao:接口定义增删改查,xml文件实现增删改查等具体功能。
service:service实现类调用dao类增删改查功能,将实体类对象作为dao接口参数。来说就是service实现类将dao类和实体类综合起来,也可以增加一些判断或多个dao等(此时项目也只有这三个包)
-
spring创建SqlSesssionFactory对象:
String resource = "org/mybatis/example/mybatis-config.xml"; InputStream inputStream = Resources.getResourceAsStream(resource); SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
在mybatis中,创建SqlSesssionFactory对象需要读取主配置文件,而主配置文件中内容包括两个主要方面的内容(在mybatis中)数据源和其他mapper.xml文件的位置,在这里将数据库连接池赋给dataSource属性,将classpath:文件位置赋给configLocation属性
-
创建dao对象
<!-- 创建dao对象,需要使用SqlSession的getMapper(studentDao.class)--> <!-- mapperScannerConfigurer:在内部调用了getMapper()生成每个dao的代理对象--> <bean class="org.mybatis.spring.mapper.MapperScannerConfigurer"> <!-- 指定SqlSessionFactory对象的id--> <property name="sqlSessionFactoryBeanName" value="sqlSessionFactory"/> <!-- 指定包名,包名是dao接口所在的包名--> <!-- mapperScannerConfigurer会扫描这个包中的所有接口,把每个接口都执行一次getMapper()方法,得到每个接口的dao--> <!-- 对象,创建好的dao对象放入到spring容器中,dao对象名称默认是接口首字母小写--> <property name="basePackage" value="com.heyu.dao"/> </bean>
报错Bug:
一.命名空间
-
错误位置:代替原本dao接口的实现类的xml文件中的标签中的namespace属性
-
错误原因:用/分隔,应该用 . 分隔。另外bean标签中中若value用到分隔也是 . (点), 而标签用/
-
**知识点1:**命名空间:
1)定义mapper接口,面向接口编程。2)在大型项目中,可能存在大量的SQL语句,这时候为每个SQL语句起一个唯一的标识(ID)就变得并不容易了。为了解决这个问题,在MyBatis中,可以为每个映射文件起一个唯一的命名空间,这样定义在这个映射文件中的 每个SQL语句就成了定义在这个命名空间中的一个ID。只要我们能够保证每个命名空间中这个ID是唯一的,即使 在不同映射文件中的语句ID相同,也不会再产生冲突了。
**知识点2:**报错最后一句是最终定位的,所以看包错直接看最后一句。
二.pox.xml中数据库驱动依赖版本不兼容
报错:create connection SQLException, url: jdbc:mysql://localhost:3306/springdb, errorCode 1251, state 08004
com.mysql.jdbc.exceptions.jdbc4.MySQLNonTransientConnectionException: Client does not support authentication protocol requested by server; consider upgrading MySQL client
三.通配符的匹配很全面, 但无法找到元素 ‘context:property-placeholder’ 的声明
解决反法:
在Spring配置文件中出现通配符的匹配很全面, 但无法找到元素 ‘context:property-placeholder’ 的声明这个错误,其实主要是我们在引入命名空间时没有正确引入它的DTD解析文件,当然你必须在把Spring相应的包导入正确的情况下。
解决方案就是如下:
xmlns:context=“http://www.springframework.org/schema/context”
同时在xsi:schemaLocation这个字符串中添加context相关的解析文件
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-4.2.xsd。
其他的如util命名空间导入方式一样,只是把context换成相应util就可以了。
原文链接:https://blog.csdn.net/XinhuaShuDiao/article/details/84762242
四.jdbc配置文件中的username与mysql关键字冲突
报错: create connection SQLException, url: jdbc:mysql://localhost:3306/springdb, errorCode 1045, state 28000
java.sql.SQLException: Access denied for user ‘贺昱’@‘localhost’ (using password: YES)
报错位置:主配置文件中的数据源中的配置用户名的属性用通配符表示。
<property name="username" value="${b.username}"
报错描述,当没有b.时就会报上述错误,但是其他的没有问题
???
解决方法:jdbc配置文件中的username与mysql关键字冲突,将配置文件中的信息修改为下图
或者换个其他的名字也可以
![在这里插入图片描述](https://img-blog.csdnimg.cn/20201128231106538.png)
来源:https://blog.csdn.net/qq_48785525/article/details/110296142