zoukankan      html  css  js  c++  java
  • Mybatis && Mybatis-plus

    导读:

        我感觉mybatis-plus的出现是真的挺nice的,无论是配置还是使用都是那么的令人神往,在配置上与mybatis其实并没有多大的区别,可能这就是partner吧。它独有的单表操作,分页自带插件,代码生成器,条件构造器这些强大的功能扩展其实还是很贴合大部分人的口味的。

       文章结构:

        1. mybatis

        2. mybatis-plus

        3. 总结

    Mybatis:

    1.依赖包

    (1)spring:

    1         <dependency>
    2             <groupId>org.mybatis</groupId>
    3             <artifactId>mybatis</artifactId>
    4             <version>3.5.2</version>
    5         </dependency>
    1         <dependency>
    2             <groupId>org.mybatis</groupId>
    3             <artifactId>mybatis-spring</artifactId>
    4             <version>1.3.2</version>
    5         </dependency>

    (2)spring boot:

    1         <dependency>
    2             <groupId>org.mybatis.spring.boot</groupId>
    3             <artifactId>mybatis-spring-boot-starter</artifactId>
    4             <version>2.1.0</version>
    5         </dependency>

    2.配置:

    (1)spring:

    • 新建一个mybatis的l配置文件mybatis-config.xml,用于mybatis基本信息的配置
       1 <?xml version="1.0" encoding="UTF-8" ?>
       2 <!DOCTYPE configuration
       3         PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
       4         "http://mybatis.org/dtd/mybatis-3-config.dtd">
       5 
       6 <configuration>
       7 
       8     <!--加载数据库配置文件-->
       9     <properties resource="db.properties"/>
      10 
      11     <!--常用设置-->
      12     <settings>
      13         <!-- 懒加载。如果设为‘false',则所有相关联的都会被初始化加载。 -->
      14         <setting name="lazyLoadingEnabled" value="true"/>
      15         <!-- 当设置为‘true'的时候,懒加载的对象可能被任何懒属性全部加载。否则,每个属性都按需加载。 -->
      16         <setting name="aggressiveLazyLoading" value="false"/>
      17         <!--日志信息打印-->
      18         <setting name="logImpl" value="STDOUT_LOGGING"/>
      19         <!--缓存设置-->
      20         <setting name="cacheEnabled" value="true"/>
      21         <!--驼峰命名-->
      22         <setting name="mapUnderscoreToCamelCase" value="true"/>
      23     </settings>
      24 
      25     <!--别名设置-->
      26     <typeAliases>
      27         <package name="com.wsw.entity"/>
      28     </typeAliases>
      29 
      30     <!--插件配置-->
      31     <plugins>
      32         <plugin interceptor=""></plugin>
      33     </plugins>
      34 
      35     <!--环境配置-->
      36     <environments default="">
      37         <environment id="">
      38             <!--事务管理-->
      39             <transactionManager type="">
      40                 <property name="" value=""/>
      41             </transactionManager>
      42             <!--数据源配置-->
      43             <dataSource type="">
      44                 <property name="" value=""/>
      45                 <property name="" value=""/>
      46             </dataSource>
      47         </environment>
      48     </environments>
      49 
      50     <!--映射文件配置:下面三种方式可随机采用其中一种-->
      51     <mappers>
      52         <!--相对路径文件映射-->
      53         <mapper resource=""/>
      54         <!--绝对路径文件映射-->
      55         <mapper url=""/>
      56         <!--包映射-->
      57         <package name=""/>
      58     </mappers>
      59 
      60 </configuration>
    • 在spring的配置文件applicationContext.xml中配置mybatis的sqlSessionFactory,同时加载mybatis的配置文件:
      1 <!-- 配置sqlSessionFactory,SqlSessionFactoryBean是用来产生sqlSessionFactory的 -->
      2     <bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
      3         <!-- 加载mybatis的全局配置文件 -->
      4         <property name="configLocation" value="classpath:mybatis-config.xml"/>
      5     </bean>

    (2)spring boot(yaml):

    • 在spring boot的全局配置文件application.yaml中配置mybatis相关属性:
       1 mybatis-plus:
       2   #别名设置
       3   type-aliases-package: com.wsw.springboot.entity 6   #映射文件扫描
       7   #mapper-locations:
       8   configuration:
       9     #懒加载设置
      10     lazy-loading-enabled: true
      11     #日志打印
      12     #log-impl:
      13     #驼峰命名
      14     map-underscore-to-camel-case: true
      15     #缓存设置
      16     cache-enabled: true
      17     #主键自动生成并获取
      18     use-generated-keys: true   

    3.使用:

    实体类:User->School->Page

     1 @Data
     2 @ToString
     3 @AllArgsConstructor
     4 @NoArgsConstructor
     5 public class User {
     6     /**
     7      * 用户编号
     8      */
     9     private int uId;
    10     /**
    11      * 用户姓名
    12      */
    13     private String uName;
    14     /**
    15      * 用户性别
    16      */
    17     private int uSex;
    18     /**
    19      * 用户年龄
    20      */
    21     private int uAge;
    22     /**
    23      * 用户身份证
    24      */
    25     private String uIdentity;
    26     /**
    27      * 用户出生日期
    28      */
    29     private Timestamp uBirth;
    30     /**
    31      * 关联学校:1:1
    32      */
    33     private School school;
    34 }
     1 @AllArgsConstructor
     2 @NoArgsConstructor
     3 @Data
     4 @ToString
     5 public class School {
     6     /**
     7      * 学校编号
     8      */
     9     private int schoolId;
    10     /**
    11      * 学校名称
    12      */
    13     private String schoolName;
    14     /**
    15      * 学校面积
    16      */
    17     private double schoolSize;
    18     /**
    19      * 一对多
    20      */
    21     List<User> userList;
    22 }
     1 @Data
     2 @AllArgsConstructor
     3 @NoArgsConstructor
     4 @ToString
     5 public class Page<T> {
     6 
     7     /**
     8      * 当前页号
     9      */
    10     private int pageNo;
    11     /**
    12      * 当前页面大小
    13      */
    14     private int pageSize;
    15     /**
    16      * 总记录数
    17      */
    18     private int totalCount;
    19     /**
    20      * 总页数
    21      */
    22     private int totalPage;
    23     /**
    24      * 每页的显示的数据
    25      */
    26     private List<User> lists;
    27 
    28 }

    dao层接口:UserDao->SchoolDao

     1 @Repository
     2 public interface UserDao {
     3 
     4     /**
     5      * 查看所有用户
     6      * @return
     7      */
     8     List<User> selectAll();
     9 
    10     /**
    11      * 插入一条用户记录
    12      * @param user
    13      */
    14     void insertOne(User user);
    15 
    16     /**
    17      * 分页查询
    18      * @param pageNum:偏移量,代表从第pageNum+1的位置开始取记录
    19      * @param pageCount:取记录的总数
    20      * @return
    21      */
    22     List<User> selectByPageNo(@Param("pageNum") int pageNum, @Param("pageCount") int pageCount);
    23 
    24     /**
    25      * 查询所有记录数
    26      * @return
    27      */
    28     int selectTotalCount();
    29 
    30 }
     1 @Repository
     2 public interface SchoolDao {
     3     /**
     4      * 查看所有的学校信息
     5      * @return
     6      */
     7     List<School> selectAllSchool();
     8 
     9     /**
    10      * 模糊查询-like关键字使用
    11      * @param sName
    12      * @return
    13      */
    14     List<School> selectLikeParam(@Param(value = "sName") String sName);
    15 
    16     /**
    17      * 条件查询-if,where等条件使用
    18      * @param min
    19      * @param max
    20      * @return
    21      */
    22     List<School> selectInAverage(@Param(value = "min") double min, @Param("max") double max);
    23 }

    service层:UserService->UserServiceImpl ->SchoolService->SchoolServiceImpl

     1 public interface UserService {
     2     /**
     3      * 查询所有用户
     4      * @return
     5      */
     6     List<User> getAll();
     7 
     8     /**
     9      * 创建一条用户记录
    10      * @param user
    11      */
    12     void createOne(User user);
    13 
    14     /**
    15      * 分页显示用户记录
    16      * @param pageNum
    17      * @param pageCount
    18      * @return
    19      */
    20     Page<User> selectByPage(int pageNum, int pageCount);
    21 
    22 }
     1 @Service("userService")
     2 @Transactional
     3 public class UserServiceImpl implements UserService {
     4 
     5     @Autowired
     6     private UserDao userDao;
     7 
     8     @Override
     9     public List<User> getAll() {
    10         return  userDao.selectAll();
    11     }
    12 
    13     @Override
    14     public void createOne(User user) {
    15         userDao.insertOne(user);
    16     }
    17 
    18     @Override
    19     public Page<User> selectByPage(int pageNum, int pageCount) {
    20         Page<User> page = new Page<User>();
    21         //设置总记录数
    22         page.setTotalCount(userDao.selectTotalCount());
    23         //设置每一页显示的记录数
    24         page.setPageSize(pageCount);
    25         //设置当前总页数:如果当前的总记录数能够整除每一页的页面记录数大小,则总页数为除后结果
    26         if ((page.getTotalCount() - pageNum) % page.getPageSize() == 0) {
    27             page.setTotalPage((page.getTotalCount() - pageNum) / page.getPageSize());
    28         } else {
    29             //否则为结果加一
    30             page.setTotalPage(((page.getTotalCount() - pageNum) / page.getPageSize()) + 1);
    31         }
    32         //总记录数小于每页要求记录数时默认为1
    33         if (page.getTotalCount() < page.getPageSize()) {
    34             page.setTotalPage(1);
    35         }
    36         page.setLists(userDao.selectByPageNo(pageNum, pageCount));
    37         return page;
    38     }
    39 
    40 }
     1 public interface SchoolService {
     2     /**
     3      * 查看所有学校记录
     4      * @return
     5      */
     6     List<School> getAll();
     7 
     8     /**
     9      * 模糊查询:like关键字使用
    10      * @param sName
    11      * @return
    12      */
    13     List<School> useLike(String sName);
    14 
    15     /**
    16      * 条件查询
    17      * @param min
    18      * @param max
    19      * @return
    20      */
    21     List<School> useConditions(double min,double max);
    22 }
     1 @Service("schoolService")
     2 @Transactional
     3 public class SchoolServiceImpl implements SchoolService {
     4 
     5     @Autowired
     6     private SchoolDao schoolDao;
     7 
     8     @Override
     9     public List<School> getAll() {
    10         return schoolDao.selectAllSchool();
    11     }
    12 
    13     @Override
    14     public List<School> useLike(String sName) {
    15         return schoolDao.selectLikeParam(sName);
    16     }
    17 
    18     @Override
    19     public List<School> useConditions(double min, double max) {
    20         return schoolDao.selectInAverage(min, max);
    21     }
    22 }

    映射文件:user-mapper.xml->school-mapper.xml

     1 <?xml version="1.0" encoding="UTF-8"?>
     2 <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD mapper 3.0//EN"
     3         "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
     4 
     5 <mapper namespace="com.sunsharing.dao.UserDao">
     6 
     7     <!--一对一关联嵌套查询-->
     8     <resultMap id="asossiateWithSchool" type="user">
     9         <id property="uId" column="u_id"/>
    10         <result property="uName" column="u_name"/>
    11         <result property="uSex" column="u_sex"/>
    12         <result property="uAge" column="u_age"/>
    13         <result property="uBirth" column="u_birth"/>
    14         <association property="school" javaType="school" column="school_id" select="selectSchool"/>
    15     </resultMap>
    16 
    17     <select id="selectAll" resultMap="asossiateWithSchool">
    18       select *from `user`
    19     </select>
    20 
    21     <select id="selectSchool" resultType="school">
    22          select *from `user` u,school s where u.school_id=s.school_id and u_id=#{uId}
    23     </select>
    24     <!--插入一条记录,允许主键自增,获取主键-->
    25     <insert id="insertOne" parameterType="user" useGeneratedKeys="true">
    26       INSERT INTO `react`.`user`
    27      (`u_id`, `u_name`, `u_sex`, `u_age`, `u_identity`, `u_birth`)
    28       VALUES
    29      (#{uId}, #{uName},#{uSex}, #{uAge}, #{uIdentity}, #{uBirth})
    30     </insert>
    31 
    32     <!--传入参数包含多个-->
    33     <parameterMap id="parameters" type="int">
    34         <parameter property="pageNum" javaType="int"/>
    35         <parameter property="pageCount" javaType="int"/>
    36     </parameterMap>
    37 
    38     <select id="selectByPageNo" parameterMap="parameters" resultType="user">
    39         select *from `user` limit #{pageNum},#{pageCount}
    40     </select>
    41 
    42     <select id="selectTotalCount" resultType="int">
    43         select count(0) from `user`
    44     </select>
    45 
    46 </mapper>
     1 <?xml version="1.0" encoding="UTF-8"?>
     2 <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD mapper 3.0//EN"
     3         "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
     4 
     5 <mapper namespace="com.sunsharing.dao.SchoolDao">
     6 
     7     <!--嵌套查询,包含多对一的关系-->
     8     <resultMap id="assosiateWithUser" type="school">
     9         <id property="schoolId" column="school_id"/>
    10         <result property="schoolName" column="school_name"/>
    11         <collection property="userList" ofType="user" column="u_id"/>
    12     </resultMap>
    13 
    14     <select id="selectAllSchool" resultMap="assosiateWithUser">
    15       select *from school
    16     </select>
    17 
    18     <!--like关键字使用 :搭配if,where,可多条件累加-->
    19     <select id="selectLikeParam" parameterType="java.lang.String" resultType="school">
    20         <bind name="sName" value="'%' + sName + '%'"/>
    21         select *from school
    22         <where>
    23             <!--下面两种方式可供选择-->
    24             <if test="sName!=null">
    25                 <!--1.使用$符号声明变量可能造成sql注入的威胁-->
    26                 school_name like '%${sName}%'
    27             </if>
    28             <if test="sName!=null">
    29                 <!--2.通过bind拼凑字符串,防止sql注入-->
    30                 school_name like #{sName}
    31             </if>
    32         </where>
    33     </select>
    34 
    35     <!--like关键字使用 :搭配choose,when,供多条件选择-->
    36     <select id="selectLikeParam" parameterType="java.lang.String" resultType="school">
    37         select *from school
    38         <choose>
    39             <when test="schoolName!=null">
    40                 school_Name like #{sName}
    41             </when>
    42             <when test="schoolName==null">
    43                 school_Name like '清华小学'
    44             </when>
    45         </choose>
    46     </select>
    47 
    48     <parameterMap id="parameters" type="double">
    49         <parameter property="min" javaType="double"/>
    50         <parameter property="max" javaType="double"/>
    51     </parameterMap>
    52 
    53     <!-- where,if,>,<符号使用-->
    54     <select id="selectInAverage" parameterMap="parameters" resultType="school">
    55         select *from school school_size
    56         <where>
    57             <if test="min!=null || max!=null">
    58                 <!--<![CDATA[>]]>表示为>符号-->
    59                 school_size <![CDATA[>]]> #{min}  and school_size <![CDATA[<]]> #{max}
    60             </if>
    61 
    62         </where>
    63 
    64     </select>
    65     
    66 </mapper>

    单元测试:

    1 @RunWith(SpringJUnit4ClassRunner.class)
    2 @ContextConfiguration("classpath:applicationContext.xml")
    3 public class BaseTest {
    4 }
     1 public class UnitTest extends BaseTest {
     2 
     3     @Autowired
     4     private UserService userService;
     5 
     6     @Autowired
     7     private SchoolService schoolService;
     8 
     9     @Test
    10     public void showByPage() {
    11         //3为sql查询limit函数的第一个参数(x),代表从x+1的位置开始执行查询(默认为0)
    12         // 2为限制每次显示的记录数,相当于页面大小
    13         Page<User> page = userService.selectByPage(3, 2);
    14         List<User> list = page.getLists();
    15         System.out.println("分页查询记录显示:");
    16         list.stream().forEach(System.out::println);
    17         System.out.println("每页的记录数为:" + page.getPageSize());
    18         System.out.println("总页数为:" + page.getTotalPage());
    19         System.out.println("总记录数:" + page.getTotalCount());
    20     }
    21 
    22     @Test
    23     public void showManyToOne() {
    24         List<School> schools = schoolService.getAll();
    25         schools.stream().forEach(System.out::println);
    26     }
    27 
    28     @Test
    29     public void showOneToOne() {
    30         List<User> list = userService.getAll();
    31         list.stream().forEach(System.out::println);
    32     }
    33 
    34     @Test
    35     public void useLike() {
    36         List<School> schoolList = schoolService.useLike("清华");
    37         schoolList.stream().forEach(System.out::println);
    38     }
    39 
    40     @Test
    41     public void useIf() {
    42         List<School> list = schoolService.useConditions(500.0, 720.0);
    43         list.stream().forEach(System.out::println);
    44     }
    45 
    46 }

    效果截图:

    showByPage():

     showManyToOne():

    showOneToOne():

    useLike():

    useIf():

    4.总结:

     mybatis:

     1.半对象-关系型orm框架,对jdbc的底层数据库连接,销毁等封装性高,对sql语句封装性较差,可通过手写sql实现复杂的sql操作。

     2.提供一对一,一对多的复杂嵌套查询机制。

     3.可使用动态sql灵活的操作相关sql语句,实现sql的动态变化,功能相对完善。

    Mybatis-plus:

    在mybatis的基础上增加了一些新的扩展,比如单表操作以对象操作数据库,提供mp自带分页插件、分页工具类等,提供许多条件构造器,提供强大的代码生成器等等。

    依赖包:

     1       <!--spring boot-->
     2         <dependency>
     3             <groupId>com.baomidou</groupId>
     4             <artifactId>mybatis-plus-boot-starter</artifactId>
     5             <version>3.2.0</version>
     6         </dependency>
     7 
     8         <!--spring-->
     9         <dependency>
    10             <groupId>com.baomidou</groupId>
    11             <artifactId>mybatis-plus</artifactId>
    12             <version>3.2.0</version>
    13         </dependency>

    1.单表操作面向对象化:

    前提:单表,继承BaseMapper<T>接口

    简单crud:

    实体类

     1 @Data
     2 @ToString
     3 @AllArgsConstructor
     4 @NoArgsConstructor
     5 @TableName(value = "house")
     6 public class House {
     7     /**
     8      * 注意:如果id与数据库字段对应不上,需要自动配置value与数据库表中字段关联
     9      */
    10     @TableId(value = "house_id")
    11     private Integer houseId;
    12     private String houseName;
    13     private Double houseArea;
    14     private Double housePrice;
    15     private Integer uId;
    16 }

    dao层接口

    @Repository
    public interface HouseDao extends BaseMapper<House> {
        
    }

    测试

     1  @Autowired
     2     private HouseDao houseDao;
     3 
     4     @Test
     5     public void unitTest() {
     6         //create
     7         House house = new House(6, "枋湖公园", 500.25, 1000.9, 2);
     8         houseDao.insert(house);
     9         System.out.println("单条记录插入成功!");
    10         //read
    11         System.out.println("id为6的房子记录:" + houseDao.selectById(6));
    12         //update
    13         house.setHouseName("修改房名");
    14         houseDao.updateById(house);
    15         System.out.println("修改后的记录:" + houseDao.selectById(6));
    16         //delete
    17         houseDao.deleteById(6);
    18         System.out.println(null == houseDao.selectById(6) ? "记录已删除" : "记录未删除");
    19     }

    效果截图:

     2.分页:

    HouseService->HouseServiceImpl->HouseController

    1 /**
    2      * 翻页显示记录
    3      * @return
    4      */
    5     List<House> selectByPage(Integer currPageNo, Integer pageSize);
    1    @Override
    2     public List<House> selectByPage(Integer currPageNo, Integer pageSize) {
    3         // 分页查询 pageSize 条用户id为1的房源记录
    4         List<House> houseList = houseDao.selectPage(
    5             new Page<House>(currPageNo, pageSize),
    6             new QueryWrapper<House>().eq("u_id", "1")
    7         ).getRecords();
    8         return houseList;
    9     }
    1   @GetMapping("/test/{pageNo}/{pageSize}")
    2     public String byPageFromMplus(@PathVariable(name = "pageNo") Integer currPage, @PathVariable(name = "pageSize") Integer pageSize) {
    3         List<House> list = houseService.selectByPage(currPage, pageSize);
    4         System.out.println("显示列表:"+list);
    5         //循环遍历
    6         list.stream().forEach(System.out::println);
    7         return "分页显示:"+list;
    8     }

    效果截图:

     

    3.条件构造器:

     1  /**
     2      * 各种条件构造函数的熟悉使用
     3      */
     4     @Test
     5     public void conditionTest() {
     6         //ge(String "column",Object value) :对应的是数据库的字段名称 ,ge表示大于等于
     7         System.out.println("房子面积大于120的记录数为:" + houseDao.selectCount(new QueryWrapper<House>().ge("house_area", 120)));
     8         //eq(String "column",Object value): eq表示等于
     9         System.out.println("房子面积等于120的记录为:" + houseDao.selectOne(new QueryWrapper<House>().eq("house_area", 120)));
    10         House house = new House();
    11         house.setHouseId(1);
    12         //set(String "column",Object value):set表示设置当前column的值为value
    13         houseDao.update(house, new UpdateWrapper<House>().set("house_name", "测试"));
    14         System.out.println("修改后记录为:" + houseDao.selectById(1));
    15         //between(String "column",Object val1,Object val2): between表示当前的column的值范围在val1-val2之间
    16         List<House> houseList = houseDao.selectList(new QueryWrapper<House>().between("house_area", 120, 160));
    17         System.out.println("房子面积在120-150之间的所有记录为:");
    18         houseList.stream().forEach(System.out::println);
    19     }

    效果截图:

     

     4.强大的代码生成器:

    ps:默认的模板引擎是velocity,如果未声明

    依赖:

     1         <dependency>
     2             <groupId>com.baomidou</groupId>
     3             <artifactId>mybatis-plus-generator</artifactId>
     4             <version>3.0.7</version>
     5         </dependency>
     6 
     7         <dependency>
     8             <groupId>org.apache.velocity</groupId>
     9             <artifactId>velocity</artifactId>
    10             <version>1.7</version>
    11         </dependency>

    附上笔者自己根据官方文档整理出来的小小工具类,用于代码生成。

    ps:有些配置还没怎么搞懂,但大致功能已经实现且能够成功运行。

      1 package com.wsw.springboot.util;
      2 
      3 import com.baomidou.mybatisplus.generator.AutoGenerator;
      4 import com.baomidou.mybatisplus.generator.InjectionConfig;
      5 import com.baomidou.mybatisplus.generator.config.DataSourceConfig;
      6 import com.baomidou.mybatisplus.generator.config.GlobalConfig;
      7 import com.baomidou.mybatisplus.generator.config.PackageConfig;
      8 import com.baomidou.mybatisplus.generator.config.StrategyConfig;
      9 import com.baomidou.mybatisplus.generator.config.TemplateConfig;
     10 import com.baomidou.mybatisplus.generator.config.rules.NamingStrategy;
     11 
     12 
     13 /**
     14  * 工具类:mybatis-plus:代码生成
     15  * @author :wen
     16  */
     17 public class GenerateCodeDevUtil {
     18     /**
     19      * Service接口是否统一I开头
     20      */
     21     private static final boolean SERVICE_BEGIN_WHTH_I = false;
     22     /**
     23      * 设置包名
     24      */
     25     private static final String PACKAGE_NAME = "com.admin";
     26     /**
     27      *数据库驱动名称
     28      */
     29     private static final String DRIVER_NAME = "com.mysql.jdbc.Driver";
     30     /**
     31      *数据库URL
     32      */
     33     private static final String URL = "jdbc:mysql://localhost:3306/springboot?characterEncoding=utf8";
     34     /**
     35      *数据库User
     36      */
     37     private static final String USER = "root";
     38     /**
     39      *数据库连接密码
     40      */
     41     private static final String PASSWORD = "199815";
     42 
     43     /**
     44      * 私有化构造器:外部无需new对象,直接通过类名调用方法
     45      */
     46     private GenerateCodeDevUtil() {
     47 
     48     }
     49 
     50     /**
     51      * 全局配置:相当于mybatis-plus.xml进行相关配置
     52      * @return
     53      */
     54     private static GlobalConfig globalConfig() {
     55         GlobalConfig globalConfig = new GlobalConfig();
     56         //作者名
     57         globalConfig.setAuthor("wen");
     58         //文件输出目录
     59         globalConfig.setOutputDir("C:\Users\Administrator\Desktop\demo");
     60         //根据数据库列表名称
     61         globalConfig.setBaseColumnList(true);
     62         globalConfig.setActiveRecord(true);
     63         globalConfig.setBaseResultMap(true);
     64         //缓存配置
     65         globalConfig.setEnableCache(true);
     66         //文件重写
     67         globalConfig.setFileOverride(true);
     68         //设置控制层类命名 +%s默认加上实体类名前缀
     69         globalConfig.setControllerName("%sController");
     70         //设置dao层接口名称
     71         globalConfig.setMapperName("%sDao");
     72         //设置serviceImpl层类名称
     73         globalConfig.setServiceImplName("%sServiceImpl");
     74         globalConfig.setServiceName("%sService");
     75         return globalConfig;
     76     }
     77 
     78     /**
     79      * 数据源配置
     80      * @return
     81      */
     82     private static DataSourceConfig dataSourceConfig() {
     83         DataSourceConfig dataSourceConfig = new DataSourceConfig();
     84         dataSourceConfig.setDriverName(DRIVER_NAME);
     85         dataSourceConfig.setUrl(URL);
     86         dataSourceConfig.setUsername(USER);
     87         dataSourceConfig.setPassword(PASSWORD);
     88         return dataSourceConfig;
     89     }
     90 
     91     /**
     92      * 包配置:包括每一层的包命名:controller/entity/dao/service/serviceImpl
     93      * @return
     94      */
     95     private static PackageConfig packageConfig() {
     96         PackageConfig packageConfig = new PackageConfig();
     97         packageConfig.setParent(PACKAGE_NAME);
     98         packageConfig.setController("controller");
     99         packageConfig.setEntity("entity");
    100         packageConfig.setMapper("dao");
    101         packageConfig.setService("service");
    102         packageConfig.setServiceImpl("service.impl");
    103         return packageConfig;
    104     }
    105 
    106     /**
    107      * 自定义配置,包括文件命名,输出目录等
    108      * @return
    109      */
    110     private static InjectionConfig injectionConfig() {
    111         InjectionConfig injectionConfig = new InjectionConfig() {
    112             @Override
    113             public void initMap() {
    114 
    115             }
    116         };
    117         return injectionConfig;
    118     }
    119 
    120     /**
    121      * 模板配置
    122      * @return
    123      */
    124     private static TemplateConfig templateConfig() {
    125         TemplateConfig templateConfig = new TemplateConfig();
    126         //配置生成的xml路径
    127         return templateConfig;
    128     }
    129 
    130     /**
    131      * 策略配置:命名,前缀,表字段
    132      * @return
    133      */
    134     private static StrategyConfig strategyConfig() {
    135         StrategyConfig strategyConfig = new StrategyConfig();
    136         strategyConfig.setEntityBuilderModel(true);
    137         strategyConfig.setVersionFieldName("super code man");
    138         strategyConfig.setCapitalMode(true);
    139         //设置数据库表名
    140         strategyConfig.setInclude("users", "house");
    141         //驼峰命名
    142         strategyConfig.setNaming(NamingStrategy.underline_to_camel);
    143         //实体类不加注解
    144         strategyConfig.setEntityTableFieldAnnotationEnable(false);
    145         return strategyConfig;
    146     }
    147 
    148     /**
    149      * 加载全部配置
    150      */
    151     public static void start() {
    152         AutoGenerator autoGenerator = new AutoGenerator();
    153         autoGenerator.setCfg(injectionConfig());
    154         autoGenerator.setTemplate(templateConfig());
    155         autoGenerator.setPackageInfo(packageConfig());
    156         autoGenerator.setDataSource(dataSourceConfig());
    157         autoGenerator.setGlobalConfig(globalConfig());
    158         autoGenerator.setStrategy(strategyConfig());
    159         System.out.println("全部配置加载成功!开始执行生成代码...");
    160         autoGenerator.execute();
    161     }
    162 
    163 }

    效果截图:

       控制台:

       生成文件:

     

     

    里面的内容也是有自动添加,可能有些配置不怎么清楚,生成的配置有点简陋。

     1 <?xml version="1.0" encoding="UTF-8"?>
     2 <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
     3 <mapper namespace="com.admin.dao.HouseDao">
     4 
     5     <!-- 开启二级缓存 -->
     6     <cache type="org.mybatis.caches.ehcache.LoggingEhcache"/>
     7 
     8     <!-- 通用查询映射结果 -->
     9     <resultMap id="BaseResultMap" type="com.admin.entity.House">
    10         <id column="house_id" property="houseId" />
    11         <result column="house_name" property="houseName" />
    12         <result column="house_area" property="houseArea" />
    13         <result column="house_price" property="housePrice" />
    14         <result column="u_id" property="uId" />
    15     </resultMap>
    16 
    17     <!-- 通用查询结果列 -->
    18     <sql id="Base_Column_List">
    19         house_id, house_name, house_area, house_price, u_id
    20     </sql>
    21 
    22 </mapper>
    package com.admin.service;
    
    import com.admin.entity.House;
    import com.baomidou.mybatisplus.extension.service.IService;
    
    /**
     * <p>
     *  服务类
     * </p>
     *
     * @author wen
     * @since 2019-10-25
     */
    public interface HouseService extends IService<House> {
    
    }
     1 package com.admin.dao;
     2 
     3 import com.admin.entity.House;
     4 import com.baomidou.mybatisplus.core.mapper.BaseMapper;
     5 
     6 /**
     7  * <p>
     8  *  Mapper 接口
     9  * </p>
    10  *
    11  * @author wen
    12  * @since 2019-10-25
    13  */
    14 public interface HouseDao extends BaseMapper<House> {
    15 
    16 }

    mybatis 与 mybatis-plus的区别:

    相同之处:

    1.在相关信息配置上mybatis与mybatis-plus的差异性不是很大,基本配置项相同

    2.mybatis的多表操作,嵌套查询与mybatis-plus的操作一致,无差异性

    不同之处:

    1.mybatis-plus对单表的操作不再依靠书写sql,dao层映射,而是通过操作对象来实现单表的增删查改相关操作。

    2.mybtis-plus在mybatis的基础上扩展了许多功能,可以通过mybatis-plus的提供的分页插件实现分页,也可以通过mybatis-plus的条件构造实现mybatis单表的动态sql,无需再通过配置文件进行复杂sql的书写。

    3.mybatis的逆向工程插件包mybatis-generator与mybatis-plus的mybatisplus-generator实际使用方式发生改变,mybatis是通过xml配置文件进行逆向工程相关信息的配置,mybatis-plus则是通过提供的配置相关类进行代码层的配置,并且可以实现个性化配置。

  • 相关阅读:
    用了7年做到项目经理,女朋友却离开了我
    手把手教你建网站--程序小白适用篇
    燃尽图的学习与理解
    每周进度
    四人组队
    读构建之法之感
    两人组队,小学生的四则运算
    词汇统计
    AMQP中的架构和组成元素
    MSSQL机制
  • 原文地址:https://www.cnblogs.com/weekstart/p/Mybatis-MybatisX.html
Copyright © 2011-2022 走看看