MyBatis和Spring框架整合

「爱情、让人受尽委屈。」 2022-11-28 00:47 234阅读 0赞

Spring 集成 MyBatis

将 MyBatis与 Spring 进行整合,主要解决的问题就是将 SqlSessionFactory对象交由 Spring 来管理。所以,该整合,只需要将SqlSessionFactory的对象生成器 SqlSessionFactoryBean 注册在Spring容器中,再将其注入给 Dao 的实现类即可完成整合

先大概的说一下完成需要的步骤

  1. 创建maven项目

  2. 加入maven依赖

    1)spring依赖

    2)mybatis依赖

    3)mysql驱动

    4)spring事务的依赖

    5)mybatis和spring集成的依赖

  1. 创建实体类

  2. 创建dao接口和mapper文件

  3. 创建mybatis主配置文件、

  4. 创建service接口和实现类,属性dao

  5. 创建spring的配置文件:声明mybatis的对象交给spring创建

    1)数据源

    2)SqlsessionFactory

    3)Dao对象

    4)声明自定义的service

  6. 创建测试类,获取service对象,通过service调用dao完成数据库的访问

要使用dao对象,需要使用getMapper()方法,

  1. 获取SqlSession对象, 需要使用SqlSessionFactory的openSession()方法

  2. 创建SqlSessionFactory对象。 通过读取mybatis的主配置文件,能创建SqlSessionFactory对象

在mybatis的主配置文件

  1. 数据库信息





    //localhost:3306/springdb"/>




  2. mapper文件的位置



通过以上的说明,我们需要让spring创建以下对象

  1. 独立的连接池类的对象, 使用阿里的druid连接池

  2. SqlSessionFactory对象

  3. 创建出dao对象

上面三个对象的创建语法,使用xml的bean标签

数据库创建

watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80MzcyNTUxNw_size_16_color_FFFFFF_t_70

对应数据库字段的实体类:

  1. public class user {
  2. private int id;
  3. private String username;
  4. private String password;
  5. public user() {
  6. }
  7. public user(int id, String username, String password) {
  8. this.id = id;
  9. this.username = username;
  10. this.password = password;
  11. }
  12. public int getId() {
  13. return id;
  14. }
  15. public void setId(int id) {
  16. this.id = id;
  17. }
  18. public String getUsername() {
  19. return username;
  20. }
  21. public void setUsername(String username) {
  22. this.username = username;
  23. }
  24. public String getPassword() {
  25. return password;
  26. }
  27. public void setPassword(String password) {
  28. this.password = password;
  29. }
  30. @Override
  31. public String toString() {
  32. return "user{" +
  33. "id=" + id +
  34. ", username='" + username + '\'' +
  35. ", password='" + password + '\'' +
  36. '}';
  37. }
  38. }

数据访问层 userDao

  1. public interface userDao {
  2. //插入数据
  3. int insertUser(user user);
  4. //查询数据
  5. List<user> selectUsers();
  6. }

