Spring整合ibatis查询方法详解
- 格式:docx
- 大小:20.94 KB
- 文档页数:3
SpringBoot中整合MyBatis-Plus-Join使用联表查询的实现MyBatis-Plus-Join是MyBatis中提供的用于联表查询的一种框架,可以很方便地让开发者使用单条SQL语句实现数据库表之间的联表查询。
SpringBoot作为一个轻量级的Java开发框架,也提供了对MyBatis-Plus-Join框架的支持。
下面将对SpringBoot如何使用MyBatis-Plus-Join进行联表查询做一个详细的介绍:1、准备工作在SpringBoot中使用MyBatis-Plus-Join进行联表查询,首先需要在pom.xml文件中添加相应的依赖包,如:<dependency><groupId>org.mybatis.spring.boot</groupId><artifactId>mybatis-spring-boot-starter</artifactId><version>1.3.2</version></dependency>2、SQL语句准备在SpringBoot中使用MyBatis-Plus-Join的联表查询,需要提前准备好SQL语句,比如:SELECT t1.columns, t2.columnsFROM table1 t1JOIN table2 t2 ON t1.id = t2.id ;3、实现DAO层在实现DAO层时,需要引入MyBatis-Plus-Join的联表查询注解@JoinTable,代码如下:@Mapperpublic interface UserDao {@Select("select t1.columns, t2.columns from table1 t1 join table2 t2 on t1.id=t2.id")@JoinTable(type = JoinType.LEFT, source = "t1", target = "t2") List<User> selectUserList();}4、实现Service层在实现Service层时,需要调用DAO层的联表查询方法,并将返回的结果进行处理,返回给上层应用,代码如下:@Servicepublic class UserServiceImpl implements UserService {@Autowiredprivate UserDao userDao;public List<User> selectUserList(){List<User> userList = userDao.selectUserList();//doSomething()return userList;}}5、使用联表查询最后是使用联表查询,可以通过调用Service层提供的相关接口来实现联表查询,如:List<User> userList = userService.selectUserList();以上就是SpringBoot中整合MyBatis-Plus-Join使用联表查询的实现的步骤,SpringBoot开发者可以按照上述步骤进行开发,可以轻松实现联表查询。
Spring与ibatis整合学习心得梁飞虎首先,明确一下ibatis在此工程中的作用相当于hibernate,就是进行数据库的访问,也就是连接操作数据库用的。
因此常说的SSH结构也可用SSI来取代,只是ibatis是一个轻量级的框架。
在spring.jar包中有org.springframework.orm.ibatis.SqlMapClientFactoryBean类,此类用于读取ibatis中的配置文件(总配置文件)sqlMapConfig.xml,具体的配置位置是在applicationContext.xml中:标记1<bean id="sqlMapClient"class="org.springframework.orm.ibatis.SqlMapClientFactoryBean"> <property name="configLocation"><value>WEB-INF/sqlMapConfig.xml</value></property></bean>而sqlMapConfig.xml文件中包含ibatis的map文件信息,这点不再详述。
SqlMapClientFactoryBean,这个class实现了两个interface:FactoryBean和InitializingBean,InitializingBean只有一个方法afterPropertiesSet()spring调用构造函数后,发现它实现了InitializingBean接口,所以还会调用afterPropertiesSet来进一步初始化此class。
sqlMapClient 就是在这里面创建的。
至此一个完整的工厂创建完成。
FactoryBean接口主要方法就是public Object getObject();要知道SqlMapClientFactoryBean是一个工厂类,他的作用就是你需要的时候调用它的一个方法,它就会返回你一个你需要的对象。
Spring集成iBATIS目录1 概述 (2)2与iBATIS的集成 (2)3声明式事务 (8)4 iBATIS适用场合 (11)1 概述iBATIS似乎已远离众说纷纭的OR框架之列,通常人们对非常流行的Hibernate情有独钟。
但正如SpringA Developer's Notebook作者Bruce Tate 和Justin Gehtland所说的那样,与其他的OR框架相比,iBATIS独辟蹊径“iBATIS不是试图从根本上掩盖SQL,实际上,它是在拥抱SQL。
”但别犯愁:SQL本身具备了一些重要的功能,并且通过模板的使用,在Spring应用中采用iBATIS显得轻而易举。
在此摘录中,两位作者将和你一起安装iBATIS并将其集成进你的Spring应用中。
他们也阐明了怎样取得你已编写的SQL语句及把他们映射给iBATIS使用的Bean。
最后,还讨论了iBATIS的优缺点,及为什么是这样的一种方式,即所谓的“在完全OR与JDBC之间的一个幽雅的折衷。
”对象关系持久化(OR Persistence),对Java 开发人员而言,对象关系映射已然成为那类问题了。
我们需要处理功能(processing power)、较佳设计模式及更好持久化框架的组合,从而使解决持久化设计变得更加清晰。
最终,我们开始取得实质性的进展。
象Spring这样的框架就象是方程式的一部分,因为他们让对象关系映射(ORM)花较少的精力来做更多的事情。
你将看到三种框架:iBATIS, JDO及Hibernate1.iBATIS 是一种JDBC助手类框架,它给了你一些OR映射及使用OR的好处,但不带有太多的风险。
2.JDO是一种饱受争议的持久化标准,但它有着一些独特的实现,这使得JDO在行业中也算得上是最完美的持久化框架之一。
3.Hibernate 是在JBoss组织控制下的一开源持久化框架。
它可能是时下最为流行的持久化框架。
springboot整合mybatis实现增删改查⼩案例⼀、springboot简单hello world1.1 使⽤springboot项⽬前提是必须学会使⽤maven,maven這⾥就不多说了⽹上招⼀⼤堆教程1.2 创建⼀个war包的maven项⽬,创建后在pox.xml添加如下jar1.3 创建⼀个springboot的程序⼊⼝启动类:如下package com.ibigsea.bootdao;import org.mybatis.spring.annotation.MapperScan;import org.springframework.boot.SpringApplication;import org.springframework.boot.autoconfigure.SpringBootApplication; importorg.springframework.transaction.annotation.EnableTransactionManagement;@SpringBootApplicationpublic class UserApplication {public static void main(String[] args) {SpringApplication.run(UserApplication.class, args);}}package com.ibigsea.bootdao.controller;import org.springframework.web.bind.annotation.RequestMapping;import org.springframework.web.bind.annotation.RestController;@RestController@RequestMapping("users")public class UserController {@RequestMapping("hello")public String hello(){return "Hello World";}}浏览器访问结果如下:⾄此⼀个简单的springboot的应⽤已完成,下⾯整合mybatis实现简单的增删改查案例⼆、springboot整合mybatis案例2.1 ⾸先需要在pox.xml导⼊jar 在hello world案例之上添加如下⼏个jar包</dependency>2.2 在src/main/resources⽬录下创建⼀个application.properties⽂件,内容如下2.3 entity类package com.ibigsea.bootdao.entity;import java.io.Serializable;public class User implements Serializable {private static final long serialVersionUID = 8809101560720973267L; private Integer id;private String userName;private Integer age;public User() {// TODO Auto-generated constructor stub}public User(String userName, Integer age) {super();erName = userName;this.age = age;}public Integer getId() {return id;}public void setId(Integer id) {this.id = id;}public String getUserName() {public void setUserName(String userName) {erName = userName;}public Integer getAge() {return age;}public void setAge(Integer age) {this.age = age;}@Overridepublic String toString() {return "User [id=" + id + ", userName=" + userName + ", age=" + age + "]";}}2.4 mapper接⼝类可以在类加上@Mapper注解也可以在springboot应⽤的程序⼊⼝类@MapperScan(“com.ibigsea.bootdao.mapper”) package com.ibigsea.bootdao.mapper;import java.util.List;import org.apache.ibatis.annotations.Mapper;import er;public interface UserMapper {/*** 新增* @param userint save(User user);/*** 根据Id查询* @param user* @return*/User selectById(Integer id);/*** 根据Id修改* @param user* @return*/int updateById(User user);/*** 删除* @param user* @return*/int deleteById(Integer id);/*** 查询所有* @param user* @return*/List<User> queryAll();/*** 根据username查询*/User findByName(String username); }<?xml version="1.0" encoding="UTF-8" ?><!DOCTYPE mapper PUBLIC "-////DTD Mapper 3.0//EN""/dtd/mybatis-3-mapper.dtd" ><mapper namespace="erMapper" ><insert id="save" parameterType="er">insert into user(username,age) values(#{userName,jdbcType=VARCHAR},#{age,jdbcType=NUMERIC})</insert><select id="selectById" resultType="er">select * from user where id = #{id,jdbcType=NUMERIC}</select><update id="updateById" parameterType="er"> update user setusername = #{userName,jdbcType=VARCHAR} ,age = #{age,jdbcType=NUMERIC}where id = #{id,jdbcType=NUMERIC}</update><delete id="deleteById">delete from user where id = #{id,jdbcType=NUMERIC}</delete><select id="queryAll" resultType="er">select * from user</select><select id="findByName" resultType="er">select * from user where username=#{userName}</select></mapper>2.6 业务接⼝类与2.4的mapper接⼝类内容⼀致2.7 业务接⼝类的实现package com.ibigsea.bootdao.service.impl;import java.util.List;import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service;import org.springframework.transaction.annotation.Transactional;import er;import erMapper;import erService;@Transactional@Servicepublic class UserServiceImpl implements UserService{@Autowiredprivate UserMapper userMapper;@Overridepublic int save(User user) {int myuser= userMapper.save(user);//测试事务管理//int i =1/0;return myuser;}@Overridepublic User selectById(Integer id) {return userMapper.selectById(id);}@Overridepublic int updateById(User user) {return userMapper.updateById(user);}@Overridepublic int deleteById(Integer id) {return userMapper.deleteById(id);}@Overridepublic List<User> queryAll() {return userMapper.queryAll();}@Overridepublic User findByName(String username) {return userMapper.findByName(username);}}此处配置了事物管理需要在springboot⼊⼝类添加@EnableTransactionManagement 开启事物管理2.8 控制层package com.ibigsea.bootdao.controller;import java.util.List;import org.springframework.beans.factory.annotation.Autowired;import org.springframework.web.bind.annotation.PathVariable;import org.springframework.web.bind.annotation.RequestMapping;import org.springframework.web.bind.annotation.RestController;import er;import erService;@RestController@RequestMapping("users")public class UserController {@RequestMapping("hello")public String hello(){return "Hello World";}@RequestMapping("/add/{name}/{age}")public User insert(@PathVariable("name")String name,@PathVariable Integer age){userService.save(new User(name,age));return userService.findByName(name);}@RequestMapping("/findById/{id}")public User findById(@PathVariable("id") Integer id){return userService.selectById(id);}@RequestMapping("/deleteById/{id}")public void deleteById(@PathVariable("id") Integer id){userService.deleteById(id);}@RequestMapping("/updateById/{id}")public void updateById(@PathVariable("id") Integer id){User user = new User();user.setId(id);user.setAge(100);user.setUserName("xiaoguo");userService.updateById(user);}@RequestMapping("getUserList")public List<User> getUserList(){return userService.queryAll();}}2.9 spring boot 程序⼊⼝启动类package com.ibigsea.bootdao;import org.mybatis.spring.annotation.MapperScan;import org.springframework.boot.SpringApplication;import org.springframework.boot.autoconfigure.SpringBootApplication; importorg.springframework.transaction.annotation.EnableTransactionManagement;@SpringBootApplication@EnableTransactionManagement@MapperScan("com.ibigsea.bootdao.mapper")public class UserApplication {public static void main(String[] args) {SpringApplication.run(UserApplication.class, args);}}⾄此springboot整合mybatis整合完成,项⽬的⽬录结构如下:运⾏结果如下:。
ibatis批量查询注解⽅式多参数(多字段)1//@Select("select id, student_id, test_paper_problem_id, score, respondence, mistake_id from T_RESPONDENCE where student_id in #{studentId} and test_paper_problem_id=#{testPaperProblemId}")2 @SelectProvider(type = RespondenceBeanProvider.class, method = "getRespondenceBeanByStudentIdANDTestPaperProblemIdBatch")3 @Results(value = {@Result(property = "id", column = "id"), @Result(property = "studentId", column = "student_id"),4 @Result(property = "testPaperProblemId", column = "test_paper_problem_id"),5 @Result(property = "score", column = "score"), @Result(property = "respondence", column = "respondence"),6 @Result(property = "mistakeId", column = "mistake_id")})7 List<RespondenceBean> getRespondenceBeanByStudentIdANDTestPaperProblemIdBatch(List<Set<String>> studentIds);上⾯这个代码是mapper 可以理解成dao8package .njfu.cs.eas.db.provider;910import java.util.List;11import java.util.Map;12import java.util.Set;1314import ng.StringUtils;1516/**19 *20 * @author chenxiaguang@21 * @version [版本号, 2012-9-28]24*/25public class RespondenceBeanProvider26 {2728public String getRespondenceBeanByStudentIdANDTestPaperProblemIdBatch(Map map)29 {3031/**32 * param1-->studentIds33 * param2-->problemIds34*/35 System.out.println("---" + map);36 List<Set<String>> studentIdsAndProblems = (List<Set<String>>)map.get("list");37// List<String> problemIds = (List<String>)map.get("param2");3839 String studentIdsStr = StringUtils.join(studentIdsAndProblems.get(0), ',');40 String problemIdsStr = StringUtils.join(studentIdsAndProblems.get(1), ',');41return "select * from T_RESPONDENCE where student_id in (" + studentIdsStr + ") and test_paper_problem_id in ("42 + problemIdsStr + ")";43// return "select * from T_RESPONDENCE where student_id in (540) and test_paper_problem_id in (31)";44 }45 }上⾯这个是provider 为mapper准备8package .njfu.cs.eas.db.mapper;910import java.util.ArrayList;11import java.util.HashSet;12import java.util.List;13import java.util.Set;1415import org.junit.Before;16import org.junit.Test;1718import mon.bean.RespondenceBean;19import mon.util.SpringUtils;2021/**24 *25 * @author chenxiaguang@26 * @version [版本号, 2012-9-28]29*/30public class RespondenceBeanMapperTest31 {3233private RespondenceBeanMapper mapper;3435/**36 *37 * @throws ng.Exception38 * @see [类、类#⽅法、类#成员]39*/40 @Before41public void setUp() throws Exception42 {43 SpringUtils springUtils = new SpringUtils(new String[]{"classpath:databaseContext.xml"});44 mapper = springUtils.getBean(RespondenceBeanMapper.class, "respondenceBeanMapper");45 }4647/**48 * Test method for {@link .njfu.cs.eas.db.mapper.RespondenceBeanMapper#getRespondenceBeanByStudentIdANDTestPaperProblemIdBatch(java.util.Set, java.util.Set)}.49*/50 @Test51public void testGetRespondenceBeanByStudentIdANDTestPaperProblemIdBatch()52 {53 Set<String> studentIds = new HashSet<String>();54 Set<String> testPaperProblemIds = new HashSet<String>();55 studentIds.add("535");56 testPaperProblemIds.add("27");57 studentIds.add("536");58 testPaperProblemIds.add("28");5960 List<Set<String>> xxxargs = new ArrayList<Set<String>>();61 xxxargs.add(studentIds);62 xxxargs.add(testPaperProblemIds);63 List<RespondenceBean> ress = this.mapper.getRespondenceBeanByStudentIdANDTestPaperProblemIdBatch(xxxargs);64 System.out.println(ress.size());65 }6667 }单元测试代码。
SpringBoot集成Mybatis实现多表查询的两种⽅式(基于xml)下⾯将在⽤户和账户进⾏⼀对⼀查询的基础上进⾏介绍SpringBoot集成Mybatis实现多表查询的基于xml的两种⽅式。
⾸先我们先创建两个数据库表,分别是user⽤户表和account账户表
user表:
account表:
然后创建实体类
**第⼀种通过创建⼦类的⽅式查询
需求:查询所有的⽤户基础信息以及其所属的账户中的⾦额
1.创建想要得到多表查询数据的实体类(⼦类)
2.创建对应的Dao以及Service及实现类
3.xml中写实现查询的sql语句
4.编写控制器并访问资源路径
访问资源路径:
**第⼆种通过建⽴实体类关系⽅式查询
需求:查询所有账户及其所属⽤户的所有基础⽤户信息
这种⽅式也是⽬前为⽌最为常⽤的⼀种⽅式,许多教学教程上也都采⽤了这种⽅式,那么我们⼀起来看看。
⾸先这种⽅式不需要向第⼀种⽅式那样创建⼀个⼦类⽤来封装查询的结果集,但从表实体应该包含⼀个主表实体的对象引⽤
只需要在Account实体类中增加⼀个user属性即可,并⽣成对应的getter和setter⽅法。
修改如下:
接下来是在xml中进⾏映射实体类关系
对应的dao和service就不再具体截图出来了,接下来是控制器(也没变化)。
接下来访问资源路径:
总结:
两种⽅式都是对实体类进⾏了⼀些调整,第⼆种⽤了跟实体类建⽴了映射关系,关于Mybatis中实体类属性与数据库列表间映射⽅法可以看后⾯的随笔。
iBatis整理——iBatis批处理实现(Spring环境)最近做⼀个⼩项⽬,⽤到Spring+iBatis。
突然遇到⼀个很久远,却很实在的问题:在Spring下怎么使⽤iBatis的批处理实现?⼤概是太久没有写Dao了,这部分真的忘得太⼲净了。
从4个层⾯分析这部分实现:1. iBatis的基本实现2. 基于事务的iBatis的基本实现3. 基于事务的Spring+iBatis实现4. 基于回调⽅式的Spring+iBatis实现1.iBatis的基本实现 iBatis通过SqlMapClient提供了⼀组⽅法⽤于批处理实现: startBatch() 开始批处理executeBatch() 执⾏批处理代码如下: Java代码 public void create(List<Reply> replyList) { try { // 开始批处理 sqlMapClient.startBatch(); for (Reply reply: replyList) { // 插⼊操作 sqlMapClient.insert("Reply.create", reply); } // 执⾏批处理 sqlMapClient.executeBatch(); } catch (Exception e) { e.printStackTrace(); } } 这是基于iBatis的最基本实现,如果你⼀步⼀步debug,你会发现:其实,数据库已经执⾏了插⼊操作!因此,除了这两个核⼼⽅法外,你还需要开启事务⽀持。
否则,上述代码只不过是个空架⼦! 2.基于事务的iBatis的基本实现事务处理: startTransaction() 开始事务commitTransaction() 提交事务endTransaction() 结束事务我们以insert操作为例,把它们结合到⼀起: Java代码 public void create(List<Reply> replyList) { try { // 开始事务 sqlMapClient.startTransaction(); // 开始批处理 sqlMapClient.startBatch(); for (Reply reply: replyList) { // 插⼊操作 sqlMapClient.insert("Reply.create", reply); } // 执⾏批处理 sqlMapClient.executeBatch(); // 提交事务 mitTransaction(); } catch (Exception e) { e.printStackTrace(); } finally { try { // 结束事务 sqlMapClient.endTransaction(); } catch (SQLException e) { e.printStackTrace(); } } } replyList是⼀个List,要把这个List插⼊到数据库,就需要经过这三个步骤:开始批处理 startBatch()插⼊ insert()执⾏批处理 executeBatch()如果要在Spring+iBatis中进⾏批处理实现,需要注意使⽤同⼀个sqlMapClient!同时,将提交事务的⼯作交给Spring统⼀处理! 3.基于事务的Spring+iBatis实现 Java代码 public void create(List<Reply> replyList) { if (!CollectionUtils.isEmpty(replyList)) { // 注意使⽤同⼀个SqlMapClient会话 SqlMapClient sqlMapClient = sqlMapClientTemplate.getSqlMapClient(); try { // 开始事务 sqlMapClient.startTransaction(); // 开始批处理 sqlMapClient.startBatch(); for (Reply reply : replyList) { // 插⼊操作 sqlMapClient.insert("Reply.create", reply); } // 执⾏批处理 sqlMapClient.executeBatch(); // 提交事务交给Spring统⼀控制 // mitTransaction(); } catch (Exception e) { e.printStackTrace(); } finally { try { // 结束事务 sqlMapClient.endTransaction(); } catch (SQLException e) { e.printStackTrace(); } } } } 注意使⽤同⼀个sqlMapClient: SqlMapClient sqlMapClient = sqlMapClientTemplate.getSqlMapClient(); 如果直接sqlMapClientTemplate执⾏insert()⽅法,将会造成异常!想想,还有什么问题?其实问题很明显,虽然解决了批处理实现的问题,却造成了事务代码⼊侵的新问题。
springboot整合mybatis-plus基于注解实现⼀对⼀(⼀对多)查询功能因为⽬前所⽤mybatis-plus版本为3.1.1,感觉是个半成品,所有在实体类上的注解只能⽀持单表,没有⼀对⼀和⼀对多关系映射,且该功能还在开发中,相信mybatis-plus开发团队在不久的将来应该会实现此功能。
由于本⼈开发习惯的原因,实在是太讨厌⼤量的xml充斥在整个项⽬中,尤其是表的mapper.xml,虽然有代码⽣成器可以⽣成,但是有些复杂的查询还是需要⼿写配置⽂件⾥的动态sql,这点⽐较反感(⾄于为什么反感,也是有多⽅⾯原因的)。
不过可能是⼤量的java开发⼈员已经被虐惯了,已经习惯各种配置⽂件,虽然有代码⽣成器,但是本⼈觉得,这种不是真正的路⼦,按理说开源出去的东西让别⼈⽤的越简单越爽越好,⽽不是还需要依赖⼤量的⼯具配合才能使⽤(这个观点仁者见仁智者见智吧)。
因为本⼈采⽤的是spring-boot进⾏开发,本⾝springboot就提倡采⽤不⽤配置⾃动配置的⽅式,所以真⼼希望mybatis(不是mybatis-plus)这点需要继续努⼒。
基于这点,采⽤了mybatis-plus⾥的已经实现好的⽅法来进⾏了取巧的操作,废话不多说,直接上代码。
数据库是mysql。
demo的思路是这样的:学⽣表(Student),学⽣班级表(StudentClass),在学⽣的实体类⾥通过班级Id和班级进⾏⼀对⼀关联,主要通过mapper接⼝来实现,基于@Results、@Result、@One(或@Many)、@ResultMap这⼏个mybatis⾥的注解加上mybatis-plus⾥的BaseMapper、QueryWrapper<ChannelEntity>结合起来实现,所以还得写⼀些代码。
如果mybatis-plus团队把关系映射⼀并实现注解到实体对象上就能省⼤量代码了,期待他们早⽇实现。
pom⽂件<?xml version="1.0" encoding="UTF-8"?><project xmlns="/POM/4.0.0" xmlns:xsi="/2001/XMLSchema-instance"xsi:schemaLocation="/POM/4.0.0 /xsd/maven-4.0.0.xsd"><modelVersion>4.0.0</modelVersion><parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><version>2.1.4.RELEASE</version><relativePath/> <!-- lookup parent from repository --></parent><groupId>com.lyb</groupId><artifactId>spring-mybatis-demo</artifactId><version>0.0.1-SNAPSHOT</version><packaging>jar</packaging><name>spring-mybatis-demo</name><description>Demo project for Spring Boot</description><properties><project.build.sourceEncoding>UTF-8</project.build.sourceEncoding><project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding><java.version>1.8</java.version></properties><dependencies><!--<dependency><groupId>org.mybatis.spring.boot</groupId><artifactId>mybatis-spring-boot-starter</artifactId><version>2.0.0</version></dependency>--><dependency><groupId>com.baomidou</groupId><artifactId>mybatis-plus-boot-starter</artifactId><version>3.1.1</version></dependency><dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId><version>1.18.8</version><scope>provided</scope></dependency><dependency><groupId>com.baomidou</groupId><artifactId>mybatis-plus</artifactId><version>3.1.1</version></dependency><dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId><scope>runtime</scope></dependency><dependency><groupId>com.baomidou</groupId><artifactId>mybatis-plus-generator</artifactId><version>3.1.1</version></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-test</artifactId><scope>test</scope></dependency></dependencies><build><plugins><plugin><groupId>org.springframework.boot</groupId><artifactId>spring-boot-maven-plugin</artifactId></plugin></plugins></build></project>可以看到数据库操作只需依赖mybatis-plus-boot-starterapplication.yml⽂件spring:datasource:url: jdbc:mysql://127.0.0.1:3306/demo?useUnicode=true&characterEncoding=utf8&serverTimezone=UTCusername: rootpassword: liuyabindriver-class-name: com.mysql.jdbc.Drivermybatis-plus:type-aliases-package: com.lyb.springmybatisdemo.entitytype-aliases-super-type: ng.ObjectStudent实体类代码,可以看到实体类上加上了mybatis-plus的注解,这⾥也加了@Data lombok的注解为了节省多敲代码:package com.lyb.springmybatisdemo.entity;import com.baomidou.mybatisplus.annotation.IdType;import com.baomidou.mybatisplus.annotation.TableField;import com.baomidou.mybatisplus.annotation.TableId;import com.baomidou.mybatisplus.annotation.TableName;import lombok.*;@Data@Builder@ToString@EqualsAndHashCode@NoArgsConstructor@AllArgsConstructor@TableName(value = "student")public class Student {@TableId(value = "Id",type = IdType.AUTO)private int id;@TableField(value = "SName",exist = true,select = true)private String name;@TableField(value = "Age")private int age;@TableField(value = "ClassId")private int classId;@TableField(exist = false)private StudentClass studentClass;}StudentClass类代码:package com.lyb.springmybatisdemo.entity;import com.baomidou.mybatisplus.annotation.IdType;import com.baomidou.mybatisplus.annotation.TableField;import com.baomidou.mybatisplus.annotation.TableId;import com.baomidou.mybatisplus.annotation.TableName;import lombok.*;@Data@Builder@ToString@EqualsAndHashCode@NoArgsConstructor@AllArgsConstructor@TableName(value = "stuClass")public class StudentClass {@TableId(value = "ClassId",type = IdType.AUTO)private int classId;@TableField(value = "ClassName")private String className;}具体的数据库结构就不放了,参照实体类上注解就很能轻松构建出来,因为就两个表。
getSqlMapClientTemplate()模板查询getSqlMapClientTemplate()提供三种常用的方法对数据进行查询,返回Object、List、Map的数据类型,各自对应的方法分别为:queryForObject()、queryForList()、queryForMap(),下面将通过具体的实例来说明各种方法的用法。
1.queryForObject()
该方法回来一个实体类型,很适合返回单条数据的查询;
"DT_MATCH.queryMatchById"Mapper配置文件中的sql,map是方法中的参数对应sql中的条件
DAO的方法实现:
public MATCH queryMatchById(long matchId) {
Map<String, Object> map = new HashMap<String, Object>();
map.put("matchId", matchId);
MATCH match =
(MATCH)getSqlMapClientTemplate().queryForObject("DT_M
ATCH.queryMatchById", map);
return match;
}
对应的实体类的mapper文件中的sql为:
<select id="queryMatchById"parameterClass="map"
resultMap="ibatorgenerated_BaseResultMap">
select t.* from dt_match t where t.nummatchid =
#matchId#
</select>
2.queryForList()
该方法回合一个集合,适合返回结果集的数据查询;方法中的参数含义和1中的一样,不在多说。
DAO的方法实现:
public List<MATCH> queryMatchByDateStart(String
startDate , long seasonId) {
Map<String, Object> params = new HashMap<String, Object>();
params.put("startDate", startDate);
params.put("seasonId", seasonId);
List<MATCH> list =
getSqlMapClientTemplate().queryForList("DT_MATCH.quer yMatchByDateStart", params);
return list;
}
对应的实体类的mapper文件中的sql为:
<select id="queryMatchByDateStart"parameterClass="map" resultMap="ibatorgenerated_BaseResultMap">
select t.* from dt_match t wher
to_char( t.datmatchstart , 'YYYY-MM-DD') = #startDate# and t.numseasonid = #seasonId#
</select>
3.queryForMap()
以上两种方法是开发中最常用到的,第三种方法用到的相对较少,但是此方法非常实用需要返回以键值对存在的数据。
执行该方法后会直接返回Map类型的数据,因此该方法对应的Mapper文件中的sql和resultMap配置较1和2为多点,但是也十分简单实用。
该方法中的第一、二个意思同上;第三四个参数分别表示的是Mapper配置文件中resultMap中的属性值,指明返回Map中的key和value。
DAO的方法实现:
public Map<String, Integer>
countMatchByTodayBefore(long seasonId,
String today) {
Map<String, Object> params = new HashMap<String, Object>();
params.put("seasonId", seasonId);
params.put("today", today);
Map<String, Integer> map =
getSqlMapClientTemplate().queryForMap("DT_MATCH.query TodayAndBeforeMatch", params, "key", "value");
return map;
}
对应的实体类的mapper文件中的sql为:
<select id="queryTodayAndBeforeMatch"parameterClass="map" resultMap="item_map">
select tc.* from (
select count(*) as count_today ,
to_char( t.datmatchstart , 'YYYY-MM-DD') as d from dt_match t
where t.numseasonid = #seasonId#
group by to_char( t.datmatchstart ,
'YYYY-MM-DD')
having to_char( t.datmatchstart , 'YYYY-MM-DD') <#today#
order by to_char( t.datmatchstart ,
'YYYY-MM-DD') desc) tc where rownum <=5
</select>
<resultMap class="java.util.HashMap"id="item_map"> <result property="key"jdbcType="CHAR"column="d"/>
<result property="value"jdbcType="Integer"
javaType="ng.Integer"column="count_today"/> </resultMap>
在此resultMap配置中需要注意的是如果返回的key或者value中如果是数字类型的,一定要在此指明java的数据类型即jdbcType的属性值,如果不指定,在方法中返回的数据中进行数据间的转化会报类型转化错误,如(BigDecimal类型不能转化成Integer或者是其他的类型)。