Mybatis(九)之spring+mybatis整合

mac2025-06-19  3

怎么整合?

SqlSessionFactory对象应该放到spring容器中作为单例存在。传统dao的开发方式中,应该从spring容器中获得sqlsession对象,以及dao接口对象。官方推荐的动态代理模式中,应该从spring容器中直接获得mapper的代理对象,以及 sqlsession对象。数据库的连接以及数据库连接池以及事务管理都交给spring容器来完成。

整合环境搭建

创建一个java工程。导入jar包。(课前资料中mybatis与spring整合所有包) mybatis的配置文件sqlMapConfig.xml(空文件即可,其他都可以在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> </configuration> 编写Spring的配置文件applicationContext.xml 配置以下内容: 数据库连接及连接池sqlsessionFactory对象,配置到spring容器中编写Spring的配置文件(配置bean的properties:之前在sqlmapconfig.xml中配置的都可以在这里配) <?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:context="http://www.springframework.org/schema/context" xmlns:p="http://www.springframework.org/schema/p" xmlns:aop="http://www.springframework.org/schema/aop" xmlns:tx="http://www.springframework.org/schema/tx" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.0.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.0.xsd http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-4.0.xsd http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-4.0.xsd http://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util-4.0.xsd"> <!-- 加载数据库配置文件 --> <context:property-placeholder location="classpath:jdbc.properties" /> <!-- 数据库连接池 --> <bean id="dataSource" class="org.apache.commons.dbcp.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 --> <!-- 不写id属性的话后续用到默认名字是首字母小写的类名 --> <bean id="sqlsessionfactory" class="org.mybatis.spring.SqlSessionFactoryBean"> <!-- 配置数据源 --> <property name="dataSource" ref="dataSource"></property> <!-- 加载mybatis核心配置文件 --> <property name="configLocation" value="classpath:SqlMapConfig.xml"></property> <!-- 配置别名包扫描 --> <property name="typeAliasesPackage" value="com.lin.pojo"></property> </bean> </beans> 复制jdbc.properties配置文件到新工程复制log4j.properties配置文件到新工程

整合之后的传统dao开发

新建sql关系映射文件user.xml (sourcefolder下mybatis文件夹下) <?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="user"> <!-- 命名空间 用来隔离sql语句 --> <!-- id 语句的标识 parameter type 传入参数的类型 resulttype 查询结果的返回类型 写全类名 --> <select id="getUserById" parameterType="int" resultType="com.lin.pojo.User"> select * from user where id =#{sb}; <!-- #{}相当于占位符 ? 里面内容代表pojo里面的属性 ${}字符串拼接指令 如果是普通数据类型 里面只能写value , --> </select> <!-- 查出来的返回值类型是一个集合 只要写集合里面的参数类型就可以 --> <select id="getUserByUsername" parameterType="string" resultType="com.lin.pojo.User"> select username,birthday from user where username like '%${value}%'; </select> <!-- useGeneratedKeys表示主键为自增长模式 keyProperty:与useGeneratedKeys配套使用,用于绑定主键接收的pojo属性--> <insert id="insertUser" parameterType="com.lin.pojo.User" useGeneratedKeys="true" keyProperty="id"> <!--主键返回 keyproperty pojo中的主键属性 resulttype 主键类型 order在插入语句之后执行 只能大写 --> <!-- <selectKey keyProperty="id" resultType="int" order="AFTER"> select last_insert_id(); </selectKey> --> insert into user values(null,#{username},#{birthday},#{sex},#{address},null) </insert> </mapper> sqlMapConfig.xml中加载user.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> <mapper resource="mybatis/user.xml"/> </mappers> </configuration> 新建userdao接口,写三个需要测试的方法 package com.lin.dao; import java.util.List; import com.lin.pojo.User; /* * 用户信息持久化接口 *@author linone */ public interface UserDao{ /** * 根据用户id信息查询讯息 * @param id * @return */ User getUserById(Integer id); /** * 根据用户名查询信息(模糊查询) * @param username * @return */ List<User> getUserByUsername(String username); /** * 插入用户信息 * @param user */ void insertUser(User user); } 编写userdaoimpl实现类,关键要继承SqlSessionDaoSupport package com.lin.dao.impl; import java.util.List; import org.apache.ibatis.session.SqlSession; import org.mybatis.spring.support.SqlSessionDaoSupport; import com.lin.dao.UserDao; import com.lin.pojo.User; /* *@author linone */ public class UserDaoImpl extends SqlSessionDaoSupport implements UserDao { @Override public User getUserById(Integer id) { SqlSession sqlSession = super.getSqlSession(); //sqlsession交给spring了 User user = sqlSession.selectOne("user.getUserById", id); return user; } @Override public List<User> getUserByUsername(String username) { SqlSession session = super.getSqlSession(); List<User> list = session.selectList("user.getUserByUsername", username); return list; } @Override public void insertUser(User user) { SqlSession sqlSession2 = getSqlSession(); sqlSession2.insert("user.insertUser", user); //事务管理也交给spring } } 在applicationContext.xml中配置userdaoimlp,并且注入sqlsessionfactory属性 <bean class="com.lin.dao.impl.UserDaoImpl"> <property name="sqlSessionFactory" ref="sqlsessionfactory"></property> </bean> 测试 package com.lin.test; import static org.junit.Assert.*; import org.junit.Before; import org.junit.Test; import org.springframework.context.ApplicationContext; import org.springframework.context.support.ClassPathXmlApplicationContext; import com.lin.dao.UserDao; import com.lin.pojo.User; /* *@author linone *传统dao开发模式测试类 */ public class UserDaoTest { private ApplicationContext ac; @Before //在执行任何方法之前先执行该方法 public void init() { ac=new ClassPathXmlApplicationContext("applicationContext.xml"); } @Test public void test() { UserDao dao = ac.getBean(UserDaoImpl.class); User userById = dao.getUserById(1); System.out.println(userById); } }

整合之后的官方推荐动态代理dao开发

新建usermapper.xml新建usermapper接口 ,注意两者需要符合四条开发 规则 namespace必须是接口的全路径名(包名.类名)(这条要求保证了测试类能找到这个sql映射文件)接口里面的方法名必须与映射文件的SQLid一致接口方法的入参必须与sql标签parameterType一致接口的返回值必须与sql标签的resultType一致 在applicationcontext.xml中配置mapper (不用在sqlMapConfig.xml中配置) <!-- 动态代理Dao开发,第一种方式,包扫描器(推荐使用) --> <bean class="org.mybatis.spring.mapper.MapperScannerConfigurer"> <!-- basePackage:配置映射包装扫描,多个包时用","或";"分隔 (接口和映射文件所在的包)--> <property name="basePackage" value="com.lin.mapper" /> </bean> 测试 package com.lin.test; import org.junit.Before; import org.junit.Test; import org.springframework.context.ApplicationContext; import org.springframework.context.support.ClassPathXmlApplicationContext; import com.lin.mapper.UserMapper; import com.lin.pojo.User; /* *@author linone */ public class UserMapperTest { private ApplicationContext ac; @Before //在执行任何方法之前先执行该方法 public void init() { ac=new ClassPathXmlApplicationContext("applicationContext.xml"); } @Test public void test() { UserMapper mapper = ac.getBean(UserMapper.class); User userById = mapper.getUserById(1); System.out.println(userById); } }
最新回复(0)