这是我对mybatis和spring整合的第一次尝试。
1、数据库的建立
需要有对数据库的建立,才能对数据库中的信息进行查询。建表的sql语句可以参考我的一篇博客。
2、项目结构
pojo中的类是用来存入查到的学生信息。
dao中包含对数据访问的对象(data access object),该包下还含有对应的sql映射配置。
service包下是一些特定的服务的接口,实现一定的逻辑,由于本项目是一个入门程序,所以他的逻辑很简单,就是简单的调用数据访问对象(dao)的函数来访问数据。
service.impl包下是对服务接口的具体实现。
mybatis-config.xml为mybatis的配置,配置mapper.xml的位置信息,而数据源和数据管理器的配置放到了spring的配置文件中
spring-cfg.xml为spring的配置文件
3、pom.xml中所需依赖
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.luo.my</groupId>
<artifactId>mybatis-spring</artifactId>
<version>0.0.1-SNAPSHOT</version>
<packaging>jar</packaging>
<name>mybatis-spring</name>
<url>http://maven.apache.org</url>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
</properties>
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>3.8.1</version>
<scope>test</scope>
</dependency>
<!-- https://mvnrepository.com/artifact/org.springframework/spring-core -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-core</artifactId>
<version>5.0.8.RELEASE</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.springframework/spring-beans -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-beans</artifactId>
<version>5.0.8.RELEASE</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.springframework/spring-context -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>5.0.8.RELEASE</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.mybatis/mybatis -->
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.4.6</version>
</dependency>
<!-- https://mvnrepository.com/artifact/mysql/mysql-connector-java -->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.11</version>
</dependency>
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis-spring</artifactId>
<version>1.3.2</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.springframework/spring-tx -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-tx</artifactId>
<version>5.0.8.RELEASE</version>
</dependency>
<!-- https://mvnrepository.com/artifact/commons-dbcp/commons-dbcp -->
<dependency>
<groupId>commons-dbcp</groupId>
<artifactId>commons-dbcp</artifactId>
<version>1.4</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.springframework/spring-jdbc -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-jdbc</artifactId>
<version>5.0.8.RELEASE</version>
</dependency>
</dependencies>
</project>
4、spring配置spring-cfg.xml
配置了数据源,也开启了事务管理
<?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:aop="http://www.springframework.org/schema/aop"
xmlns:tx="http://www.springframework.org/schema/tx"
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/aop
http://www.springframework.org/schema/aop/spring-aop.xsd
http://www.springframework.org/schema/tx
http://www.springframework.org/schema/tx/spring-tx.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context.xsd">
<!-- 启用扫描机制,并指定扫描对应的包。该元素默认启动<context:annotation-config/> -->
<context:component-scan base-package="com.luo.my"/>
<!-- 数据库连接池 -->
<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource">
<property name="driverClassName" value="com.mysql.jdbc.Driver"/>
<property name="url" value="jdbc:mysql://localhost:3306/test"/>
<property name="username" value="root"/>
<property name="password" value="123456"/>
</bean>
<!-- 集成MyBatis -->
<bean id="SqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
<property name="dataSource" ref="dataSource"/>
<property name="configLocation" value="classpath:/mybatis-config.xml"/>
</bean>
<!-- 事务管理器配置 -->
<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource" ref="dataSource"/>
</bean>
<!-- 使用注解定义事务 -->
<tx:annotation-driven transaction-manager="transactionManager"/>
<!-- 采用自动扫描方式创建mapper bean -->
<bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
<property name="basePackage" value="com.luo.my"/>
<property name="SqlSessionFactoryBeanName" value="SqlSessionFactory"/>
<property name="annotationClass" value="org.springframework.stereotype.Repository"/>
</bean>
</beans>
5、mybatis配置mybatis-config.xml
需要配置Mapper.xml文件的位置
<?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>
<mappers>
<mapper resource="com/luo/my/dao/StudentMapper.xml"/>
</mappers>
</configuration>
6、程序代码
6.1、Student.java
这是一个pojo,用来存入sql语句查询到的数据
package com.luo.my.pojo;
public class Student {
private String Sno;
private String Sname;
private String Ssex;
private int Sage;
private String Sdept;
public void print() {
System.out.println("Sno:"+Sno);
System.out.println("Sname:"+Sname);
System.out.println("Ssex:"+Ssex);
System.out.println("Sage:"+Sage);
System.out.println("Sdept:"+Sdept);
}
public String getSno() {
return Sno;
}
public void setSno(String sno) {
Sno = sno;
}
public String getSname() {
return Sname;
}
public void setSname(String sname) {
Sname = sname;
}
public String getSsex() {
return Ssex;
}
public void setSsex(String ssex) {
Ssex = ssex;
}
public int getSage() {
return Sage;
}
public void setSage(int sage) {
Sage = sage;
}
public String getSdept() {
return Sdept;
}
public void setSdept(String sdept) {
Sdept = sdept;
}
}
6.2、StudentMapper.java
数据访问对象,具体的访问sql语句通过xml的方式配置,这里只是一个接口。同时注解为@Repository,被扫描时会被注入到容器当中。
package com.luo.my.dao;
import org.springframework.stereotype.Repository;
import com.luo.my.pojo.Student;
@Repository
public interface StudentMapper {
public Student selectStudent(String Sno);
}
6.3、StudentMapper.xml
与上面接口对应的sql语句
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.luo.my.dao.StudentMapper">
<select id="selectStudent" resultType="com.luo.my.pojo.Student">
select * from Student where Sno = #{id}
</select>
</mapper>
6.4、StudentService.java
一个特定服务的接口,由于本项目是个入门级程序,所以该服务很简单,只是象征性的写了这个接口。
package com.luo.my.service;
import com.luo.my.pojo.Student;
public interface StudentService {
public Student selectStudent(String sno);
}
6.5、StudentServiceImpl.java
对上述接口的实现,只是简单的调用dao对象的数据库访问语句。通过使用注解@Transaction表明这是一个事务,使用默认的隔离级别和传播行为。@Service表示这是一个服务bean。
package com.luo.my.service.impl;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import com.luo.my.dao.StudentMapper;
import com.luo.my.pojo.Student;
import com.luo.my.service.StudentService;
@Service
public class StudentServiceImpl implements StudentService{
@Autowired
private StudentMapper studentMapper;
@Override
@Transactional
public Student selectStudent(String sno) {
return studentMapper.selectStudent(sno);
}
}
6.6、测试类App.java
分别查询了两条数据,第二个学生的id是不存在,应该不会查到学生的。
package com.luo.my.mybatis_spring;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.AbstractApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import com.luo.my.pojo.Student;
import com.luo.my.service.StudentService;
/**
* Hello world!
*
*/
public class App
{
public static void main( String[] args )
{
ApplicationContext context=new ClassPathXmlApplicationContext("spring-cfg.xml");
StudentService studentService=context.getBean(StudentService.class);
Student student=studentService.selectStudent("201215122");
if(student!=null) {
student.print();
}else {
System.out.println("it's null");
}
Student student2=studentService.selectStudent("2022");
if(student2!=null) {
student2.print();
}else {
System.out.println("it's null");
}
((AbstractApplicationContext) context).close();
}
}
7、测试结果
由于第二条信息不存在,所以student2为null。
8、总结
在普通的mybatis程序中,SessionFactory是由SessionFactoryBuilder建立的。而与spring的整合中,是通过SessionFactoryBean来配置的,而且创建的bean类型是SessionFactory对象,不是SessionFactoryBean对象,下面是官网的说法:
对应的Mapper对象也不用我们手动获取,通过MapperScannerConfigurer的配置,会自动的帮我们将Mapper扫描到容器中。在真正融到该Mapper时只需要通过容器获取该Mapper就行了。