将MyBatis的SqlSessionFactory、数据源、Mapper的创建过程交给Spring去进行管理。
PART_ONE:环境配置
1.MyBatis环境jar包
2.Spring环境jar包
3.MyBatis和Spring整合的jar包
image.png
4.项目文件结构
image.png
5.编写Spring的核心配置文件ApplicationContext.xml
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:mvc="http://www.springframework.org/schema/mvc"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:aop="http://www.springframework.org/schema/aop" xmlns:tx="http://www.springframework.org/schema/tx"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-3.2.xsd
http://www.springframework.org/schema/mvc
http://www.springframework.org/schema/mvc/spring-mvc-3.2.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-3.2.xsd
http://www.springframework.org/schema/aop
http://www.springframework.org/schema/aop/spring-aop-3.2.xsd
http://www.springframework.org/schema/tx
http://www.springframework.org/schema/tx/spring-tx-3.2.xsd ">
<!-- 加载配置文件 -->
<context:property-placeholder location="classpath:db.properties" />
<!-- 数据源,使用dbcp -->
<bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource"
destroy-method="close">
<property name="driverClass" value="${jdbc.driver}" />
<property name="jdbcUrl" value="${jdbc.url}" />
<property name="user" value="${jdbc.username}" />
<property name="password" value="${jdbc.password}" />
</bean>
<!-- sqlSessinFactory -->
<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
<!-- 加载mybatis的配置文件 -->
<property name="configLocation" value="mybatis/SqlMapConfig.xml" />
<!-- 数据源 -->
<property name="dataSource" ref="dataSource" />
</bean>
<bean id="userDao" class="dao.UserDaoImpl">
<property name="sqlSessionFactory" ref="sqlSessionFactory"></property>
</bean>
<!-- mapper配置
MapperFactoryBean:根据mapper接口生成代理对象
-->
<!-- <bean id="userMapper" class="org.mybatis.spring.mapper.MapperFactoryBean">
<property name="mapperInterface" value="Mapper.UserMapper"></property>
<property name="sqlSessionFactory" ref="sqlSessionFactory"></property>
</bean> -->
<!-- mapper批量扫描,从mapper包中扫描出mapper接口,自动创建代理对象并且在spring容器中注册
遵循规范:将mapper.java和mapper.xml映射文件名称保持一致,且在一个目录 中
自动扫描出来的mapper的bean的id为mapper类名(首字母小写)
-->
<bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
<!-- 指定扫描的包名
如果扫描多个包,每个包中间使用半角逗号分隔
-->
<property name="basePackage" value="Mapper"/>
<property name="sqlSessionFactoryBeanName" value="sqlSessionFactory"/>
</bean>
</beans>
6.Mybatis的核心配置文件SqlMapConfig.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>
<!--配置单个xml文件-->
<mapper resource="sqlmap/User.xml"/>
<!--<mapper resource="mapperxml/UserMapper.xml"/>-->
<!-- 配置mapper接口class的方式 -->
<!--<mapper class="Mapper.UserMapper"/> -->
<!-- 批量导入的方式 -->
<package name="Mapper"/>
</mappers>
</configuration>
PART_TWO:dao方式的实现
image.png
1.将dao实现类中的sqlSessionFactory交给Spring创建并且配置dao实现类的bean,使用时通过spring进行实例化。
2.UserDao.java
package dao;
import entiy.User;
public interface UserDao {
public User selectUserById(int id);
}
3.UserDaoImpl.java
package dao;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.mybatis.spring.support.SqlSessionDaoSupport;
import entiy.User;
public class UserDaoImpl extends SqlSessionDaoSupport implements UserDao {
@Override
public User selectUserById(int id) {
SqlSession sqlsession = this.getSqlSession();
User user = sqlsession.selectOne("daomap.findUserById", id);
return user;
}
}
4.测试类
package test;
import org.junit.jupiter.api.Test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import dao.UserDao;
import entiy.User;
public class daoTest {
@Test
public void testDao() {
ApplicationContext applicationContext = new ClassPathXmlApplicationContext("classpath:spring/applicationContext.xml");
UserDao userdao = (UserDao) applicationContext.getBean("userDao");
User test = userdao.selectUserById(2);
System.out.println(test);
}
}
PART_THREE:Mapper方式的实现
image.png
1.Spring根据mapper接口生成代理
2.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">
<!-- namespace命名空间,作用就是对sql进行分类化管理,理解sql隔离
注意:使用mapper代理方法开发,namespace有特殊重要的作用
-->
<mapper namespace="Mapper.UserMapper">
<!-- 在 映射文件中配置很多sql语句 -->
<!-- 需求:通过id查询用户表的记录 -->
<!-- 通过 select执行数据库查询
id:标识 映射文件中的 sql
将sql语句封装到mappedStatement对象中,所以将id称为statement的id
parameterType:指定输入 参数的类型,这里指定int型
#{}表示一个占位符号
#{id}:其中的id表示接收输入 的参数,参数名称就是id,如果输入 参数是简单类型,#{}中的参数名可以任意,可以value或其它名称
resultType:指定sql输出结果 的所映射的java对象类型,select指定resultType表示将单条记录映射成的java对象。
-->
<select id="findUserById" parameterType="int" resultType="entiy.User">
select * from t_user where id =#{value}
</select>
<!--用户名模糊查询用户,${}表示拼接字符串,如果只需要传入简单类型,里面只能传value-->
<select id="findUserByName" parameterType="String" resultType="entiy.User">
select * from t_user where name like '%${value}%'
</select>
<!-- 添加用户,#{}中对应User中的变量 -->
<insert id="addUser" parameterType="entiy.User">
<!--查询刚插入的ID,只对sql的自增适用,id是保存在user中的意思-->
<selectKey keyProperty="id" order="AFTER" resultType="String">SELECT LAST_INSERT_ID()</selectKey>
<!--插入UUID-->
<!--<selectKey keyProperty="id" order="BEFORE" resultType="String">SELECT UUID()</selectKey>-->
insert into t_user (name,address) values (#{name},#{address})
</insert>
<!--删除用户-->
<delete id="deleteUserById" parameterType="int">
delete from t_user where id =#{id}
</delete>
<!-- 更新用户 -->
<update id="updateUser" parameterType="entiy.User">
update t_user set name=#{name},address=#{address} where id=#{id}
</update>
<!-- 用户综合查询 -->
<select id="findUserList" parameterType="entiy.UserQueryVo" resultType="entiy.UserCustom">
select * from t_user
<where>
<if test="usercustom!=null">
<if test="usercustom.address!=null and usercustom.address!=''">
and address = #{usercustom.address}
</if>
</if>
</where>
</select>
<!--自定义的resultMap-->
<resultMap type="entiy.User" id="userResultMap">
<id column="id_" property="id"/>
<result column="name_" property="name"/>
</resultMap>
<!-- 字段查询 -->
<select id="findUserResultMap" parameterType="int" resultMap="userResultMap" >
select id id_,name name_ from t_user where id = #{id}
</select>
</mapper>
3.UserMapper.java
package Mapper;
import java.util.List;
import entiy.User;
import entiy.UserCustom;
import entiy.UserQueryVo;
public interface UserMapper {
public User findUserById(int id);
public List<User> findUserByName(String name);
public void addUser(User user);
public void deleteUserById(int id);
public List<UserCustom> findUserList(UserQueryVo userQueryVo);
public List<User> findUserResultMap(int id);
}
4.测试类
package test;
import org.junit.jupiter.api.Test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import Mapper.UserMapper;
import entiy.User;
public class mapperTest {
@Test
public void testMap() {
ApplicationContext applicationContext = new ClassPathXmlApplicationContext("classpath:spring/applicationContext.xml");
UserMapper userMapper = (UserMapper) applicationContext.getBean("userMapper");
User test = userMapper.findUserById(3);
System.out.println(test);
}
}
注意:如果在applicationContext.xml中使用mapper的批量处理,遵循规范:将mapper.java和mapper.xml映射文件名称保持一致,且在一个目录中自动扫描出来的mapper的bean的id为mapper类名(首字母小写)。而且在SqlMapConfig.xml中不用配置UserMapper.xml如
image.png
欢迎大家进群
进群:可以领取免费的架构师学习资料。
进群:了解最新的学习动态
进群:了解最新的阿里,京东招聘资讯
进群:获取更多的面试资料
1、具有1-5工作经验的,面对目前流行的技术不知从何下手,需要突破技术瓶颈的可以加群。
2、在公司待久了,过得很安逸,但跳槽时面试碰壁。需要在短时间内进修、跳槽拿高薪的可以加群。
3、如果没有工作经验,但基础非常扎实,对java工作机制,常用设计思想,常用java开发框架掌握熟练的,可以加群。
4、觉得自己很牛B,一般需求都能搞定。但是所学的知识点没有系统化,很难在技术领域继续突破的可以加群。
5. 群号:835638062 点击链接加入群:https://jq.qq.com/?_wv=1027&k=5S3kL3v
6.阿里Java高级大牛直播讲解知识点,分享知识,上面五大专题都是各位老师多年工作经验的梳理和总结,带着大家全面、科学地建立自己的技术体系和技术认知!