spring mvc环境之数据库ORM组件Mybaits配置(九)

spring 引入Mybaits功能,

还是把握住主要步骤,

1.引入相关jar包(spring-jdbc、spring-orm,spring-aop、spring-tx(有orm就可以)、spring-oxm(无关)、mybatis、mybatis-spring);

2.在applicationContext.xml配置Mybaits的bean交由spring容器管理(Mybatis是数据库相关故(配置,实例化)时少不了dataSource的bean);

3.Mybatis的其他一些参数配置和数据库事务配置(事务一般是基于aop的,所以要引入spring-aop、spring-tx)

  • mybatis和spring整合,通过spring管理mapper接口(配置出一个sqlSessionFactory的bean)。
  • 使用mapper的扫描器自动扫描mapper接口在spring中进行注册。

4.建立一些Mybatis必要的文件,测试下

-----------------------------------------

 

1.pom.xml的依赖包

  • 数据库驱动包
  • mybatis的jar包
  • mybatis和spring整合包
  • log4j包
  • dbcp数据库连接池包
  • spring3.2所有jar包
  • jstl包
    <!-- mybatis核心包 -->
    <dependency>
      <groupId>org.mybatis</groupId>
      <artifactId>mybatis</artifactId>
      <version>${mybatis.version}</version>
    </dependency>

    <!-- mybatis/spring包 -->
    <dependency>
      <groupId>org.mybatis</groupId>
      <artifactId>mybatis-spring</artifactId>
      <version>2.0.6</version>
    </dependency>

    <!-- mybatis代码自动生成插件,可以通过配置xml,根据数据库字段,自动生成javaBean和Mapper等 -->
    <dependency>
      <groupId>org.mybatis.generator</groupId>
      <artifactId>mybatis-generator-core</artifactId>
      <version>1.3.7</version>
    </dependency>

    <!-- 引入mybatis分页插件-->
    <!-- https://mvnrepository.com/artifact/com.github.pagehelper/pagehelper -->
    <dependency>
      <groupId>com.github.pagehelper</groupId>
      <artifactId>pagehelper</artifactId>
      <version>5.1.11</version>
    </dependency>
    <!-- 通过注解配置自动为实体bean添加get,set,toString方法 -->
    <!-- https://mvnrepository.com/artifact/org.projectlombok/lombok -->
    <dependency>
      <groupId>org.projectlombok</groupId>
      <artifactId>lombok</artifactId>
      <version>1.18.12</version>
      <scope>provided</scope>
    </dependency>
    <!-- 处理xml格式-->
    <dependency>
      <groupId>dom4j</groupId>
      <artifactId>dom4j</artifactId>
      <version>1.6.1</version>
    </dependency>

 

2.spring容器配置相关bean

<!-- 6.整合数据库操作mybatis,如果以前操作数据库这里就是整合JdbcTemplate
            现在用的mybatis,就整合mybatis
        目的:
            1> spring管理所有组件.(sqlSessionFactory... ,mapper的实现类),
                service(mondel)层操作DAO时,只要用@AutoWired:自动注入mapper.
            2> spring管理事务,spring声明事务
     -->

    <!-- 配置 sqlSessionFactory-->
    <bean id="sqlSessionFactoryBean" class="org.mybatis.spring.SqlSessionFactoryBean">
        <!-- 数据连接池 -->
        <property name="dataSource" ref="dataSource"></property>
        <!-- 配置Mybatis的核心配置文件所在位置 -->
        <property name="configLocation" value="classpath:mybatis-config.xml"></property>
        <!-- 引入映射文件 -->
        <property name="mapperLocations" value="classpath:mybatis/mappers/*.xml"></property>
        <!-- 别名扫描 (因排查问题不容易直接定位到包,故给实体起别名慎用)-->
        <!--property name="typeAliasesPackage" value="com.cc8w.dto,com.cc8w.entrity"></property-->
    </bean>

    <!-- 7.扫描所有的mapper接口的实现,让这些mapper可以自动注入 @AutoWired-->
    <!-- DAO接口所在包名,Spring会自动查找其下的类 -->

    <!-- (mapper扫描器)base-package指定mapper接口的包名 -->
    <mybatis-spring:scan base-package="com.cc8w.dao,com.cc8w.home.mapper,com.cc8w.admins.mapper"/>

    <!-- mapper扫描器(老版本) -->
    <!-- 扫描包路径,如果需要扫描多个包,中间使用半角逗号隔开 -->
    <!--bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
        <property name="basePackage" value="com.cc8w.home.mapper,com.cc8w.admins.mapper"></property>
        <property name="sqlSessionFactoryBeanName" value="sqlSessionFactory" />
    </bean-->

    <!-- 8.配置一个可以批量执行的sqlSession-->
    <!--配置sqlSessionTemplate:通过带参数的构造方法创建对象 -->
    <bean id="sqlSessionTemplate" class="org.mybatis.spring.SqlSessionTemplate">
        <!-- 以sqlSessionFactory为参数传入构造函数中 -->
        <constructor-arg name="sqlSessionFactory" ref="sqlSessionFactoryBean"/>
        <!-- mybatis执行器,取值范围是SIMPLE/REUSE/BATCH(更新返回的不是影响行数)三种类型 -->
        <constructor-arg name="executorType" value="SIMPLE"/>
    </bean>

