SM整合(spring,mybatis)

导读:本篇文章讲解 SM整合(spring,mybatis),文章出自:https://blog.csdn.net/weixin_43316702/article/details/105889225希望对大家有帮助,欢迎收藏,转发!站点地址:www.javazhiyin.com.com

>>强大,10k+点赞的 SpringBoot 后台管理系统竟然出了详细教程!

SM整合
SM整合就是spring框架与mybatis框架的整合,这是在SSM框架整合前会学习到的知识。
整合需知:
mybatis的配置与增删查改操作
因为mybatis是对数据库的操作,这方面是一定需要知道的,然后就是spring的配置文件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: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/context 
                           http://www.springframework.org/schema/context/spring-context.xsd">

    <!--加载java的配置文件-->
    <context:property-placeholder location="db.properties"/>

    <!--创建数据源 记得导入dbcp的包哟-->
    <bean id="dataSource" class="org.apache.commons.dbcp2.BasicDataSource" destroy-method="close">
        <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="maxActive" value="10" />-->
        <property name="maxIdle" value="5" />
    </bean>

    <!--SqlSessionFactory-->
    <bean id="sqlSessionFactoryId" class="org.mybatis.spring.SqlSessionFactoryBean">
        <!--配置mybatis核心配置文件-->
        <property name="configLocation" value="classpath:mybatis/SqlMapConfig.xml"/>
        <!--配置数据源-->
        <property name="dataSource" ref="dataSource"/>
    </bean>

    <!--原始方式开发dao,配置dao到spring中-->
    <bean id="userDaoId" class="com.sm.dao.impl.UserDaoImpl">
        <!--配置sqlSessionFactory-->
        <property name="sqlSessionFactory" ref="sqlSessionFactoryId"/>
    </bean>

    <!-- Mapper代理的方式开发方式一,配置Mapper代理对象 -->
    <bean id="userMapper" class="org.mybatis.spring.mapper.MapperFactoryBean">
        <!-- 配置Mapper接口 -->
        <property name="mapperInterface" value="com.sm.mapper.UserMapper" />
        <!-- 配置sqlSessionFactory -->
        <property name="sqlSessionFactory" ref="sqlSessionFactoryId" />
    </bean>

</beans>

【在这部分中spring的工作就是配置数据库连接和配置数据库操作对象(两种方式:配置dao到spring、配置mapper代理对象)】

mybatis配置文件:
SqlMapConfig.xml:
注意:【原本在mybatis的数据库连接工作交给了spring来完成】
这个文件只需要进行加载映射文件即可

<?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="com.sm.po"/>
    </typeAliases>

    <!--加载映射文件-->
    <mappers>
        <mapper resource="mybatis/sqlmap/User.xml"/>
        <mapper resource="mybatis/mapper/UserMapper.xml"/>
        <!--&lt;!&ndash;批量加载映射文件&ndash;&gt;-->
        <!--<package name="com.sm.mapper"/>-->
    </mappers>
</configuration>

log4j.properties:

# Global logging configuration
log4j.rootLogger=DEBUG, stdout
# Console output...
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern=%5p [%t] - %m%n

db.properties:

jdbc.driver = com.mysql.jdbc.Driver
jdbc.url = jdbc:mysql://localhost:3306/mybatis_01?useUnicode=true&amp;characterEncoding=UTF-8
jdbc.username = root
jdbc.password = 123

