长图制作_在线一键抠图免费_圆形抠图_抠图神手_微信小程序图标设计
当前位置:建站首页 > 新闻资讯 > 常见问题 >

mybatis新方式MyBatis三dynamicSQL的应用及join联接查寻

发表日期:2021-04-04 10:59文章编辑:jianzhan浏览次数: 标签:    

MyBatis Generator 1.3.6版本号刚开始适用新的一种runtime方式:MyBatis三dynamicSql。它是一种全新升级的方式,对java的版本号规定最少是java 8。


该方式下已不转化成 XML,已不转化成 Example 类。文本文档里也强烈推荐:join 实际操作要采用的 resultMap 应当是 XML 文档中的唯一原素。


MyBatis Generator ( = 1.3.6) 也早已出示适用,只必须将 context 的 targetRuntime 特性变更为 MyBatis三dynamicSQL 就可以转化成新的动态性 SQL。


厉害在哪儿里?它可结构随意 SQL:

SelectStatementProvider selectStatement = select(id, firstName, lastName, birthDate, employed, occupation)
 .from(employee)
 .where(firstName, isEqualTo( Bob ), or(firstName, isEqualTo( Alice )))
 .build()
 .render(RenderingStrategy.MYBATIS3);
List Employee  employees = mapper.selectMany(selectStatement);


MyBatis Generator 的配备文档里那样配备:

 generatorConfiguration 
  context id= dsql  targetRuntime= MyBatis三dynamicSql 
  jdbcConnection driver >


随后Run mybatis-generator:generate  便可以转化成下列的三个类了:

model类、dao层的mapper类、*DynamicSqlSupport动态性句子适用类。


文中的关心点是如何在这里种新方式下MyBatis三dynamicSql,应用关系查寻, 便是相匹配老方式 MyBatis3 下的 association(一对一)、collection(一对多)。


仍然拿到面的实体模型举例说明:

新闻报道表 news (在其中字段名cat_id相匹配归类表的id)

新闻报道归类表 news_categories


News.java 实体模型里加上:

 /* 自定特性 */
 private NewsCategories cat;
 public NewsCategories getCat(){ return cat; }
 public void setCat(NewsCategories cat){ this.cat = cat; }
 /* 自定特性 - 一部分字段名 */
 private Map catMap;
 public Map getCatMap(){ return catMap; }
 public void setCatMap(Map catMap){ this.catMap = catMap; }

NewsCategories.java 实体模型里加上:

 // 自定
 private List News  newsList;
 public List News  getNewsList(){ return newsList; }
 public void setNewsList(List News  newsList){ this.newsList = newsList; }
 // 自定 - Map 一部分字段名
 private List Map  newsMapList;
 public List Map  getNewsMapList(){ return newsMapList; }
 public void setNewsMapList(List Map  newsMapList){ this.newsMapList = newsMapList; }


实体模型里为何界定2种方式呢?飘易是以便演试在一些情景下,只必须回到关系实体模型的一一部分字段名,例如有上一百多个字段名但只必须好多个字段名,要除去一部分比较敏感字段名如登陆密码等。界定为Map方式适用回到一部分字段名,而立即应用实体模型得话,及时相匹配字段名沒有传值,也会回到 null。


NewsMapper.java DAO层加上:

 // 自定
 @Generated(value= org.mybatis.generator.api.MyBatisGenerator ,&ments= Source Table: news )
 @SelectProvider(type=SqlProviderAdapter.class, method= select )
 @ResultMap( joinNewsResult )
 Optional News  selectOneJoin(SelectStatementProvider selectStatement);
 // 自定
 @Generated(value= org.mybatis.generator.api.MyBatisGenerator ,&ments= Source Table: news )
 @SelectProvider(type=SqlProviderAdapter.class, method= select )
 @ResultMap( joinNewsResult )
 List News  selectManyJoin(SelectStatementProvider selectStatement);


