• Mybatis之逆向工程的文件和方法解析


    一、Mybatis逆向工程生成的文件:
    在这里插入图片描述
    BlogMapper.xml : mapper映射文件
    BlogMapper.java:mapper接口文件
    Blog.java:实体类
    BlogExample.java:实体类对应的example。用于添加条件,相当于where后面的部分。
    BlogWithBLOBs.java:继承了实体类Blog。同时在BlogMapper.xml中继承了BaseResultMap,有自己特殊的字段,对应数据表的text、longvarchar等长类型,如果数据库没有长数据类型则不会生成该文件。

    检索大字段时,则需要使用selectByExampleWithBLOBs ,一般情况则使用selectByExample 即可。

    二、BlogExample.java 和 BlogWithBLOBs.java的区别:

    进行逆向工程的数据表如下,可以看出该表包含了text和longtext类型。

    在这里插入图片描述
    逆向生成的Blog和BlogWithBLOBs 实体类,BlogWithBLOBs继承了Blog类,可以看出text和longtext这两个长类型是单独在BlogWithBLOBs类中实现的。

    //Blog.java的代码
    package com.online.domain;
    public class Blog {
        private Integer id;
        private String title;
        private String summary;
        //省略get和set方法
    }
    
    //BlogWithBLOBs.java的代码
    package com.online.domain;
    public class BlogWithBLOBs extends Blog {
        private String content;
        private String htmlcontent;
        //省略get和set方法
    }
    

    在mapper.xml中可以看出ResultMapWithBLOBs继承于BaseResultMap:

    <mapper namespace="com.online.dao.BlogMapper" >
      <resultMap id="BaseResultMap" type="com.online.domain.Blog" >
        <id column="id" property="id" jdbcType="INTEGER" />
        <result column="title" property="title" jdbcType="VARCHAR" />
        <result column="summary" property="summary" jdbcType="VARCHAR" />
      </resultMap>
      <resultMap id="ResultMapWithBLOBs" type="com.online.domain.BlogWithBLOBs" extends="BaseResultMap" >
        <result column="content" property="content" jdbcType="LONGVARCHAR" />
        <result column="htmlContent" property="htmlcontent" jdbcType="LONGVARCHAR" />
      </resultMap>
    

    当然也可以去除BlogWithBLOBs.java类,解决方法是在generatorConfig.xml中对text等类型的字段进行类型转换,然后删除之前生成的文件,重新逆向生成,BlogWithBLOBs类就消失了:

    <!-- 指定数据库表     数据库表名:tableName   对应的实体类名:domainObjectName -->
    <table tableName="blog" domainObjectName="Blog">
       <columnOverride column="content" javaType="java.lang.String" jdbcType="TEXT" />
       <columnOverride column="htmlContent" javaType="java.lang.String" jdbcType="TEXT" />
    </table>
    

    三、逆向工程生成文件的使用

    public class GeneratorTest {
        public SqlSessionFactory getSqlSessionFactory() throws Exception {
            String resource = "SqlMapConfig.xml";
            InputStream inputStream = Resources.getResourceAsStream(resource);
            SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
            return sqlSessionFactory;
        }
    
        //根据id查询,查询id为1的数据
        @Test
        public void testMBG01() throws Exception {
            SqlSessionFactory ssf = getSqlSessionFactory();
            SqlSession session = ssf.openSession();
            try {
                BlogMapper mapper = session.getMapper(BlogMapper.class);
                Blog blog = mapper.selectByPrimaryKey(1);
                System.out.println(blog.getTitle());
            } finally {
                session.close();
            }
        }
    
        //没有条件的情况,查询全部信息
        @Test
        public void testMBG02() throws Exception {
            SqlSessionFactory ssf = getSqlSessionFactory();
            SqlSession session = ssf.openSession();
            try {
                BlogMapper mapper = session.getMapper(BlogMapper.class);
                List<Blog> emps = mapper.selectByExample(null);
                for (Blog blog : emps) {
                    System.out.println(blog.getTitle());
                }
            } finally {
                session.close();
            }
        }
    
        //按照条件查询
        @Test
        public void testMBG03() throws Exception {
            SqlSessionFactory ssf = getSqlSessionFactory();
            SqlSession session = ssf.openSession();
            try {
                BlogMapper mapper = session.getMapper(BlogMapper.class);
    
                //查询字段Summary包含爱好关键字的Blog对象
                BlogExample example = new BlogExample();
    
                BlogExample.Criteria criteria = example.createCriteria();
                criteria.andSummaryLike("%爱好%");
    
                List<Blog> emps = mapper.selectByExample(example);
                for (Blog blog : emps) {
                    System.out.println(blog.getSummary());
                }
            } finally {
                session.close();
            }
        }
    }
    
    

    四、方法的接口解析(此部分来源网络)

    1、mapper接口中的函数及方法

    方法 功能说明
    int countByExample(UserExample example) thorws SQLException 按条件计数
    int deleteByPrimaryKey(Integer id) thorws SQLException 按主键删除
    int deleteByExample(UserExample example) thorws SQLException 按条件查询
    String/Integer insert(User record) thorws SQLException 插入数据(返回值为插入成功的个数)
    User selectByPrimaryKey(Integer id) thorws SQLException 按主键查询
    ListselectByExample(UserExample example) thorws SQLException 按条件查询
    ListselectByExampleWithBLOGs(UserExample example) thorws SQLException 按条件查询(包括BLOB字段)。只有当数据表中的字段类型有为二进制的才会产生。
    int updateByPrimaryKey(User record) thorws SQLException 按主键更新
    int updateByPrimaryKeySelective(User record) thorws SQLException 按主键更新值不为null的字段
    int updateByExample(User record, UserExample example) thorws SQLException 按条件更新
    int updateByExampleSelective(User record, UserExample example) thorws SQLException 按条件更新值不为null的字段

    2、example实例解析
    mybatis的逆向工程中会生成实例及实例对应的example,example用于添加条件,相当where后面的部分 。
    xxxExample example = new xxxExample();
    Criteria criteria = new Example().createCriteria();

    方法 说明
    example.setOrderByClause(“字段名 ASC”) 添加升序排列条件,DESC为降序
    example.setDistinct(false) 去除重复,boolean型,true为选择不重复的记录。
    criteria.andXxxIsNull 添加字段xxx为null的条件
    criteria.andXxxIsNotNull 添加字段xxx不为null的条件
    criteria.andXxxEqualTo(value) 添加xxx字段等于value条件
    criteria.andXxxNotEqualTo(value) 添加xxx字段不等于value条件
    criteria.andXxxGreaterThan(value) 添加xxx字段大于value条件
    criteria.andXxxGreaterThanOrEqualTo(value) 添加xxx字段大于等于value条件
    criteria.andXxxLessThan(value) 添加xxx字段小于value条件
    criteria.andXxxLessThanOrEqualTo(value) 添加xxx字段小于等于value条件
    criteria.andXxxIn(List<?>) 添加xxx字段值在List<?>条件
    criteria.andXxxNotIn(List<?>) 添加xxx字段值不在List<?>条件
    criteria.andXxxLike(“%”+value+”%”) 添加xxx字段值为value的模糊查询条件
    criteria.andXxxNotLike(“%”+value+”%”) 添加xxx字段值不为value的模糊查询条件
    criteria.andXxxBetween(value1,value2) 添加xxx字段值在value1和value2之间条件
    criteria.andXxxNotBetween(value1,value2) 添加xxx字段值不在value1和value2之间条件

    三、应用举例
    1.查询
    ① selectByPrimaryKey()

    User user = XxxMapper.selectByPrimaryKey(100); //相当于select* from user where id = 100 
    

    ② selectByExample() 和selectByExampleWithBLOGs()

    UserExample example = newUserExample(); 
    Criteriacriteria = example.createCriteria(); 
    criteria.andUsernameEqualTo("wyw"); 
    criteria.andUsernameIsNull(); 
    example.setOrderByClause("username asc,email desc"); 
    List<?>list = XxxMapper.selectByExample(example); 
    //相当于:select * from user where username = 'wyw' and username is null order by username asc,email desc 
    

    注:在逆向工程生成的文件XxxExample.Java中包含一个static的内部类Criteria,Criteria中的方法是定义SQL 语句where后的查询条件。

    2.插入数据
    ①insert()

    User user = new User(); 
    user.setId("dsfgsdfgdsfgds"); 
    user.setUsername("admin"); 
    user.setPassword("admin") 
    user.setEmail("wyw@163.com"); 
    XxxMapper.insert(user); 
    //相当于:insert intouser(ID,username,password,email) values ('dsfgsdfgdsfgds','admin','admin','wyw@126.com'); 
    

    3.更新数据
    ①updateByPrimaryKey()

    User user =new User(); 
    user.setId("dsfgsdfgdsfgds"); 
    user.setUsername("wyw"); 
    user.setPassword("wyw"); 
    user.setEmail("wyw@163.com"); 
    XxxMapper.updateByPrimaryKey(user); 
    //相当于:update user set username='wyw', password='wyw', email='wyw@163.com'where id='dsfgsdfgdsfgds' 
    

    ②updateByPrimaryKeySelective()

    User user = new User(); 
    user.setId("dsfgsdfgdsfgds"); 
    user.setPassword("wyw"); 
    XxxMapper.updateByPrimaryKey(user); 
    //相当于:update user set password='wyw' where id='dsfgsdfgdsfgds' 
    

    ③ updateByExample() 和updateByExampleSelective()

    UserExample example = new UserExample(); 
    Criteria criteria = example.createCriteria(); 
    criteria.andUsernameEqualTo("admin"); 
    User user = new User(); 
    user.setPassword("wyw"); 
    XxxMapper.updateByPrimaryKeySelective(user,example); 
    //相当于:update user set password='wyw' where username='admin' 
    updateByExample()更新所有的字段,包括字段为null的也更新,建议使用 updateByExampleSelective()更新想更新的字段 
    

    4.删除数据
    ①deleteByPrimaryKey()

    XxxMapper.deleteByPrimaryKey(1);  //相当于:deletefrom user where id=1 
    

    ②deleteByExample()

    UserExample example = new UserExample(); 
    Criteria criteria = example.createCriteria(); 
    criteria.andUsernameEqualTo("admin"); 
    XxxMapper.deleteByExample(example); 
    //相当于:delete from user where username='admin' 
    

    数量
    ①countByExample()

    UserExample example = new UserExample(); 
    Criteria criteria = example.createCriteria(); 
    criteria.andUsernameEqualTo("wyw"); 
    int count = XxxMapper.countByExample(example); 
    //相当于:select count(*) from user where username='wyw'
    
  • 相关阅读:
    pychram 2018-01 安装pyQT5报错
    pyqt 8行内就可以跑一个浏览器
    sql server无log ldf日志文件附件mdf数据库重新生成ldf日志文件
    解决Specifying a namespace in include()withou providing an app_name
    Java 连接池的工作原理(转)
    使用from __future__ import unicode_literals时要注意的问题
    详细介绍Redis的几种数据结构以及使用注意事项(转)
    再谈Redis应用场景(转)
    Redis的LRU机制(转)
    深入理解Redis主键失效原理及实现机制(转)
  • 原文地址:https://www.cnblogs.com/mxxbc/p/14055706.html
Copyright © 2020-2023  润新知