Mybatis 编写了一大堆的类还有各种XML映射,终于完成了对JDBC的“进化”,但正因如此,它也无意间迈入了Spring的领域。
——技术因联动而更加强大。
观察Mybatis项目
翻开之前编写的Mybatis项目:https://blog.youkuaiyun.com/qq_44598153/article/details/105385021,首先映入眼帘的就是全局配置文件 mybatis.xml,其中的红圈部分是本次联动必不可少的部分:
回想学习Mybatis时,也是参照JDBC编写了这一动态映射。
再往下去看具体实现类中又引入了很多封装好的类,什么SqlSessionFactory、SqlSession一类的,如果查看源码研究它的构造器,可以尝试编写Spring的 bean,但那课程里用到了一个Jar,就省了吧何必费那劲, (以后研究各框架源码时再慢慢尝试)
Jar包处理
一个普通的Spring项目,先导核心容器外加一个日志Jar,这次还要导入一个Spring处理JDBC的 spring-jdbc-4.1.6.RELEASE.jar(手伸的确实长),将Mybatis项目中的核心包拿出,随后要导入mybatis-spring的Jar包,外加上需要的依赖的Spring里的 spring-tx-4.1.6.RELEASE.jar 包。完事之后大致是这样:
这里需要注意一个版本问题,中间儿我就被坑了一下。
开始编写XML映射
- 数据源封装类,该类位于spring-jdbc.jar包下,可以按照这个全类名顺藤摸瓜找到源码,按构造器成员编写完成映射,这一块就完成了对Mybatis全局配置文件的映射
-
<bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource"> <property name="driverClassName" value="com.mysql.jdbc.Driver"></property> <property name="url" value="jdbc:mysql://localhost:3306/testJDBC"></property> <property name="username" value="root"></property> <property name="password" value="123456"></property> </bean>
- 参照Mybatis项目编写的实体类,需要编写一个工厂bean用于构建SqlSessionFactory,原类位于mybatis-spring.jar 包下。
-
<bean id="factory" class="org.mybatis.spring.SqlSessionFactoryBean"> <property name="dataSource" ref="dataSource"></property> </bean>
- mybatis里映射文件的处理,这里的basePackage类似于mybatis里mapper的package,Spring会扫描这个包,给接口创建对象。第二个property引用了bean则是为了跟factory产生联动
-
<bean class="org.mybatis.spring.mapper.MapperScannerConfigurer"> <property name="basePackage" value="com.yang.mapper"></property> <property name="sqlSessionFactory" ref="factory"></property> </bean>
- 最后简单编写一个Service的Bean
-
<bean id="userService" class="com.yang.service.impl.userServiceImpl"> <property name="userMapper" ref="userMapper"></property> </bean>
开始实现
依照数据库的设计先创建一个userbean类,包含成员id、name、age、regtime
在mapper包下创建一个接口,当此包接受扫描时会为接口创建类对象,这一点就解释了为什么ApplicationContext下的getBeanDefinitionNames() 方法在查看所有对象是为什么会冒出来一个userMapper对象了
package com.yang.mapper;
import java.util.List;
import org.apache.ibatis.annotations.Select;
import com.yang.pojo.userbean;
public interface UserMapper {
@Select("select * from user")
List<userbean> selectAll();
}
随后编写Service的接口及实现类,仔细查看userServiceImpl 类下的成员里有一个UserMapper 类,这个类并不是程序员手工创建,进一步对应了上面的包扫描
package com.yang.service;
import java.util.List;
import com.yang.pojo.userbean;
public interface userService {
List<userbean> show();
}
//——————吴迪的分界线——————//
//——————下面是实现类——————//
package com.yang.service.impl;
import java.util.List;
import com.yang.mapper.UserMapper;
import com.yang.pojo.userbean;
import com.yang.service.userService;
public class userServiceImpl implements userService{
private UserMapper userMapper;
public UserMapper getUserMapper() {
return userMapper;
}
public void setUserMapper(UserMapper userMapper) {
this.userMapper = userMapper;
}
@Override
public List<userbean> show() {
// TODO Auto-generated method stub
return userMapper.selectAll();
}
}
最后是该项目的主类
package com.yang.Test;
import java.util.List;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import com.yang.pojo.userbean;
import com.yang.service.impl.userServiceImpl;
public class demo01 {
public static void main(String[] args) {
ApplicationContext ac=new ClassPathXmlApplicationContext("applicationContext.xml");
// String[] names=ac.getBeanDefinitionNames();
// for(String name:names) {
// System.out.println(name);
// }
userServiceImpl bean=ac.getBean("userService", userServiceImpl.class);
List<userbean> list=bean.show();
System.out.println(list);
}
}
控制台运行结果,获取成功,o der k:
无了无了