在确保可运行项目能够正确无误地运行之后,再严格照着教程的步骤,对代码模仿一遍。模仿过程难免代码有出入,导致无法得到期望的运行结果,此时此刻通过比较正确答案 ( 可运行项目 ) 和自己的代码,来定位问题所在。采用这种方式,学习有效果,排错有效率,可以较为明显地提升学习速度,跨过学习路上的各个槛。
基于框架的程序要成功运行,对于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).所需Spring框架的jar包

(2).所需MyBatis框架的jar包

(3).MyBatis与Spring整合所需的中间jar包

(4).数据库驱动jar包

(5).数据源所需jar包

(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
- <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"/>
-
-
- <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
- configuration
- PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
- "http://mybatis.org/dtd/mybatis-3-config.dtd">
- <configuration>
- <typeAliases>
- <package name="po"/>
- typeAliases>
- <mappers>
-
- mappers>
- configuration>
采用传统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
- 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);
- }
-
- }
运行结果:
在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);
- }
- 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会自动地通过包中接口生成映射器。这使得开发人员可以在编写很少代码的情况下完成对映射器的配置,从而提高开发效率。