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则是通过提供的配置相关类进行代码层的配置,并且可以实现个性化配置。

 

posted @ 2019-10-23 18:06  无影云  阅读(1504)  评论(0编辑  收藏  举报