JAVAEE——Mybatis(Mybatis介绍配置使用以及与Spring整合)

Mybatis介绍

MyBatis 本是apache的一个开源项目iBatis, 2010年这个项目由apache software foundation 迁移到了google code,并且改名为MyBatis 。2013年11月迁移到Github。

MyBatis是一个优秀的持久层框架,它对jdbc的操作数据库的过程进行封装,使开发者只需要关注 SQL 本身,而不需要花费精力去处理例如注册驱动、创建connection、创建statement、手动设置参数、结果集检索等jdbc繁杂的过程代码。

Mybatis通过xml或注解的方式将要执行的各种statement(statement、preparedStatemnt、CallableStatement)配置起来,并通过java对象和statement中的sql进行映射生成最终执行的sql语句,最后由mybatis框架执行sql并将结果映射成java对象并返回。

JDBC存在的问题

1、  数据库连接创建、释放频繁造成系统资源浪费,从而影响系统性能。如果使用数据库连接池可解决此问题。

2、  Sql语句在代码中硬编码,造成代码不易维护,实际应用中sql变化的可能较大,sql变动需要改变java代码。

3、  使用preparedStatement向占有位符号传参数存在硬编码,因为sql语句的where条件不一定,可能多也可能少,修改sql还要修改代码,系统不易维护。

4、  对结果集解析存在硬编码(查询列名),sql变化导致解析代码变化,系统不易维护,如果能将数据库记录封装成pojo对象解析比较方便。

Mybatis架构

Mybatis架构

Mybatis使用

mybaits的代码由github.com管理

下载地址:https://github.com/mybatis/mybatis-3/releases

mybatis如下:

图片.png

目录结构

mybatis-3.2.7.jar    mybatis的核心包

lib文件夹            mybatis的依赖包所在

mybatis-3.2.7.pdf mybatis使用手册

创建核心配置文件

<?xml version="1.0"encoding="UTF-8"?><!DOCTYPE configuration

        PUBLIC "-//mybatis.org//DTD Config 3.0//EN"

        "http://mybatis.org/dtd/mybatis-3-config.dtd"><!-- 和spring整合后 environments配置将废除 --><!-- 使用jdbc事务管理 --><!-- 数据库连接池 -->

src目录下创建log4j.properties jdbc.properties

# Global logging configurationlog4j.rootLogger=DEBUG,stdout# Console output...log4j.appender.stdout=org.apache.log4j.ConsoleAppenderlog4j.appender.stdout.layout=org.apache.log4j.PatternLayoutlog4j.appender.stdout.layout.ConversionPattern=%5p [%t] - %m%n

创建pojo映射文件 User.xml

<?xml version="1.0"encoding="UTF-8"?><!DOCTYPE mapper

        PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"

        "http://mybatis.org/dtd/mybatis-3-mapper.dtd">SELECT *        FROM `user`        WHERE id = #{v}

标签解释

在pojo的映射文件xml中,包含<select>、<insert>、<update>、<delete> 分别对应 查询、添加、更新、删除操作

其中 id 代表对应标签的识别id

parameterType代表占位符的类型

resultType 代表返回值类型

语句解释

#{v}代表占位符 占位符标识为v

${value}代表字符串拼接 标识必须为value

select * from userwhereusername like'%xx%'

对应的UserMap.xml配置文件中的SQL文件写法

SELECT * FROM `user`whereusername like"%"#{v}"%"

测试代码

