一、整合思路
- spring通过单例方式管理SqlSessionFactory。
- spring和mybatis整合生成代理对象,使用SqlSessionFactory创建SqlSession。(spring和mybatis整合自动完成)
- 持久层的mapper都需要由spring进行管理。
二、整合环境
三、spring配置文件applicationContext.xml
在applicationContext.xml配置sqlSessionFactory和数据源
<!-- 配置数据源 -->
<context:property-placeholder location="DataSource.properties"></context:property-placeholder>
<bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
<property name="driverClassName" value="${jdbc.driverClassName}"></property>
<property name="url" value="${jdbc.url}"></property>
<property name="username" value="${jdbc.username}"></property>
<property name="password" value="${jdbc.password}"></property>
</bean>
<!-- 配置sqlSessionFactory -->
<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
<!-- 加载mybatis的配置文件 -->
<property name="configLocation" value="mybatis/SqlMapConfig.xml" />
<!-- 数据源 -->
<property name="dataSource" ref="dataSource" />
</bean>
四、操作的数据表
五、原始Dao开发
1、po类Student
public class Student {
private int id;
private String name;
private String sex;
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getSex() {
return sex;
}
public void setSex(String sex) {
this.sex = sex;
}
@Override
public String toString() {
return "Student [id=" + id + ", name=" + name + ", sex=" + sex + "]";
}
}
2、StuMapper.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="cn.csdn.sm.dao.StuDao">
<select id="findStuById" parameterType="int" resultType="cn.csdn.sm.po.Student">
SELECT * FROM Student WHERE id=#{value}
</select>
<select id="findStuByName" parameterType="String" resultType="cn.csdn.sm.po.Student">
SELECT * FROM Student WHERE name LIKE '%${value}%'
</select>
<insert id="addStu" parameterType="cn.csdn.sm.po.Student" >
INSERT INTO Student(name,sex) VALUE(#{name},#{sex})
</insert>
<delete id="delStu" parameterType="int">
DELETE FROM Student WHERE id = #{value}
</delete>
<update id="upStu" parameterType="cn.csdn.sm.po.Student">
UPDATE Student SET name = #{name}, sex = #{sex} where id = #{id}
</update>
</mapper>
3、DAO接口
public interface StuDao {
public Student findStuById(int id) throws Exception;
public List<Student> findStuByName(String name) throws Exception;
public void addStu(Student Stu) throws Exception;
public void delStu(int id) throws Exception;
public void upStu(Student Stu) throws Exception;
}
4、DAO实现类(继承SqlSessionDaoSupport)
注:
- 不在使用构造的方式注入sqlSessionFactory,而是通过spring注入,在实现类里面要继承spring-maybatis整合包中的SqlSessionDaoSupport类。
- 通过this.getSqlSession()获得sqlSession对象
- 不用close
public class StuImp extends SqlSessionDaoSupport implements StuDao{
@Override
public Student findStuById(int id) throws Exception {
SqlSession sqlSession = this.getSqlSession();
Student Stu = sqlSession.selectOne("cn.csdn.mybatis.dao.StuDao.findStuById",id);
return Stu;
}
@Override
public List<Student> findStuByName(String name) throws Exception {
SqlSession sqlSession = this.getSqlSession();
List<Student> Stus = sqlSession.selectList("cn.csdn.mybatis.dao.StuDao.findStuByName",name);
return Stus;
}
@Override
public void addStu(Student stu) throws Exception {
SqlSession sqlSession = this.getSqlSession();
sqlSession.insert("cn.csdn.mybatis.dao.StuDao.addStu",stu);
sqlSession.commit();
}
@Override
public void delStu(int id) throws Exception {
SqlSession sqlSession = this.getSqlSession();
sqlSession.delete("cn.csdn.mybatis.dao.StuDao.delStu",id);
sqlSession.commit();
}
@Override
public void upStu(Student stu) throws Exception {
SqlSession sqlSession = this.getSqlSession();
sqlSession.update("cn.csdn.mybatis.dao.StuDao.upStu",stu);
sqlSession.commit();
}
}
5、配置Dao
在applicationContext.xml中配置dao
<!-- 配置Dao,并把sqlSessionFactory注入StuImp中 -->
<bean id="stuDao" class="cn.csdn.sm.dao.StuImp">
<property name="sqlSessionFactory" ref="sqlSessionFactory"></property>
</bean>
在SqlMapConfig.xml中配置dao
<mappers>
<mapper resource="mapper/StuMapper.xml"/>
</mappers>
6、测试
class StuImpTest {
private ApplicationContext applicationContext;
@BeforeEach
void setUp() throws Exception {
applicationContext = new ClassPathXmlApplicationContext("spring/applicationContext.xml");
}
@Test
void testFindStuById() throws Exception {
StuDao stuDao = (StuDao) applicationContext.getBean("stuDao");
Student student = stuDao.findStuById(1);
System.out.println(student);
}
}
7、步骤总结
- 建立工程,导入jar包
- spring和mybatis的配置文件
- 在spring配置文件中
- 配置数据源
- 配置sqlSessionFactory(单例)
- 写dao接口和实现类,实现类中继承SqlSessionDaoSupport
- mybatis配置文件中加载mapper.xml
- spring配置文件中配置dao实现类,并注入sqlSessionFactory
六、Mapper代理方式
1、创建StuMapper.java和StuMapper.xml
public interface StuMapper {
public Student findStuById(int id) throws Exception;
public List<Student> findStuByName(String name) throws Exception;
public void addStu(Student Stu) throws Exception;
public void delStu(int id) throws Exception;
public void upStu(Student Stu) throws Exception;
}
<?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="cn.csdn.sm.mapper.StuMapper">
<select id="findStuById" parameterType="int" resultType="cn.csdn.sm.po.Student">
SELECT * FROM Student WHERE id=#{value}
</select>
<select id="findStuByName" parameterType="String" resultType="cn.csdn.sm.po.Student">
SELECT * FROM Student WHERE name LIKE '%${value}%'
</select>
<insert id="addStu" parameterType="cn.csdn.sm.po.Student" >
INSERT INTO Student(name,sex) VALUE(#{name},#{sex})
</insert>
<delete id="delStu" parameterType="int">
DELETE FROM Student WHERE id = #{value}
</delete>
<update id="upStu" parameterType="cn.csdn.sm.po.Student">
UPDATE Student SET name = #{name}, sex = #{sex} where id = #{id}
</update>
</mapper>
2、spring配置
<!-- mapper批量扫描,从mapper包中扫描出mapper接口,自动创建代理对象并且在spring容器中注册
遵循规范:将mapper.java和mapper.xml映射文件名称保持一致,且在一个目录 中
自动扫描出来的mapper的bean的id为mapper类名(首字母小写)
-->
<bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
<!-- 指定扫描的包名
如果扫描多个包,每个包中间使用半角逗号分隔
-->
<property name="basePackage" value="cn.csdn.ssm.mapper"/>
<property name="sqlSessionFactoryBeanName" value="sqlSessionFactory"/>
</bean>
此时,SqlMapConfig.xml中也不用扫描dao包了
3、测试
class StuMapperTest {
private ApplicationContext applicationContext;
@BeforeEach
void setUp() throws Exception {
applicationContext = new ClassPathXmlApplicationContext("spring/applicationContext.xml");
}
@Test
void testFindStuById() throws Exception {
StuMapper stuMapper = (StuMapper) applicationContext.getBean("stuMapper");
Student student = stuMapper.findStuById(1);
System.out.println(student);
}
}
4、步骤总结
- 建立工程,导入jar包
- spring和mybatis的配置文件
- 在spring配置文件中
- 配置数据源
- 配置sqlSessionFactory(单例)
- 配置mapper的批量扫描,扫描某包下的mapper,自动创建mapper代理对象并在spring中注册
- 按照规范在上述包中写mapper.java和mapper.xml
- 通过spring中applicationContext.getBean(String className)获得对象