NewsCategoriesMapper.java Dao加上:

 // 自定 - join 联接查寻
 @Generated(value= org.mybatis.generator.api.MyBatisGenerator ,&ments= Source Table: news_categories )
 @SelectProvider(type=SqlProviderAdapter.class, method= select )
 @ResultMap( joinNewsCategoriesResult )
 Optional NewsCategories  selectOneJoin(SelectStatementProvider selectStatement);
 // 自定 - join 联接查寻
 @Generated(value= org.mybatis.generator.api.MyBatisGenerator ,&ments= Source Table: news_categories )
 @SelectProvider(type=SqlProviderAdapter.class, method= select )
 @ResultMap( joinNewsCategoriesResult )
 List NewsCategories  selectManyJoin(SelectStatementProvider selectStatement);


留意,应用join查寻时仍然必须配备xml文档,由于纯碎的注释方法其实不能非常好的界定关系关联 association(一对一)、collection(一对多);可是xml文档里只必须界定 resultMap 连接点,不用界定别的一切连接点了。


NewsMapper.xml 里界定:

 mapper namespace= com.example.demo.mapper.NewsMapper 
  resultMap id= joinNewsResult  type= com.example.demo.model.News 
  id column= id  jdbcType= INTEGER  property= id  / 
  result column= cat_id  jdbcType= INTEGER  property= catId  / 
  result column= title  jdbcType= VARCHAR  property= title  / 
  result column= keywords  jdbcType= VARCHAR  property= keywords  / 
  result column= description  jdbcType= VARCHAR  property= description  / 
  result column= filepaths  jdbcType= VARCHAR  property= filepaths  / 
  result column= views  jdbcType= INTEGER  property= views  / 
  result column= recommend  jdbcType= TINYINT  property= recommend  / 
  result column= created_at  jdbcType= TIMESTAMP  property= createdAt  / 
  result column= updated_at  jdbcType= TIMESTAMP  property= updatedAt  / 
  result column= content  jdbcType= LONGVARCHAR  property= content  / 
  !-- 一对一关系关联 -- 
  association property= cat  javaType= com.example.demo.model.NewsCategories 
  id column= c_id  jdbcType= INTEGER  property= id / 
  result column= c_title  jdbcType= VARCHAR  property= title / 
  /association 
  association property= catMap  javaType= map 
  id column= c_id  jdbcType= INTEGER  property= id / 
  result column= c_title  jdbcType= VARCHAR  property= title / 
  /association 
  /resultMap 
 /mapper 


NewsCategoriesMapper.xml 文档里界定:

 mapper namespace= com.example.demo.mapper.NewsCategoriesMapper 
  resultMap id= joinNewsCategoriesResult  type= com.example.demo.model.NewsCategories 
  id column= id  jdbcType= INTEGER  property= id  / 
  result column= title  jdbcType= VARCHAR  property= title  / 
  result column= keywords  jdbcType= VARCHAR  property= keywords  / 
  result column= description  jdbcType= VARCHAR  property= description  / 
  result column= sort_id  jdbcType= INTEGER  property= sortId  / 
  result column= created_at  jdbcType= TIMESTAMP  property= createdAt  / 
  result column= updated_at  jdbcType= TIMESTAMP  property= updatedAt  / 
  !-- 一对多关系关联 -- 
  collection property= newsList  ofType= com.example.demo.model.News 
  id column= n_id  jdbcType= INTEGER  property= id  / 
  result column= cat_id  jdbcType= INTEGER  property= catId  / 
  result column= n_title  jdbcType= VARCHAR  property= title  / 
  result column= keywords  jdbcType= VARCHAR  property= keywords  / 
  result column= description  jdbcType= VARCHAR  property= description  / 
  result column= filepaths  jdbcType= VARCHAR  property= filepaths  / 
  result column= views  jdbcType= INTEGER  property= views  / 
  result column= recommend  jdbcType= TINYINT  property= recommend  / 
  result column= n_created_at  jdbcType= TIMESTAMP  property= createdAt  / 
  result column= updated_at  jdbcType= TIMESTAMP  property= updatedAt  / 
  result column= content  jdbcType= LONGVARCHAR  property= content  / 
  /collection 
  collection property= newsMapList  ofType= java.util.Map 
  id column= n_id  jdbcType= INTEGER  property= id  / 
  result column= n_title  jdbcType= VARCHAR  property= title  / 
  result column= n_created_at  jdbcType= TIMESTAMP  property= createdAt  / 
  /collection 
  /resultMap 
 /mapper 