userDao.xml

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <!DOCTYPE mapper
  3. PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
  4. "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
  5. <mapper namespace="cn.com.Ycy.spring_aspectJ.dao.userDao">
  6. <select id="selectUsers" resultType="cn.com.Ycy.spring_aspectJ.domain.user">
  7. select * from user_table
  8. </select>
  9. <insert id="insertUser">
  10. insert into user_table values (#{id},#{username},#{password})
  11. </insert>
  12. </mapper>

业务逻辑层 service

这个接口完成对数据库的操作,对应着数据访问层的userDao的方法,在通过普通类实现这个接口,把userDao作为属性引入

再在实现userService接口的类中的方法,List users = userdao.selectUsers();,在这里userDao是由spring创建

  1. public interface userService {
  2. // 插入user
  3. int addUser(user user);
  4. // 查询
  5. List<user> selectAll();
  6. }

业务逻辑的接口实现类

使用实现方法访问dao数据库的操作,对应的方法访问dao数据库不同的操作,这里addUser对应着数据访问层的insertUser

  1. import cn.com.Ycy.spring_aspectJ.dao.userDao;
  2. import cn.com.Ycy.spring_aspectJ.domain.user;
  3. import cn.com.Ycy.spring_aspectJ.service.userService;
  4. import java.util.List;
  5. public class userServiceImpl implements userService {
  6. private userDao userdao;
  7. //为了使用set注入
  8. public void setUserdao(userDao userdao) {
  9. this.userdao = userdao;
  10. }
  11. /**
  12. * 我们需要使用这个方法访问dao数据库的操作,
  13. * 就把这个userDao依赖进来
  14. * @param user
  15. * @return
  16. */
  17. @Override
  18. public int addUser(user user) {
  19. int num = 0;
  20. num = userdao.insertUser(user);
  21. return num;
  22. }
  23. /**
  24. * 我们需要使用这个方法访问dao数据库的操作
  25. * 就把这个userDao依赖进来
  26. * @return
  27. */
  28. @Override
  29. public List<user> selectAll() {
  30. List<user> users = userdao.selectUsers();
  31. return users;
  32. }
  33. }

Mybatis主配置文件

感觉这个配置文件完成被spring替代了,都可以不要了

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <!DOCTYPE configuration
  3. PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
  4. "http://mybatis.org/dtd/mybatis-3-config.dtd">
  5. <configuration>
  6. <!-- settings 控制mybatis全局行为 日志 -->
  7. <settings>
  8. <setting name="logImpl" value="STDOUT_LOGGING"/>
  9. </settings>
  10. </configuration>

spring主配置文件:重头戏

1. 独立的连接池类的对象, 使用阿里的druid连接池

声明数据源DataSource ,作用是连接数据库的(就类似给非自定义的属性赋值),这个是写好的,只需要set注入属性

  1. <bean id="myDataSource" class="com.alibaba.druid.pool.DruidDataSource" init-method="init" destroy-method="close">
  2. <!--set注入给druidDatasource 提供连接数据信息-->
  3. <property name="url" value="jdbc:mysql:///users"/>
  4. <property name="username" value="root"/>
  5. <property name="password" value="ye0401"/>
  6. <!-- 最多默认多少数量连接数据库 -->
  7. <property name="maxActive" value="20"/>
  8. </bean>

2. SqlSessionFactory对象

声明是mybatis中提供的SqlsessionFactoryBean类,这个类内部创建SqlsessionFactory的,它会内部创建Sqlsession

  1. <bean id="sqlsessionfactory" class="org.mybatis.spring.SqlSessionFactoryBean">
  2. <property name="dataSource" ref="myDataSource"/>
  3. <!-- 这个不加也是不会报错,大部分的功能被spring替代 -->
  4. <property name="configLocation" value="classpath:mybatis.xml"/>
  5. </bean>

在mybatis创建SqlsessionFactory对象是需要读取mybatis主配置文件,这个主配置文件中就有数据库信息,如下:

  1. <environments default="mysql">
  2. <!-- 配置mysql环境 default 和id 的命名一样 -->
  3. <environment id="mysql">
  4. <!--配置事务的类型 -->
  5. <transactionManager type="JDBC"></transactionManager>
  6. <!-- 配置数据源 (连接池) -->
  7. <dataSource type="POOLED">
  8. <!-- 配置数据库的四个基本信息 -->
  9. <property name="driver" value="com.mysql.jdbc.Driver"/>
  10. <!--
  11. 数据库路径写错
  12. java.sql.SQLException: No suitable driver found for
  13. -->
  14. <property name="url" value="jdbc:mysql:///mybatisdb"/>
  15. <property name="username" value="root"/>
  16. <property name="password" value="ye0401"/>
  17. </dataSource>
  18. </environment>
  19. </environments>

3. 创建出dao对象

创建dao对象,使用Sqlsession的getMapper(userDao.class)

userDao users = sqlSession.getMapper(userDao.class);

  1. 1sqlSession
  2. 2userDao.class

MapperScannerConfigurer:在内部调用getMapper()生成每个接口的代理对象

  1. <bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
  2. <!-- 指定SqlsessionFactory的id-->
  3. <property name="sqlSessionFactoryBeanName" value="sqlsessionfactory"/>
  4. <!--指定userDao.clas -->
  5. <property name="basePackage" value="cn.com.Ycy.spring_aspectJ.dao"/>
  6. </bean>

指定userDao.class:

MapperScannerConfigurer会扫描这个包中所有的接口,cn.com.Ycy.spring_aspectJ.dao这个是dao层的包名

把每一接口执行一次getMapper()方法,得到每一个接口的dao对象

创建好的对象放在spring的容器中的

value:可以写多个包名,逗号分开

dao对象是接口名的首字母小写

最后就是创建service层的实现类的对象

  1. <!-- 声明service接口实现类对象 -->
  2. <bean id="service" class="cn.com.Ycy.spring_aspectJ.service.imp.userServiceImpl">
  3. <!-- set注入 -->
  4. <property name="userdao" ref="userDao"/>
  5. </bean>

这个ref的值是由spring创建的Dao对象的名称,就是上面的,对象名默认是首字母小写的名称

sqlSession创建的userDao users = sqlSession.getMapper(userDao.class);

测试方法

  1. @Test
  2. public void test06(){
  3. String config = "ApplicationContext.xml";
  4. ApplicationContext ac = new ClassPathXmlApplicationContext(config);
  5. userService service = (userService) ac.getBean("service");
  6. List<user> users = service.selectAll();
  7. for (user user : users) {
  8. System.out.println(user);
  9. }
  10. }

发表评论

表情:
评论列表 (有 0 条评论,234人围观)

还没有评论,来说两句吧...

相关阅读