在确保可运行项目能够正确无误地运行之后,再严格照着教程的步骤,对代码模仿一遍。模仿过程难免代码有出入,导致无法得到期望的运行结果,此时此刻通过比较正确答案 ( 可运行项目 ) 和自己的代码,来定位问题所在。采用这种方式,学习有效果,排错有效率,可以较为明显地提升学习速度,跨过学习路上的各个槛。
基于框架的程序要成功运行,对于JAR包的版本,配置文件的正确性有着苛刻的要求,任何一个地方出错了,都会导致框架程序运行失败。 请务必严格按照教程的指导,完全模仿操作,直到成功看到运行效果。 第一次成功之后,信心,思路都会有较好的铺垫,然后再根据自己的疑惑,在“成功”的代码上做原本想做的改动和调整,这样可以大大节约学习的时间,提高效率,切勿一来就擅自改动,给自己的学习制造障碍!!!
链接:https://pan.baidu.com/s/1AeRffxjm3wU6kegtrJxIGA?pwd=5w5g
提取码:5w5g
数据库内容:
create database db_mybatis;
use db_mybatis;
create table t_user(
id int(32) primary key auto_increment ,
username varchar(30) ,
jobs varchar(30) ,
phone varchar(16)
);
insert into t_user values(1,'zyy','teacher','18865123456');
insert into t_user values(2,'wrr','student','18865124567');
insert into t_user values(3,'xxc','student','18869872126');
一.整合环境搭建
1.准备所需要的jar包
(1).所需Spring框架的jar包
(2).所需MyBatis框架的jar包
(3).MyBatis与Spring整合所需的中间jar包
(4).数据库驱动jar包
(5).数据源所需jar包
2.编写配置文件
(1).db.properties
jdbc.driver=com.mysql.cj.jdbc.Driver
jdbc.url=jdbc:mysql://127.0.0.1:3306/db_mybatis
jdbc.username=root
jdbc.password=root
jdbc.maxTotal=30
jdbc.maxIdle=10
jdbc.initialSize=5
除了配置连接数据库的4个基本项外,还配置数据库连接池的最大连接数(maxTotal),最大空闲连接数(maxIdle)以及初始化连接数(initialSize)。
(2).applicationContext.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:jdbc="http://www.springframework.org/schema/jdbc"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:mvc="http://www.springframework.org/schema/mvc"
xsi:schemaLocation="
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-3.0.xsd
http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
http://www.springframework.org/schema/jdbc
http://www.springframework.org/schema/jdbc/spring-jdbc-3.0.xsd
http://www.springframework.org/schema/tx
http://www.springframework.org/schema/tx/spring-tx-3.0.xsd
http://www.springframework.org/schema/aop
http://www.springframework.org/schema/aop/spring-aop-3.0.xsd
http://www.springframework.org/schema/mvc
http://www.springframework.org/schema/mvc/spring-mvc.xsd">
<context:property-placeholder location="classpath:db.properties"/>
<!-- 配置数据源 -->
<bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
<property name="driverClassName" value="${jdbc.driver}" />
<property name="url" value="${jdbc.url}"/>
<property name="username" value="${jdbc.username}"/>
<property name="password" value="${jdbc.password}"/>
<property name="maxTotal" value="${jdbc.maxTotal}"/>
<property name="maxIdle" value="${jdbc.maxIdle}"/>
<property name="initialSize" value="jdbc.initalSize"/>
</bean>
<!-- 事务管理器,依赖于数据源 -->
<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource" ref="dataSource"/>
</bean>
<!-- 注册事务管理器驱动,开启事务注解 -->
<tx:annotation-driven transaction-manager="transactionManager"/>
<!-- 配置MyBatis工厂 -->
<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
<property name="dataSource" ref="dataSource"/>
<property name="configLocation" value="classpath:mybatis-config.xml"/>
</bean>
<!-- 配置实体类 -->
</beans>
(3).mybatis-config.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>
<!-- 配置别名 -->
<typeAliases>
<package name="po"/>
</typeAliases>
<mappers>
<!-- 配置指定mapper文件 -->
</mappers>
</configuration>
二.整合
1.传统DAO方式的开发整合
采用传统DAO开发方式进行MyBatis与Spring框架的整合时,我们需要编写DAO接口以及接口的实现类,并且需要向DAO实现类中注入SqlSessionFactory,然后在方法体内通过 SqlSessionFactory创建SqlSession。
SqlSessionTemplate:mybatis-spring的核心类,它负责管理MyBatis的SqlSession,调用MyBatis的SQL方法。当调用SQL方法时,SqlSessionTemplate将会保证使用的SqlSession和当前Spring的事务是相关的,他还管理SqlSession的生命周期,包含必要的管理,提交和回滚操作。
SqlSessionDaoSupport:一个抽象支持类,他继承DaoSupport类,主要是作为Dao的基类来使用,可以通过SqlSessiondaoSupport类的getSqlSession()方法来获取所需的SqlSession。
(1).在src目录下创建一个包命名为po,并在包下创建User类
package po;
public class User {
private Integer id;
private String username;
private String jobs;
private String phone;
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public String getJobs() {
return jobs;
}
public void setJobs(String jobs) {
this.jobs = jobs;
}
public String getPhone() {
return phone;
}
public void setPhone(String phone) {
this.phone = phone;
}
public String toString() {
return "User [id=" + id + ", username=" + username + ", jobs=" + jobs + ", phone=" + phone + "]";
}
}
(2).在po包下创建映射文件UserMapper.xml
<?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="po.UserMapper">
<!--根据用户编号获取用户信息 -->
<select id="findUserById" parameterType="Integer" resultType="User">
select * from t_user where id=#{id}
</select>
</mapper>
(3).在mybatis-config.xml中配置映射文件UserMapper.xml的位置
<mapper resource="po/UserMapper.xml"/>
(4).在src目录下创建一个包命名为dao,在包内创建UserDao接口,在接口内编写一个通过id查询用户的的方法findUserById()。
package dao;
import po.User;
public interface UserDao {
public User findUserById(Integer id) ;
}
(5).在src目录下创建一个包命名为impl,在包内创建UserDaoImpl类,在类中实现方法findUserById()。
package impl;
import dao.UserDao;
import po.User;
import org.mybatis.spring.support.SqlSessionDaoSupport;
public class UserDaoImpl extends SqlSessionDaoSupport implements UserDao {
public User findUserById(Integer id) {
return this.getSqlSession().selectOne("po.UserMapper.findUserById", id);
}
}
(6).在applicationContext.xml中编写实例化UserDaoImpl的配置
<bean id="userDao" class="impl.UserDao.Impl">
<property name="sqlSessionFactory" ref="sqlSessionFactory"/>
</bean>
(7).在src目录下创建包命名为test,在包内创建UserDaoTest01,并在类中编写测试方式.
package test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import dao.UserDao;
import mapper.UserMapper;
import po.User;
public class UserDaoTest01 {
public static void main(String[] args) {
ApplicationContext applicationContext=new ClassPathXmlApplicationContext("applicationContext.xml");
UserDao userDao=(UserDao)applicationContext.getBean("userDao");
//UserDao userDao=applicationContext.getBean(UserDao.class);
User user=userDao.findUserById(1);
System.out.println(user);
}
}
运行结果:
2.Mapper接口方式的开发整合
在MyBatis-Spring项目中,虽然使用传统的Dao开发方式可以实现所需功能,但是采用这种方式在实现类中会出现大量的重复的代码,在方法中也需要指定映射文件中执行语句的id,并且不能保证编写时id的正确性。为此,我们可以使用MyBatis提供的另一种编程方式,即使用Mapper接口编程。
(1).在src目录下创建一个包命名为mapper,在包内创建UserMapper接口以及对应的映射文件UserMapper.xml。
package mapper;
import po.User;
public interface UserMapper {
public User findUserById(Integer id);
}
<?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="mapper.UserMapper">
<!--根据用户编号获取用户信息 -->
<select id="findUserById" parameterType="Integer" resultType="User">
select * from t_user where id=#{id}
</select>
</mapper>
(2).在mybatis的配置文件中引入相应的映射文件
<mapper resource="po/UserMapper.xml" />
(3).在applicationContext.xml中设置相应的Bean
<bean id="userMapper2" class="org.mybatis.spring.mapper.MapperFactoryBean">
<property name="mapperInterface" value="mapper.UserMapper" />
<property name="sqlSessionFactory" ref="sqlSessionFactory" />
</bean>
(4).在test包下创建测试类UserDaoTest02
package test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import mapper.UserMapper;
public class UserDaoTest02 {
public static void main(String[] args) {
ApplicationContext applicationContext=new ClassPathXmlApplicationContext("applicationContext.xml");
UserMapper userMapper=(UserMapper)applicationContext.getBean("userMapper2");
po.User user= userMapper.findUserById(1);
System.out.println(user);
}
}
(5).基于MapperScannerConfigurer的整合
在实际项目中,Dao层会包含很多接口,如果每一个接口都要在Spring配置文件中配置,那么不仅会增加工作量,还会使得Spring配置文件很臃肿。为此,mybatis-spring团队提供了一种自动扫描的形式来配置MyBatis中的映射器——采用MapperScannerConfigurer类。MapperScannerConfigurer类的使用很简单,只需要在Spring中做以下配置:
<bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
<property name="basePackage" value="mapper" />
</bean>
在通常情况下,MapperScannerConfigurer类在使用时只需要通过basePackage属性指定需要扫描的包即可。spring会自动地通过包中接口生成映射器。这使得开发人员可以在编写很少代码的情况下完成对映射器的配置,从而提高开发效率。