3.还有resource下的mybaits-config.xml文件

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD SQL Map Config 3.0//EN"
        "http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
    <!-- 行为参数 -->
    <settings>
        <setting name="cacheEnabled" value="true" /><!-- 全局映射器启用缓存 -->
        <setting name="mapUnderscoreToCamelCase" value="true" /><!-- 开启驼峰匹配 -->
        <setting name="useGeneratedKeys" value="true" />
        <setting name="defaultExecutorType" value="REUSE" />
        <setting name="logImpl" value="STDOUT_LOGGING" /><!-- 控制台打印sql语句 -->

        <setting name="mapUnderscoreToCamelCase" value="true" />
        <!--解决,查询返回结果含null没有对应字段值问题-->
        <setting name="callSettersOnNulls" value="true"/>
    </settings>

    <!-- 配置别名 -->
    <typeAliases>
        <!--typeAlias type="com.cc8w.util.RequestData" alias="rd"/>
        <typeAlias type="com.cc8w.entity.UserPojo" alias="userPojo"/-->
    </typeAliases>

    <!-- 类型处理器 -->
    <typeHandlers>
        <!--
            当配置package的时候,mybatis会去配置的package扫描TypeHandler
            <package name="com.dy.demo"/>
         -->

        <!-- handler属性直接配置我们要指定的TypeHandler -->
        <!-- javaType 配置java类型,例如String, 如果配上javaType, 那么指定的typeHandler就只作用于指定的类型 -->
        <!--typeHandler javaType="java.lang.String" handler="com.cc8w.handler.MyStringTypeHandler"/-->
        <!-- jdbcType 配置数据库基本数据类型,例如varchar, 如果配上jdbcType, 那么指定的typeHandler就只作用于指定的类型  -->
        <!--typeHandler javaType="java.util.Date" handler="com.cc8w.handler.MyDateTypeHandler"/-->
        <!--typeHandler javaType="java.lang.Integer" handler="com.cc8w.handler.MyIntTypeHandler"/-->
    </typeHandlers>

    <!-- 分页查询配置一定写在别名配置之后 -->
    <!-- 使用参考:https://pagehelper.github.io/docs/howtouse/
        1.看意思是,只要在全查询等其他查询前面加一个 PageHelper.startPage(1, 10);即可分页,(第一页,每页10条数据)
    -->
    <plugins>
        <plugin interceptor="com.github.pagehelper.PageInterceptor">
            <!-- 使用下面的方式配置参数,后面会有所有的参数介绍 -->
            <property name="supportMethodsArguments" value="true"/>
            <property name="params" value="pageNum=pageNum;pageSize=pageSize;"/>
        </plugin>
        <!--plugin interceptor="com.cc8w.plugin.MybaitsPlugin"></plugin-->
    </plugins>