留意:association(一对一)里应用的特性是 javaType;而 collection(一对多)里应用的特性是 ofType!


好啦,提前准备工作中搞好,下边飘易就在操纵器里写操纵层的编码了。


NewsController.java 里撰写编码:

@RestController
public class NewsController {
 @Resource
 private NewsMapper newsMapper;
 @Resource
 private NewsCategoriesMapper newsCategoriesMapper;
 /**
 * 单独資源
 * */
 @GetMapping( /news/{id} )
 public Result item(@PathVariable( id ) Integer id) {
 // 挑选
 SelectStatementProvider selectStatement = select(news.allColumns(),
 (newsCategories.id).as( c_id ), (newsCategories.title).as( c_title ))
 .from(news)
 .leftJoin(newsCategories).on(news.catId, equalTo(newsCategories.id))
 .where(news.id, isEqualTo(id))
 .build()
 .render(RenderingStrategies.MYBATIS3);
 Optional News  news = newsMapper.selectOneJoin(selectStatement);
 return Result.data(news);
 }
 /**
 * 資源目录
 * */
 @GetMapping( /news )
 public Result itemList(@RequestParam Map String,String  req) {
 // 分页查询页码主要参数
 int pageNum = req.containsKey( pageNum ) ? Integer.parseInt(req.get( pageNum )) : Result.pageNum;
 int pageSize = req.containsKey( pageSize ) ? Integer.parseInt(req.get( pageSize )) : Result.pageSize;
 // 刚开始分页查询
 PageHelper.startPage(pageNum, pageSize);// 紧随着的第一个select方式会被分页查询
 // 挑选
 SelectStatementProvider selectStatement = select(news.allColumns(),
 (newsCategories.id).as( c_id ), (newsCategories.title).as( c_title ))
 .from(news)
 .leftJoin(newsCategories).on(news.catId, equalTo(newsCategories.id))
 .orderBy(sortColumn( news.id ).descending())
 .build()
 .render(RenderingStrategies.MYBATIS3);
 List News  list = newsMapper.selectManyJoin(selectStatement);
 PageInfo pageInfo = new PageInfo(list);// 分页查询包裝
 return Result.list(pageInfo);
 }
 /**
 * 提升
 * @param news: 接纳 Content-Type: application/x-www-form-urlencoded
 * body里为 title=test cat_id=1
 * */
 @PostMapping( /news )
 public Result insert(News news) {
 Date date = new Date();
 news.setCreatedAt(date);
 news.setUpdatedAt(date);
 Integer res = newsMapper.insertSelective(news);
 return Result.data(res);
 }
 /**
 * 编写
 * */
 @PutMapping( /news/{id} )
 public Result update(@PathVariable( id ) Integer id, News news) {
 Date date = new Date();
 news.setUpdatedAt(date);
 news.setId(id);
 Integer res = newsMapper.updateByPrimaryKeySelective(news);
 return Result.data(res);
 }
 /**
 * 删掉
 * */
 @DeleteMapping( /news/{id} )
 public Result delete(@PathVariable( id ) Integer id) {
 Integer res = newsMapper.deleteByPrimaryKey(id);
 return Result.data(res);
 }
}


NewsCategoriesController.java 里撰写编码:

