做婚礼效果图的网站有哪些,空气能空调如何做网站,珠海企业医疗网站建设,安徽黄山旅游攻略框架整合spring的目的:把该框架常用的工具对象交给spring管理#xff0c;要用时从IOC容器中取mybatis对象。 在spring中应该管理的对象是sqlsessionfactory对象#xff0c;工厂只允许被创建一次#xff0c;所以需要创建一个工具类#xff0c;把创建工厂的代码放在里面… 框架整合spring的目的:把该框架常用的工具对象交给spring管理要用时从IOC容器中取mybatis对象。 在spring中应该管理的对象是sqlsessionfactory对象工厂只允许被创建一次所以需要创建一个工具类把创建工厂的代码放在里面后续直接调用工厂即可。 环境配置
先准备个数据库
CREATE TABLE student (id int NOT NULL,name varchar(30) COLLATE utf8mb3_bin DEFAULT NULL,age int DEFAULT NULL,PRIMARY KEY (id)
) ENGINEInnoDB DEFAULT CHARSETutf8mb3 COLLATEutf8mb3_bin
依赖引入:
!--spring需要的坐标--dependencygroupIdorg.springframework/groupIdartifactIdspring-context/artifactIdversion5.2.18.RELEASE/version/dependency!--2.mybatis需要的坐标--dependencygroupIdmysql/groupIdartifactIdmysql-connector-java/artifactIdversion8.0.31/version/dependencydependencygroupIdcom.alibaba/groupIdartifactIddruid/artifactId !--为mybatis配置的数据源--version1.2.8/version/dependencydependencygroupIdorg.mybatis/groupIdartifactIdmybatis/artifactIdversion3.5.3/version/dependency!--3.spring整合mybatis需要的--dependencygroupIdorg.springframework/groupIdartifactIdspring-jdbc/artifactIdversion5.1.9.RELEASE/version/dependencydependencygroupIdorg.mybatis/groupIdartifactIdmybatis-spring/artifactIdversion1.3.0/version/dependency
项目结构
创建相应的dao层service层,pojo层
pojo
对应数据库的student表的属性写相应的setter和getter还有tostring以及一个无参构造
public class seudent {private int id;private String name;private int age;public int getId() {return id;}public seudent() {}Overridepublic String toString() {return seudent{ id id , name name \ , age age };}public void setId(int id) {this.id id;}public String getName() {return name;}public void setName(String name) {this.name name;}public int getAge() {return age;}public void setAge(int age) {this.age age;}
}
dao层
实现对应的增删改查的接口语句还要写mapper映射与接口语句对应使mybatis能通过点的方式获取方法
public interface StudentDao {public ListStudent selectAll();public void insert(Student student);public int delete(int id);
}
映射文件StudentDao.xml
?xml version1.0 encodingUTF-8 ?
!DOCTYPE mapperPUBLIC -//mybatis.org//DTD Mapper 3.0//ENhttps://mybatis.org/dtd/mybatis-3-mapper.dtd
!--namespqce:名称空间id:sql语句的唯一标识resultType:返回结果的类型
--
mapper namespaceorg.example.dao.StudentDaoinsert idinsert parameterTypeorg.example.pojo.Studentinsert into student values(#{id},#{name},#{age});/insertdelete iddelete parameterTypeintdelete from student where id#{id};/deleteselect idselectAll resultTypeorg.example.pojo.Student parameterTypeorg.example.pojo.Studentselect * from student;/select/mapper
service层
需要操作持久层或实现查询需要与dao层的方法对应
先写接口方法
public interface StudentService {public ListStudent findAll();public void add(Student student);public int remove(int id);
}再写实现类需要调用Dao层的方法所以需要先获取一个StudentDao对象通过对象调用方法
package org.example.service.impl;import org.example.dao.StudentDao;
import org.example.pojo.Student;
import org.example.service.StudentService;import java.util.List;public class StudentServiceImpl implements StudentService {private StudentDao studentDao;public StudentDao getStudentDao() {return studentDao;}public void setStudentDao(StudentDao studentDao) {this.studentDao studentDao;}Overridepublic ListStudent findAll() {return studentDao.selectAll();}Overridepublic void add(Student student) {studentDao.insert(student);}Overridepublic int remove(int id) {return studentDao.delete(id);}
}配置applicationContext.xml
SqlSessionFactoryBean有一个必须属性dataSource另外其还有一个通用属性configLocation用来指定mybatis的xml配置文件路径。
其中dataSource使用阿里巴巴的druid作为数据源druid需要db.propertis文件的内容如下
jdbc.drivercom.mysql.cj.jdbc.Driver
jdbc.urljdbc:mysql://localhost:3306/test1
jdbc.usernameroot
jdbc.password234799 bean classorg.mybatis.spring.SqlSessionFactoryBeanproperty namemapperLocations valuemapper/*xml/ !--默认查找resources下xml--property namedataSource refdataSource/property nametypeAliasesPackage valueorg.example.pojo//bean!--使用阿里巴巴提供的druid作为数据源通过引入外部properties文件进行加载并使用${}参数占位符的方式去读取properties中的值--context:property-placeholder locationclasspath:db.properties/bean iddataSource classcom.alibaba.druid.pool.DruidDataSourceproperty namedriverClassName value${jdbc.driver}/property nameurl value${jdbc.url}/property nameusername value${jdbc.username}/property namepassword value${jdbc.password}//bean
还需要生成dao层接口实现类的bean对象
!--扫描接口包路径生成包下所有接口的代理对象并且放入spring容器中后面可以直接用自动生成mapper层(dao层)的代理对象--bean classorg.mybatis.spring.mapper.MapperScannerConfigurerproperty namebasePackage valueorg.example.dao//bean
还有service的接口实现类也要交给spring管理
service里面的依赖注入就交给spring来完成
!--spring管理其他bean studentDao是spring根据mybatis自动生成的对象--!--来自于MapperScannerConfigurer--bean classorg.example.service.impl.StudentServiceImpl idstudentServiceproperty namestudentDao refstudentDao//bean
在测试类中执行业务层操作
添加两个学生后查询一次所有元素输出然后删除一个学生后再一次查询一次所有元素输出成功输出如下图所示
public class Main {public static void main(String[] args) {ApplicationContext ctxnew ClassPathXmlApplicationContext(applicationContext.xml);StudentService studentService (StudentService)ctx.getBean(studentService);Student studentnew Student();student.setId(1);student.setName(yhy);student.setAge(18);Student student2new Student();student2.setId(2);student2.setName(yxc);student2.setAge(30);studentService.add(student);studentService.add(student2);ListStudent studentsstudentService.findAll();System.out.println(students);studentService.remove(2);studentsstudentService.findAll();System.out.println(students);}
} 以上就是用XML的方式spring整合mybatis在applicationContext中进行了mybatis工具类的相关配置不需要mybatis的配置文件
接下来就是用注解的方式整合mybatis
就是在上面的条件下把applicationContext.xml配置文件当中的内容转换成注解 第一步
将service层的bean对象改用注解和组件扫描的方式创建表现为将原本的service的bean标签去除并在studentserviceImpl中加个service注解并定义一个名字方便主函数中调用
(组件扫描就是把所有加了相应注解的东西放到容器中去) 对于studentserviceImpl中的stduentDao对象使用Autowired实现自动装配同时setter和getter方法也可以删除了 在主文件中使用组件名获取bean不再是使用bean标签里面的id属性去获取如下 第二步 新建一个配置类SpringConfig.calss而不是使用配置文件加上
Configuration 表明是一个配置类
ComponentScan(value {org.example}) 扫包的标签
然后将配置文件里面的bean全部移植到SpringConfig中去
首先是SqlSessionFactoryBean对象写一个方法返回该对象对于SqlSessionFactoryBean需要的属性都在里面一一赋予它对于datasource先暂时置为空下面要先完成datasource的bean管理加上一个bean放入容器管理 datasource的bean方法创建datasource依赖于外部的数据源druid所以又要先创建一个DruidDataSource的bean方法DruidDataSource又依赖于一个db.properties这里可以在配置类上使用一个注解PropertySource(db.properties)把需要的信息加载进来在里面再使用参数占位符${}的方式加载信息,再加上一个bean放入容器
ps:下面运行测试时发现不对劲不能使用PropertySource注解加载properties文件
上面第二步的依赖注入的流程图大概就是 第三步
将扫包的MapperScannerConfigurer也加入容器进行bean管理对于需要mapper接口的路径也一起作为参数给它 最后就是SpringConfig里面所有的信息
ps:经过下面测试三个方法都要加上static
Configuration
ComponentScan(value {org.example})
PropertySource(db.properties)
public class SpringConfig {Beanpublic static SqlSessionFactoryBean sqlSessionFactoryBean() throws IOException {SqlSessionFactoryBean sbeannew SqlSessionFactoryBean();sbean.setTypeAliasesPackage(org.example.pojo);sbean.setDataSource(druidDataSource());sbean.setMapperLocations(new PathMatchingResourcePatternResolver().getResources(classpath:mapper/*.xml));return sbean;}Beanpublic static DruidDataSource druidDataSource(){DruidDataSource dataSourcenew DruidDataSource();dataSource.setPassword(${jdbc.password});dataSource.setUsername(${jdbc.username});dataSource.setUrl(${jdbc.url});dataSource.setDriverClassName(${jdbc.driver});return dataSource;}Beanpublic static MapperScannerConfigurer mapperScannerConfigurer(){MapperScannerConfigurer mapperScannerConfigurer new MapperScannerConfigurer();mapperScannerConfigurer.setBasePackage(org.example.dao);return mapperScannerConfigurer;}
}
测试注解Spring整合mybatis的功能
测试里面出现了两个大的错误
第一个错误
Exception in thread main org.mybatis.spring.MyBatisSystemException: nested exception is org.apache.ibatis.exceptions.PersistenceException:
### Error querying database. Cause: org.springframework.jdbc.CannotGetJdbcConnectionException: Failed to obtain JDBC Connection; nested exception is java.sql.SQLException: ${jdbc.driver}
### The error may exist in file [F:\acwing——project\spring\tmp\mybatis_demo\spring02mybatis\target\classes\mapper\StudentDao.xml]
### The error may involve org.example.dao.StudentDao.selectAll
### The error occurred while executing a query 主要是Failed to obtain JDBC Connection; nested exception is java.sql.SQLException: ${jdbc.driver}
经过debug发现不知为什么不能使用
PropertySource(value {db.properties})
的方式引入properties文件后使用参数占位符只能使用字符串的方式
这是正确写法
第二个错误
该错误不会影响操作执行
Cannot enhance Configuration bean definition springConfig since its singleton instance has been created too early.
无法增强 Bean 定义 springConfigConfiguration因为它的单例实例创建得太早了。
经过查证是因为原因是当获取SqlSessionFactoryBean接口的bean时会调用SqlSessionFactoryBean()方法创建Bean,而调用该方法前同样需要先实例化SpringConfig,导致了SpringConfig在被增强之前被实例化了, 而如果把方法修饰为static,static方法属于类方法,就不会触发SpringConfig被提前实例化也就不会出现警告信息了.
在SpringConfig中的三个方法都是这种类型所以都要加上static。