@TestpublicvoidtestSelectOne()throwsIOException{//创建SqlSessionFactoryBuilder对象SqlSessionFactoryBuilder builder =newSqlSessionFactoryBuilder();//加载SqlMapConfig.xml配置文件 创建SqlSessionFactorySqlSessionFactory sessionFactory = builder.build(Resources.getResourceAsStream("SqlMapConfig.xml"));//创建SqlSession对象SqlSession sqlSession = sessionFactory.openSession();//SqlSession执行对象查询User user = (User) sqlSession.selectOne("queryUserById",1);        System.out.println(user);//释放资源sqlSession.close();    }

insert

映射文件 mapper sql书写

<!-- 返回最后插入的主键id -->SELECT LAST_INSERT_ID()insert into user(username,birthday,address,sex) values(#{username},#{birthday},#{address},#{sex})

update

映射文件 mapper sql

<!--更新用户-->update user        set username=#{username},ses=#{sex},birthday=#{birthday},address=#{address}        where id = #{id}

测试代码

@TestpublicvoidtestUpdateUserById()throwsIOException{        SqlSessionFactoryBuilder builder =newSqlSessionFactoryBuilder();        SqlSessionFactory sessionFactory = builder.build(Resources.getResourceAsStream("sqlMapConfig.xml"));        SqlSession sqlSession = sessionFactory.openSession();        User user =newUser();        user.setId(33);        user.setUsername("www33333");        user.setSex("钕");        user.setBirthday(newDate());        user.setAddress("332211aasss");intline = sqlSession.insert("test.updateUserById", user);        sqlSession.commit();        System.out.println(line);    }

delete

Mapper映射文件

<!--删除用户-->DELETE from user        WHERE id = #{vvvv}

测试代码

@TestpublicvoidtestDeleteUserById()throwsIOException{        SqlSessionFactoryBuilder builder =newSqlSessionFactoryBuilder();        SqlSessionFactory sessionFactory = builder.build(Resources.getResourceAsStream("sqlMapConfig.xml"));        SqlSession sqlSession = sessionFactory.openSession();        sqlSession.delete("test.deleteUserById",32);        sqlSession.commit();    }

MyBatis 解决JDBC的需求

1、数据库连接创建、释放频繁造成系统资源浪费从而影响系统性能,如果使用数据库连接池可解决此问题。

解决:在SqlMapConfig.xml中配置数据连接池,使用连接池管理数据库链接。

2、Sql语句写在代码中造成代码不易维护,实际应用sql变化的可能较大,sql变动需要改变java代码。

解决:将Sql语句配置在XXXXmapper.xml文件中与java代码分离。

3、向sql语句传参数麻烦,因为sql语句的where条件不一定,可能多也可能少,占位符需要和参数一一对应。

解决:Mybatis自动将java对象映射至sql语句,通过statement中的parameterType定义输入参数的类型。

4、对结果集解析麻烦,sql变化导致解析代码变化,且解析前需要遍历,如果能将数据库记录封装成pojo对象解析比较方便。

解决:Mybatis自动将sql执行结果映射至java对象,通过statement中的resultType定义输出结果的类型

提出一个需求

MyBatis与HIbernate的不同

Mybatis和hibernate不同,它不完全是一个ORM框架,因为MyBatis需要程序员自己编写Sql语句。mybatis可以通过XML或注解方式灵活配置要运行的sql语句,并将java对象和sql语句映射生成最终执行的sql,最后将sql执行的结果再映射生成java对象。

Mybatis学习门槛低,简单易学,程序员直接编写原生态sql,可严格控制sql执行性能,灵活度高,非常适合对关系数据模型要求不高的软件开发,例如互联网软件、企业运营类软件等,因为这类软件需求变化频繁,一但需求变化要求成果输出迅速。但是灵活的前提是mybatis无法做到数据库无关性,如果需要实现支持多种数据库的软件则需要自定义多套sql映射文件,工作量大。

Hibernate对象/关系映射能力强,数据库无关性好,对于关系模型要求高的软件(例如需求固定的定制化软件)如果用hibernate开发可以节省很多代码,提高效率。但是Hibernate的学习门槛高,要精通门槛更高,而且怎么设计O/R映射,在性能和对象模型之间如何权衡,以及怎样用好Hibernate需要具有很强的经验和能力才行。

总之,按照用户的需求在有限的资源环境下只要能做出维护性、扩展性良好的软件架构都是好架构,所以框架只有适合才是最好。

Mapper动态代理方式开发

开发规范

Mapper接口开发方法只需要程序员编写Mapper接口(相当于Dao接口),由Mybatis框架根据接口定义创建接口的动态代理对象,代理对象的方法体同上边Dao接口实现类方法。

Mapper接口开发需要遵循以下规范:

1、    Mapper.xml文件中的namespace与mapper接口的类路径相同。

2、Mapper接口方法名和Mapper.xml中定义的每个statement的id相同

3、Mapper接口方法的输入参数类型和mapper.xml中定义的每个sql 的parameterType的类型相同

4、Mapper接口方法的输出参数类型和mapper.xml中定义的每个sql的resultType的类型相同

创建UserMapper.xml 映射文件

<?xml version="1.0"encoding="UTF-8"?><!DOCTYPE mapper

        PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"

        "http://mybatis.org/dtd/mybatis-3-mapper.dtd"><!--根据id查询用户-->select *        from user        where id = #{id}<!--根据用户名查询用户-->select *        from user        where username like '%${value}%'

创建接口UserMapper

publicinterfaceUserMapper{publicUserqueryUserById(intid);publicListqueryUserByName(String userName);}

核心配置文件加载UserMapper.xml

<?xml version="1.0"encoding="UTF-8"?><!DOCTYPE mapper

        PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"

        "http://mybatis.org/dtd/mybatis-3-mapper.dtd"><!--namespace命名空间 用于隔离sql --><!--根据id查询用户-->select *        from user        where id = #{id}<!--根据用户名查询用户-->select *        from user        where username like '%${value}%'

测试代码

/**

    * 根据id查询用户

    */@TestpublicvoidtestQueryUserById()throwsIOException{        SqlSessionFactoryBuilder builder =newSqlSessionFactoryBuilder();        SqlSessionFactory sessionFactory = builder.build(Resources.getResourceAsStream("SqlMapConfig.xml"));        SqlSession sqlSession = sessionFactory.openSession();        UserMapper userMapper = sqlSession.getMapper(UserMapper.class);        User user = userMapper.queryUserById(31);        System.out.println(user);    }/**    * 根据name查询用户列表    *@throwsIOException    */@TestpublicvoidtestQueryUserByname()throwsIOException{        SqlSessionFactoryBuilder builder =newSqlSessionFactoryBuilder();        SqlSessionFactory sqlSessionFactory = builder.build(Resources.getResourceAsStream("SqlMapConfig.xml"));        SqlSession sqlSession = sqlSessionFactory.openSession();        UserMapper userMapper = sqlSession.getMapper(UserMapper.class);        List userList = userMapper.queryUserByName("王");for(User user : userList) {            System.out.println(user);        }    }

SqlMapConfig.xml配置文件详解

配置内容

SqlMapConfig.xml中配置的内容和顺序如下

properties(属性)

settings(全局配置参数)

typeAliases(类型别名)

typeHandlers(类型处理器)

objectFactory(对象工厂)

plugins(插件)

environments(环境集合属性对象)

environment(环境子属性对象)

transactionManager(事务管理)

dataSource(数据源)

mappers(映射器)

properties(属性)

db.properties 配置文件内容

jdbc.driver=com.mysql.jdbc.Driverjdbc.url=jdbc:mysql://localhost:3306/mybatis?characterEncoding=utf-8jdbc.username=rootjdbc.password=root

SqlMapConfig.xml

<!-- 是用resource属性加载外部配置文件 --><!-- 在properties内部用property定义属性 --><!-- 如果外部配置文件有该属性,则内部定义属性被外部属性覆盖 --><!-- 使用jdbc事务管理 --><!-- 数据库连接池 --><!-- 加载映射文件 -->

tips

MyBatis将按照下面的顺序来加载属性

在properties元素体内定义的属性首先被读取

然后会读取properties元素中resource或url加载的属性,它会覆盖已读取的同名属性

typeAliases(类型别名)

mybatis支持别名

别名    映射的类型_byte    byte _longlong_shortshort_intint_integerint_doubledouble_floatfloat_boolean  boolean string    String byte      BytelongLongshortShortintInteger integer  IntegerdoubleDoublefloatFloat boolean  Boolean date      Date decimal  BigDecimal bigdecimal BigDecimal map      Map

自定义别名

SqlMapConfig.xml

<?xml version="1.0"encoding="UTF-8"?><!DOCTYPE configuration

PUBLIC "-//mybatis.org//DTD Config 3.0//EN"

"http://mybatis.org/dtd/mybatis-3-config.dtd"><!-- 是用resource属性加载外部配置文件 --><!-- 在properties内部用property定义属性 --><!-- 单个别名定义 --><!-- 批量别名定义,扫描整个包下的类,别名为类名(大小写不敏感) --><!-- 和spring整合后 environments配置将废除 --><!-- 使用jdbc事务管理 --><!-- 数据库连接池 --><!-- 加载映射文件 -->

在mapper.xml配置文件中,就可以使用设置的别名了

别名大小写不敏感

图片.png

mappers(映射器)

Mapper配置的几种方法

使用相对于类路径的资源(现在的使用方式)

<mapper class=""/> 使用mapper类接口路径

此方法要求mapper接口名称和mapper映射文件名称相同,且放在同一个目录中

<package name=""/> 注册指定包下的所有mapper接口

此方法要求mapper接口名称和mapper映射文件名称相同,且放在同一个目录中

Mybatis输入映射和输出映射

输出简单类型

输出POJO对象

开发中通过可以使用pojo传递查询条件

查询条件可能是综合的查询条件,不仅包括用户的查询条件还包括其它的查询条件

包装对象:Pojo类中的一个属性是另外一个pojo

创建包装类对象QueryVo

publicclassQueryVo{privateUser user;publicUsergetUser(){returnuser;    }publicvoidsetUser(User user){this.user = user;    }    }

创建映射文件Mapper.xml文件

其中输入参数为包装条件对象QueryVo 输出对象为User泛型

<!--根据用户名查询数据-->SELECT * FROM user where username LIKE  '%${user.username}'

Mapper接口

在UserMapper接口中添加方法

/**    * 根据包装条件查询用户列表数据    *    *@paramqueryVo    *@return*/publicList queryUserByQueryVo(QueryVo queryVo);

测试方法

@TestpublicvoidtestQueryVo()throws IOException{        SqlSessionFactoryBuilder builder =newSqlSessionFactoryBuilder();        SqlSessionFactory sqlSessionFactory = builder.build(Resources.getResourceAsStream("SqlMapConfig.xml"));        SqlSession sqlSession = sqlSessionFactory.openSession();        UserMapper userMapper = sqlSession.getMapper(UserMapper.class);        QueryVo queryVo =newQueryVo();        User user =newUser();        user.setUsername("五");        queryVo.setUser(user);        Listlist= userMapper.selectListByUserNameQueryVo(queryVo);for(User user1 :list) {            System.out.println(user1);        }    }

resultMap

在Mapper文件中,resultType可以指定将查询结果映射为POJO,前提必须是POJO和sql查询的列名一致方可映射成功。

如果sql查询字段名和POJO的属性名不一致,可以通过resultMap将字段名和属性名作为一个指定的对应关系。resultMap实质上还需要将查询结果映射到POJO对象中。

resultMap可以实现将查询结果映射为复杂类型的POJO

创建一个POJO

packagecn.probuing.mybatisintro.pojo;importjava.io.Serializable;importjava.util.Date;publicclassOrdersimplementsSerializable{@OverridepublicStringtoString(){return"Orders [id="+ id +", userId="+ userId +", number="+ number +", createtime="+ createtime                +", note="+ note +"]";    }/**

    *

    */privatestaticfinallongserialVersionUID =1L;privateInteger id;privateInteger userId;privateString number;privateDate createtime;privateString note;//附加对象  用户对象privateUser user;publicUsergetUser(){returnuser;    }publicvoidsetUser(User user){this.user = user;    }publicIntegergetId(){returnid;    }publicvoidsetId(Integer id){this.id = id;    }publicIntegergetUserId(){returnuserId;    }publicvoidsetUserId(Integer userId){this.userId = userId;    }publicStringgetNumber(){returnnumber;    }publicvoidsetNumber(String number){this.number = number ==null?null: number.trim();    }publicDategetCreatetime(){returncreatetime;    }publicvoidsetCreatetime(Date createtime){this.createtime = createtime;    }publicStringgetNote(){returnnote;    }publicvoidsetNote(String note){this.note = note ==null?null: note.trim();    }        }

该pojo中 order中的userid与数据库中表对应的查询列不一致

创建OrderMapper.xml映射文件

<!--

        id 对应指定的resultMap标识

        type 指定映射到哪一个pojo上

    --><!--id 定义主键 如果是多个字段 则定义多个id

        标签中的property 表示 指定映射到pojo的哪个属性

        标签中的column 表示 指定映射到数据库中的列名

        --><!--普通属性使用result定义--><!--resultMap标签指定一个ResultMap的标识-->SELECT id, user_id,        number,        createtime, note FROM `orders`

测试代码

@TestpublicvoidtestResultMapQuery()throwsIOException{        SqlSessionFactoryBuilder builder =newSqlSessionFactoryBuilder();        SqlSessionFactory sqlSessionFactory = builder.build(Resources.getResourceAsStream("SqlMapConfig.xml"));        SqlSession sqlSession = sqlSessionFactory.openSession();        OrderMapper orderMapper = sqlSession.getMapper(OrderMapper.class);        List orderList = orderMapper.queryOrderList();for(Orders orders : orderList) {            System.out.println(orders);        }    }

动态SQL

通过Mybatis提供的各种标签方法实现动态拼接SQL

if标签

编写mapper.xml文件

<!--动态标签--><!-- 考虑到sex 和username不一定同时存在 所以加入if标签进行判断 -->SELECT * FROM user        WHERE 1=1and sex = #{sex}and username LIKE "%${username}%"

上面这种判断 还是存在where 1=1  的情况,这种情况显然还是很麻烦的 ,下面我们使用where标签对上面的判断进行改造

where标签

mapper.xml文件

<!-- 考虑到sex 和username不一定同时存在 所以加入if标签进行判断 -->SELECT * FROM userand sex = #{sex}and username LIKE "%${username}%"

where标签会自动添加where条件,同时会处理sql语句中的第一个and关键字

sql片段

sql中可将重复的sql提取出来,使用时用Include引用,最终达到sql重用的目的

上面的sql提取出来后

<!-- 根据条件查询用户 --><!-- SELECT id, username, birthday, sex, address FROM `user` --><!-- 使用include标签加载sql片段;refid是sql片段id -->SELECTFROM `user`<!-- where标签可以自动添加where关键字,同时处理sql语句中第一个and关键字 -->AND sex = #{sex}AND username LIKE            '%${username}%'<!-- 声明sql片段 -->id, username, birthday, sex, address

foreach标签

向sql中传递数组或list mybatis使用foreach解析

改造QueryVo

在QueryVo中加入List代表多个id的集合

publicclassQueryVoimplementsSerializable{privateUser user;privateList ids;publicListgetIds(){returnids;    }publicvoidsetIds(List<Integer> ids){this.ids = ids;    }publicUsergetUser(){returnuser;    }publicvoidsetUser(User user){this.user = user;    }}

Mapper.xml文件

<!--根据ids查询用户-->SELECT * FROM user<!--

            foreach标签

            collection:要遍历的集合,在这里是QueryVo中的ids属性

            直接传递数组时collection指定array

              直接传递list时collection指定list


            item:遍历的项目

            open:在前面添加的sql片段

            close:在结尾处添加的sql片段

            separator:指定遍历的元素之间使用的分隔符

            -->#{item}

测试方法

@TestpublicvoidtestQueryByIds()throws IOException{        SqlSessionFactoryBuilder builder =newSqlSessionFactoryBuilder();        SqlSessionFactory sqlSessionFactory = builder.build(Resources.getResourceAsStream("SqlMapConfig.xml"));        SqlSession sqlSession = sqlSessionFactory.openSession();        UserMapper userMapper = sqlSession.getMapper(UserMapper.class);        QueryVo queryVo =newQueryVo();        Listlist=newArrayList<>();list.add(1);list.add(10);list.add(24);        queryVo.setIds(list);        List users = userMapper.queryUserByIds(queryVo);for(User user : users) {            System.out.println(user);        }    }

一对一查询

使用resultMap

改造pojo类

在Order类中加入User属性,user属性中用于存储关联查询的用户信息,对于订单来说订单关联查询用户是一对一关系,所以这里使用单个User对象存储关联查询的用户信息

publicclassOrdersimplementsSerializable{@OverridepublicStringtoString(){return"Orders [id="+ id +", userId="+ userId +", number="+ number +", createtime="+ createtime                +", note="+ note +"]";    }/**

    *

    */privatestaticfinallongserialVersionUID =1L;privateInteger id;privateInteger userId;privateString number;privateDate createtime;privateString note;//附加对象  用户对象privateUser user;}

Mapper.xml

<!--映射数据库主键 id--><!--一对一属性映射--><!--一对一关联,查询订单,订单内部包含用户属性-->SELECT            o.id,            o.user_id,            o.number,            o.createtime,            o.note,            u.username,            u.address        FROM            `orders` o            LEFT JOIN `user` u ON o.user_id = u.id

上面的配置文件中 左关联查询时 对应映射的类与数据库查询列不一致 所以使用resultMap映射

Orders中有User属性,所以需要使用一对一映射User 使用resultMap的association标签映射User属性,在association标签下 再分别映射user对象的属性 其中指定的property是user对象的属性名 column是对应数据库列的名称

测试代码

@TestpublicvoidtestQueryByResultMap()throwsIOException{        SqlSessionFactoryBuilder builder =newSqlSessionFactoryBuilder();        SqlSessionFactory sqlSessionFactory = builder.build(Resources.getResourceAsStream("SqlMapConfig.xml"));        SqlSession sqlSession = sqlSessionFactory.openSession();        OrderMapper orderMapper = sqlSession.getMapper(OrderMapper.class);        List orders = orderMapper.queryOrderUserResultMap();for(Orders order : orders) {            System.out.println(order);        }    }

一对多查询

修改POJO User类

publicclassUserimplementsSerializable{/**

    *

    */privatestaticfinallongserialVersionUID =1L;privateInteger id;privateString username;// 用户姓名privateString sex;// 性别privateDate birthday;// 生日privateString address;// 地址privateList ordersList;publicListgetOrdersList(){returnordersList;    }publicvoidsetOrdersList(List<Orders> ordersList){this.ordersList = ordersList;    }}

Mapper.xml 映射文件

<!-- 一对多 -->SELECT            o.id,            o.user_id,            o.number,            o.createtime,            u.username        FROM user u            left join orders o                on o.user_id = u.id

Mybatis整合Spring

整合思路

SqlSessionFactory对象应该放到spring容器中作为单例存在。

传统dao的开发方式中,应该从spring容器中获得sqlsession对象。

Mapper代理形式中,应该从spring容器中直接获得mapper的代理对象。

数据库的连接以及数据库连接池事务管理都交给spring容器来完成。

整合需要的jar包

spring的jar包

Mybatis的jar包

Spring+mybatis的整合包。

Mysql的数据库驱动jar包。

数据库连接池的jar包。

SqlMapConfig.xml

<?xml version="1.0"encoding="UTF-8"?><!DOCTYPE configuration

        PUBLIC "-//mybatis.org//DTD Config 3.0//EN"

        "http://mybatis.org/dtd/mybatis-3-config.dtd"><!-- 设置别名 --><!-- 2. 指定扫描包,会把包内所有的类都设置别名,别名的名称就是类名,大小写不敏感 -->

applicationContext.xml

<?xml version="1.0"encoding="UTF-8"?><!--加载配置文件--><!--配置数据库连接池--><!--配置sqlsessionFactory--><!--配置mybatis核心配置文件--><!--配置数据源--><!--配置UserMapper--><!--配置mapper接口--><!--配置SqlSessionFactory工厂-->

db.properties

Mapper接口

publicinterfaceUserMapper{publicUserfindUserById(Integer id);}

UserMapper.xml映射文件

<?xml version="1.0"encoding="UTF-8"?><!DOCTYPE mapper

        PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"

        "http://mybatis.org/dtd/mybatis-3-mapper.dtd">SELECT *        FROM user        where id = #{v}

测试代码

@TestpublicvoidtestQueryById(){        ClassPathXmlApplicationContext applicationContext =newClassPathXmlApplicationContext("config/applicationContext.xml");        UserMapper userMapper = (UserMapper) applicationContext.getBean("userMapper");        User user = userMapper.findUserById(10);        System.out.println(user);    }

在存在多个mapper的时候 在spring中都需要制定具体的mapper 这种方式在我们开发中是很麻烦的,所以在这种时候我们引入扫描包形式配置mapper

扫描包形式配置mapper

在配置的时候需要制定 MapperScannerConfigurer 在property中指定扫描的基础包

由于工厂已经实例化 所以不需要指定工厂 MapperScannerConfigurer也能找到工厂

<!--包扫描形式配置mapper-->

Mybatis逆向工程

使用官方网站提供的Mapper自动生成工具 mybatis-generator-core来生成pojo类和Mapper映射文件

导入逆向工程

need-to-insert-img

官方提供的逆向工程

修改配置文件

<?xml version="1.0"encoding="UTF-8"?><!DOCTYPE generatorConfiguration

  PUBLIC "-//mybatis.org//DTD MyBatis Generator Configuration 1.0//EN"

  "http://mybatis.org/dtd/mybatis-generator-config_1_0.dtd"><!-- 是否去除自动生成的注释 true:是 : false:否 --><!--数据库连接的信息:驱动类、连接地址、用户名、密码 --><!-- <jdbcConnection driverClass="oracle.jdbc.OracleDriver" connectionURL="jdbc:oracle:thin:@127.0.0.1:1521:yycg"

            userId="yycg" password="yycg"> </jdbcConnection> --><!-- 默认false,把JDBC DECIMAL 和 NUMERIC 类型解析为 Integer,为 true时把JDBC DECIMAL

            和 NUMERIC 类型解析为java.math.BigDecimal --><!-- targetProject:生成PO类的位置 --><!-- enableSubPackages:是否让schema作为包的后缀 --><!-- 从数据库返回的值被清理前后的空格 --><!-- targetProject:mapper映射文件生成的位置 --><!-- enableSubPackages:是否让schema作为包的后缀 --><!-- targetPackage:mapper接口生成的位置 --><!-- enableSubPackages:是否让schema作为包的后缀 --><!-- 指定数据库表 -->

生成逆向工程代码 执行工程main主函数

图片.png

图片.png

代码生成在工程目录下

图片.png

作者:So_ProbuING

链接:https://www.jianshu.com/p/ab18a3a09fc2

來源:简书

简书著作权归作者所有,任何形式的转载都请联系作者获得授权并注明出处。

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 194,088评论 5 459
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 81,715评论 2 371
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 141,361评论 0 319
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 52,099评论 1 263
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 60,987评论 4 355
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 46,063评论 1 272
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 36,486评论 3 381
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,175评论 0 253
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 39,440评论 1 290
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 34,518评论 2 309
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 36,305评论 1 326
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,190评论 3 312
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 37,550评论 3 298
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 28,880评论 0 17
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,152评论 1 250
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 41,451评论 2 341
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 40,637评论 2 335

推荐阅读更多精彩内容