发表日期: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/