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