欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

SM整合(spring,mybatis)

程序员文章站 2022-03-07 10:29:00
...

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~