mybatis spring 整合

这是我对mybatis和spring整合的第一次尝试。

1、数据库的建立

需要有对数据库的建立,才能对数据库中的信息进行查询。建表的sql语句可以参考我的一篇博客。

我的第一个mybatis程序

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就行了。

 

 

 

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值