@RestController
public class NewsCategoryController {
 @Resource
 private NewsMapper newsMapper;
 @Resource
 private NewsCategoriesMapper newsCategoriesMapper;
 /**
 * 单独資源
 * */
 @GetMapping( /news_category/{id} )
 public Result item(@PathVariable( id ) Integer id) {
 SelectStatementProvider selectStatement = select(newsCategories.allColumns(),
 (news.id).as( n_id ),(news.title).as( n_title ),(news.createdAt).as( n_created_at ))
 .from(newsCategories)
 .leftJoin(news)
 .on(newsCategories.id, equalTo(news.catId))
 .where(newsCategories.id, isEqualTo(id))
 .orderBy(sortColumn( news_categories.id ).descending())
 .build()
 .render(RenderingStrategies.MYBATIS3);
 // 单独
 Optional NewsCategories  newsCategories = newsCategoriesMapper.selectOneJoin(selectStatement);
 return Result.data(newsCategories);
 }
 /**
 * 資源目录
 * */
 @GetMapping( /news_category )
 public Result itemList(@RequestParam Map String,String  req) {
 // 分页查询页码主要参数
 int pageNum = req.containsKey( pageNum ) ? Integer.parseInt(req.get( pageNum )) : Result.pageNum;
 int pageSize = req.containsKey( pageSize ) ? Integer.parseInt(req.get( pageSize )) : Result.pageSize;
 // 刚开始分页查询
 PageHelper.startPage(pageNum, pageSize);// 紧随着的第一个select方式会被分页查询
 // 挑选
 SelectStatementProvider selectStatement = select(newsCategories.allColumns(),
 (news.id).as( n_id ),(news.title).as( n_title ),(news.createdAt).as( n_created_at ))
 .from(newsCategories)
 .leftJoin(news)
 .on(newsCategories.id, equalTo(news.catId))
 .orderBy(sortColumn( news_categories.id ).descending())
 .build()
 .render(RenderingStrategies.MYBATIS3);
 List NewsCategories  list = newsCategoriesMapper.selectManyJoin(selectStatement);
 PageInfo pageInfo = new PageInfo(list);// 分页查询包裝
 return Result.list(pageInfo);
 }
 /**
 * 提升
 * @param newsCategories: 接纳 Content-Type: application/x-www-form-urlencoded
 * body里为 title=test cat_id=1
 * */
 @PostMapping( /news_category )
 public Result insert(NewsCategories newsCategories) {
 Date date = new Date();
 newsCategories.setCreatedAt(date);
 newsCategories.setUpdatedAt(date);
 Integer res = newsCategoriesMapper.insertSelective(newsCategories);
 return Result.data(res);
 }
 /**
 * 编写
 * */
 @PutMapping( /news_category/{id} )
 public Result update(@PathVariable( id ) Integer id, NewsCategories newsCategories) {
 Date date = new Date();
 newsCategories.setUpdatedAt(date);
 newsCategories.setId(id);
 Integer res = newsCategoriesMapper.updateByPrimaryKeySelective(newsCategories);
 return Result.data(res);
 }
 /**
 * 删掉
 * */
 @DeleteMapping( /news_category/{id} )
 public Result delete(@PathVariable( id ) Integer id) {
 Integer res = newsCategoriesMapper.deleteByPrimaryKey(id);
 return Result.data(res);
 }
}


关系查寻里,association(一对一)、collection(一对多)里 假如应用 select 特性得话,便会造成 N+1 的难题。大家应用 join 联接查寻,那样能够防止造成 N+1 难题。



应用postman,查寻 news 单独資源:


查寻 news 目录:


查寻 news_categories 单独資源:

查寻 news_categories 目录:



【参照】

1、MyBatis Dynamic SQL Usage Notes:generator/

2、MyBatis Dynamic SQL Quick Start:mybatis-dynamic-sql/



返回列表
相关新闻

教你迅速识破百度搜索快照更新不升级的五个罪

百度搜索快照更新是网立在百度搜索优化算法管理体系中权重值产生转变的风频标,可以最立...

日期:2021-04-04 浏览次数:113

PHP程序编写,PHP技术性,PHP新手入门实例教程

【番号档】小结汇总立交桥未久下马至今全部步兵团番号合集加上 公布:smiling 无法相信的是...

日期:2021-04-03 浏览次数:176

查验详细介绍长尾关键词词的设定,新闻报道动态

公布人:管理方法员 公布企业网站建设必须有非常好的适配性,要可以同时适用多种多样访问器...

日期:2021-04-03 浏览次数:150

互联网营销推广之网络推广的方式新花式探讨

互联网营销推广之网络推广的方式新花式探讨 访问: 品创互联网 随着着最近的“团购价”风...

日期:2021-04-02 浏览次数:166

武林顾客新认为

强烈推荐实例身心健康 食品类 快消品企事业单位 酒店餐厅 家居家具时尚潮流 服装 游戏娱乐...

日期:2021-03-30 浏览次数:128

泉州市宏泰高新科技网站建设实例

PHPSEO建网站企业 手机上:联络 商品归类:公司企业网站建设商品叙述:宏泰高新科技网站以...

日期:2021-03-28 浏览次数:62