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"/>
<!--<!–批量加载映射文件–>-->
<!--<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&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 -->
<!-- 还有一个很重要的作用,使用动态代理开发DAO,1. 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~
上一篇: spring框架工作的原理的初解
下一篇: 【Java实现】数字转化为汉字
推荐阅读
-
SpringBoot整合MyBatis获得插入数据后获取主键,返回值总是1
-
Spring整合Quartz实现一个简单的定时任务
-
SpringBoot项目整合mybatis的方法步骤与实例
-
Spring boot + mybatis + Vue.js + ElementUI 实现数据的增删改查实例代码(一)
-
Spring整合Quartz Job以及Spring Task的实现方法
-
Spring boot + mybatis + Vue.js + ElementUI 实现数据的增删改查实例代码(二)
-
spring整合redis以及使用RedisTemplate的方法
-
Spring与Web整合实例
-
Spring整合Struts2的两种方法小结
-
Spring Boot整合邮件发送与注意事项