</configuration>

4.测试下

1).建立TestMapper.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="com.cc8w.dao.TestMapper">

    <!-- 查询信息 -->
    <select id="queryUserById" parameterType="int" resultType="com.cc8w.entity.UserEntity">
        select * from test t where id=#{id}
    </select>


</mapper>

2).建立TestMapper接口

package com.cc8w.dao;

import com.cc8w.entity.UserEntity;import org.springframework.stereotype.Repository;

@Repository("testMapper")
public interface TestMapper {
    UserEntity queryUserById(@Param("id") int id);

}

3).service接口

package com.cc8w.service;

import com.cc8w.entity.UserEntity;
import org.apache.ibatis.annotations.Param;


public interface TestService {

    UserEntity queryUserById(@Param("id") int id);

}

 

4).service实现类

package com.cc8w.service.impl;


import com.cc8w.dao.TestMapper;
import com.cc8w.entity.UserEntity;
import com.cc8w.service.TestService;
import com.cc8w.service.impl.TestServiceImpl;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;


@Service("testService")
@Transactional
public class TestServiceImpl implements TestService {
    @Autowired
    private TestMapper testMapper;

    @Override
    public UserEntity queryUserById(int id) {
        return testMapper.queryUserById(id);
    }


}

 

5).控制器

    @Autowired
    private TestService testService;   

 @RequestMapping("gettest2")
    public Object getTest2(){

        UserEntity user = testService.queryUserById(1);
        System.out.println(user);
        return user;
    }

 

6)附加实体

package com.cc8w.entity;

import lombok.Data;
import java.io.Serializable;

@Data
public class UserEntity  implements Serializable {
    private  int id;
    private  String name;
    private  int age;
    public UserEntity() {
    }

    public UserEntity(int id, String name, int age) {
        this.id = id;
        this.name = name;
        this.age = age;
    }

}

 

===========使用pagehelper插件分页

XXXMapper.xml (照常写,不用写分页查询语句)

    <!-- 查询信息 -->
    <select id="getUserList"  resultType="com.cc8w.entity.UserEntity">
        select * from test t
    </select>

分页时:只需在查询前面加一句  PageHelper.startPage(pageNum, pageSize); 即可

至于获取分页信息需要 PageInfo类或Page类

   @Override
    public List<UserEntity> getUserList() {
        PageHelper.startPage(3, 2);
        PageHelper.orderBy("id desc");

        List<UserEntity> usersList = testMapper.getUserList();

        //取分页信息一:Page属性
        Page<UserEntity> listUser = (Page<UserEntity>)usersList;
        System.out.println(listUser.getTotal());
        System.out.println(listUser.toString());

        PageInfo<UserEntity> pageInfo1 = listUser.toPageInfo();
        System.out.println(pageInfo1.toString());
        System.out.println("------------------");

        //取分页信息二:PageInfo分页属性很全
        PageInfo<UserEntity> pageInfo2 = new PageInfo<UserEntity>(usersList);
        System.out.println(pageInfo2.toString());

        return usersList;
    }

 

//PageInfo包含了非常全面的分页属性
assertEquals(1, page.getPageNum());
assertEquals(10, page.getPageSize());
assertEquals(1, page.getStartRow());
assertEquals(10, page.getEndRow());
assertEquals(183, page.getTotal());
assertEquals(19, page.getPages());
assertEquals(1, page.getFirstPage());
assertEquals(8, page.getLastPage());
assertEquals(true, page.isFirstPage());
assertEquals(false, page.isLastPage());
assertEquals(false, page.isHasPreviousPage());
assertEquals(true, page.isHasNextPage());

 

 

参考 :https://blog.csdn.net/qq_41071876/article/details/118898137

https://www.cnblogs.com/ljk-shm-0208/p/14630918.html

https://www.cnblogs.com/jthr/p/14142256.html

https://blog.csdn.net/qq_45740349/article/details/117031233

 https://www.jb51.net/article/99537.htm

posted @ 2022-12-09 17:55  与f  阅读(99)  评论(0编辑  收藏  举报