分两种方法:
第一种:原始Dao
User.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代理时,它具有特殊及重要的作用-->
<mapper namespace="com.mybatis.dao.UserDao">
    <!-- 根据用户ID查询用户信息-->
    <!-- select:表示一个MappingStatement对象-->
    <!-- id:statement的唯一标识-->
    <!-- #{}:表示一个占位符?-->
    <!-- #{id}:里面的id表示输入参数的参数名称,如果该参数是简单类型,那么#{}里面的参数名称可以任意-->
    <!-- parameterType:输入参数的java类型-->
    <!-- resultType:输出结果的所映射的java类型(单条结果所对应的的java类型)-->
    <select id="findUserById" parameterType="int" resultType="com.sm.po.User">
        SELECT * FROM USER WHERE id =#{id}
    </select>
    <!--查询全部-->
    <select id="findUserAll" resultType="com.sm.po.User">
        SELECT * FROM USER
    </select>
    <!--通过username查找用户-->
    <select id="findUserByUsername" parameterType="String" resultType="com.sm.po.User">
        select * from user where username like '%${value}%'
    </select>
    <!-- 新增用户 -->
    <insert id="insertUser" parameterType="com.sm.po.User">
        <!-- selectKey 标签实现主键返回 -->
        <!-- keyColumn:主键对应的表中的哪一列 -->
        <!-- keyProperty:主键对应的pojo中的哪一个属性 -->
        <!-- order:设置在执行insert语句前执行查询id的sql,孩纸在执行insert语句之后执行查询id的sql -->
        <!-- resultType:设置返回的id的类型 -->
        <selectKey keyColumn="id" keyProperty="id" order="AFTER" resultType="int">
            SELECT LAST_INSERT_ID()
        </selectKey>
		INSERT INTO `user`
		(username,birthday,sex,address) VALUES (#{username},#{birthday},#{sex},#{address})
	</insert>
    <!-- 更新用户 -->
    <update id="updateUserById" parameterType="com.sm.po.User">
	UPDATE `user` SET
	username = #{username} WHERE id = #{id}
    </update>
    <!-- 删除用户 -->
    <delete id="deleteUserById" parameterType="int">
		delete from user where id=#{id}
	</delete>
</mapper>

UserDao接口:【注意方法名需对应User.xml中的对应操作的名称】

package com.sm.dao;

import com.sm.po.User;
import java.util.List;

public interface UserDao {
    //通过id查找用户信息
    User findUserById(Integer id);

    //查找所有用户信息
    List<User> findUserAll();

    //通过username查找用户信息
    List<User> findUserByUsername(String username);

    //新增用户
    void insertUser(User user);

    //通过id更新username
    void updateUserById(User user);

    //通过id删除指定用户
    void deleteUserById(Integer id);
}

UserDaoImpl实现类:【只进行了查找操作,其他操作照着写即可】

package com.sm.dao.impl;

import com.sm.dao.UserDao;
import com.sm.po.User;
import org.apache.ibatis.session.SqlSession;
import org.mybatis.spring.support.SqlSessionDaoSupport;

import java.util.List;

public class UserDaoImpl extends SqlSessionDaoSupport implements UserDao {

    @Override
    public User findUserById(Integer id) {
        //获取SqlSession
        SqlSession sqlSession = super.getSqlSession();
        //使用SqlSession执行操作
        User user = sqlSession.selectOne("findUserById",id);
        //不要关闭sqlSession

        return user;
    }

    @Override
    public List<User> findUserAll() {
        //获取SqlSession
        SqlSession sqlSession = super.getSqlSession();
        //使用SqlSession执行操作
        List<User> list = sqlSession.selectList("findUserAll");
        //不要关闭sqlSession
        return list;
    }

    @Override
    public List<User> findUserByUsername(String username) {
        return null;
    }

    @Override
    public void insertUser(User user) {
    }

    @Override
    public void updateUserById(User user) {
    }

    @Override
    public void deleteUserById(Integer id) {
    }
}

测试类:

package com.sm.test;

import com.sm.dao.UserDao;
import com.sm.po.User;
import org.junit.Before;
import org.junit.Test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

import java.util.List;

public class UserDaoTest {
    private ApplicationContext context;

	//获得 Spring 中定义的 Bean 实例(对象) 
    @Before
    public void setUp(){
        this.context = new ClassPathXmlApplicationContext("classpath:spring/applicationContext.xml");
    }

	//获取bean实例进行操作
    @Test
    public void testFindUserId(){
        UserDao userDao = this.context.getBean("userDaoId",UserDao.class);

        User user = userDao.findUserById(1);
        System.out.println(user);
    }

    @Test
    public void testFindUserAll(){
        UserDao userDao = this.context.getBean("userDaoId",UserDao.class);

        List<User> list = userDao.findUserAll();
        for (User user:list){
            System.out.println(user);
        }
    }
}

第二种方法:mapper代理
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:命名空间,用于隔离sql -->
<!-- 还有一个很重要的作用,使用动态代理开发DAO1. namespace必须和Mapper接口类路径一致 -->
<mapper namespace="com.sm.mapper.UserMapper">
    <!-- 根据用户ID查询用户信息-->
    <!-- select:表示一个MappingStatement对象-->
    <!-- id:statement的唯一标识-->
    <!-- #{}:表示一个占位符?-->
    <!-- #{id}:里面的id表示输入参数的参数名称,如果该参数是简单类型,那么#{}里面的参数名称可以任意-->
    <!-- parameterType:输入参数的java类型-->
    <!-- resultType:输出结果的所映射的java类型(单条结果所对应的的java类型)-->
    <select id="findUserById" parameterType="int" resultType="com.sm.po.User">
        SELECT * FROM USER WHERE id =#{id}
    </select>
    <!--查询全部-->
    <select id="findUserAll" resultType="com.sm.po.User">
        SELECT * FROM USER
    </select>
    <!--通过username查找用户-->
    <select id="findUserByUsername" parameterType="String" resultType="com.sm.po.User">
        select * from user where username like '%${value}%'
    </select>
    <!-- 新增用户 -->
    <insert id="insertUser" parameterType="com.sm.po.User">
        <!-- selectKey 标签实现主键返回 -->
        <!-- keyColumn:主键对应的表中的哪一列 -->
        <!-- keyProperty:主键对应的pojo中的哪一个属性 -->
        <!-- order:设置在执行insert语句前执行查询id的sql,孩纸在执行insert语句之后执行查询id的sql -->
        <!-- resultType:设置返回的id的类型 -->
        <selectKey keyColumn="id" keyProperty="id" order="AFTER" resultType="int">
            SELECT LAST_INSERT_ID()
        </selectKey>
		INSERT INTO `user`
		(username,birthday,sex,address) VALUES (#{username},#{birthday},#{sex},#{address})
	</insert>
    <!-- 更新用户 -->
    <update id="updateUserById" parameterType="com.sm.po.User">
	UPDATE `user` SET
	username = #{username} WHERE id = #{id}
    </update>
    <!-- 删除用户 -->
    <delete id="deleteUserById" parameterType="int">
		delete from user where id=#{id}
	</delete>
    <!-- 根据条件查询用户 -->
    <select id="queryUserByWhere" parameterType="com.sm.po.User" resultType="com.sm.po.User">
        SELECT id, username, birthday, sex, address FROM `user`
        <!-- where标签可以自动添加where,同时处理sql语句中第一个and关键字 -->
        <where>
            <if test="sex != null">
                AND sex = #{sex}
            </if>
            <if test="username != null and username != ''">
                AND username LIKE
                '%${username}%'
            </if>
        </where>
    </select>
</mapper>

UserMapper接口:
与原始Dao方法不同的是,不需要接口的实现类

package com.sm.mapper;

import com.sm.po.User;
import java.util.List;

public interface UserMapper {
    //通过id查找用户信息
    User findUserById(Integer id);

    //查找所有用户信息
    List<User> findUserAll();

    //通过username查找用户信息
    List<User> findUserByUsername(String username);

    //新增用户
    void insertUser(User user);

    //通过id更新username
    void updateUserById(User user);

    //通过id删除指定用户
    void deleteUserById(Integer id);
}

测试类:

package com.sm.test;

import com.sm.mapper.UserMapper;
import com.sm.po.User;
import org.junit.Before;
import org.junit.Test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

public class UserMapperTest {
    private ApplicationContext context;

    @Before
    public void setUp(){
        this.context = new ClassPathXmlApplicationContext("classpath:spring/applicationContext.xml");
    }

    @Test
    public void testFindUserId(){
        UserMapper userMapper = this.context.getBean(UserMapper.class);

        User user = userMapper.findUserById(1);
        System.out.println(user);
    }

}

如果是需要与web整合的话,只需要结合RequestMapping注解即可。
谢谢学习O(∩_∩)O~