是不是很多程序员觉得框架的整合跟自己没有关系,那是项目经理做的事。我们只要写业务代码就可以了?
今天面试了一个32岁的程序员,在问到spring是怎么整合mybatis的时候。
面试者:这种框架整合的都是项目经理做的,我们是直接在框架里面写业务代码的。
我:那有没有去了解这方面的整合,或者你现在自己可以把mybatis整合到spring容器里面吗?
面试者:不能,确实没有接触过。
我:那单独使用mybatis进行数据库连接呢?
面试者:没有单独使用过mybatis
我:那JDBC还记得吗?是怎么实现的?
面试者:那不就是连接数据库的吗?
我:具体连接步骤呢? 可以说说吗?
面试者:这东西好久没有接触了,忘记连接步骤了。
32岁如果还是只知道写业务代码,而不去努力扎实自己的编程基础,35岁真的很容易淘汰的。
我们今天就来具体分析下spring整合mybatis的步骤
1、首先mybatis是对JDBC的封装,所以mybatis一定要配置一个数据源。
2、mybatis是将sql语句单独写在xml文件中的,所以一定要有一个加载sql语句的配置。
3、mybatis中Dao的实现类是可以自动生成的,需要将sql语句的命名空间配置为dao接口的全限定名,sql语句的id必须和dao接口中的方法名一致。
下面是spring整合mybatis最基本的一个整合
spring配置文件
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context https://www.springframework.org/schema/context/spring-context.xsd">
<!--
把数据库的配置信息,写在一个独立的文件,编译修改数据库的配置内容
spring知道jdbc.properties文件的位置
-->
<context:property-placeholder location="classpath:jdbc.properties" />
<!--声明数据源DataSource, 作用是连接数据库的-->
<bean id="myDataSource" class="com.alibaba.druid.pool.DruidDataSource"
init-method="init" destroy-method="close">
<!--set注入给DruidDataSource提供连接数据库信息 -->
<!-- 使用属性配置文件中的数据,语法 ${key} -->
<property name="url" value="${jdbc.url}" /><!--setUrl()-->
<property name="username" value="${jdbc.username}"/>
<property name="password" value="${jdbc.passwd}" />
<property name="maxActive" value="${jdbc.max}" />
</bean>
<!--声明的是mybatis中提供的SqlSessionFactoryBean类,这个类内部创建SqlSessionFactory的
SqlSessionFactory sqlSessionFactory = new ..
-->
<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
<!--set注入,把数据库连接池付给了dataSource属性-->
<property name="dataSource" ref="myDataSource" />
<!--mybatis主配置文件的位置
configLocation属性是Resource类型,读取配置文件
它的赋值,使用value,指定文件的路径,使用classpath:表示文件的位置
-->
<property name="configLocation" value="classpath:mybatis.xml" />
</bean>
<!--创建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.zd.dao"/>
</bean>
<!--声明service-->
<bean id="studentService" class="com.zd.service.impl.StudentServicesImpl">
<property name="studentDao" ref="studentDao" />
</bean>
</beans>
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>
<!--settings:控制mybatis全局行为-->
<settings>
<!--设置mybatis输出日志-->
<setting name="logImpl" value="STDOUT_LOGGING"/>
</settings>
<!-- sql mapper(sql映射文件)的位置-->
<mappers>
<!--
name:是包名, 这个包中的所有mapper.xml一次都能加载
-->
<package name="com.zd.dao"/>
</mappers>
</configuration>
总结: 如果面试官问你spring整合mybatis的时候你会怎么回答呢?
我的思路是逆推的形式先说:1、mybatis单独使用的步骤。2、mybatis是对JDBC的封装,所以mybatis单独使用,需要加载哪些东西。3、根据mybatis单独使用的步骤来,解释spring为什么需要这样来整合mybatis。