GVKun编程网logo

mybatis 学习笔记(二):mybatis SQL注入问题(mybatis $注入)

9

本篇文章给大家谈谈mybatis学习笔记,以及二:mybatisSQL注入问题的知识点,同时本文还将给你拓展java-mybaits-015-mybatis逆向工程最佳实践【基础mybatis-gen

本篇文章给大家谈谈mybatis 学习笔记,以及二:mybatis SQL注入问题的知识点,同时本文还将给你拓展java-mybaits-015-mybatis逆向工程最佳实践【基础mybatis-generator、tk.mybatis、mubatis-plus】、JavaEE--Mybatis 学习笔记(一)--Mybatis 简介、Mabatis三剑客分别是:mybatis-generator、mybatis-plugin、mybatis-pagehelper、Mybatis - 学习笔记(N)mybatis-generator 生成 DAO、Mapper、entity等相关知识,希望对各位有所帮助,不要忘了收藏本站喔。

本文目录一览:

mybatis 学习笔记(二):mybatis SQL注入问题(mybatis $注入)

mybatis 学习笔记(二):mybatis SQL注入问题(mybatis $注入)

mybatis 学习笔记(二):mybatis SQL注入问题

SQL 注入攻击

首先了解下概念,什么叫SQL 注入:

SQL注入攻击,简称SQL攻击或注入攻击,是发生于应用程序之数据库层的安全漏洞。简而言之,是在输入的字符串之中注入SQL指令,在设计不良的程序当中忽略了检查,那么这些注入进去的指令就会被数据库服务器误认为是正常的SQL指令而运行,因此遭到破坏或是入侵。

最常见的就是我们在应用程序中使用字符串联结方式组合 SQL 指令,有心之人就会写一些特殊的符号,恶意篡改原本的 SQL 语法的作用,达到注入攻击的目的。

举个栗子:

比如验证用户登录需要 username 和 password,编写的 SQL 语句如下:

select * from user where (name = ''"+ username +"'') and (pw = ''"+ password +"'');

username 和 password 字段被恶意填入

username = "1'' OR ''1''=''1";

password = "1'' OR ''1''=''1";

将导致原本的 SQL 字符串被填为:

select * from user where (name = ''1'' or ''1''=''1'') and (pw = ''1'' or ''1''=''1'');

实际上运行的 SQL 语句将变成:

select * from user;

也就是不再需要 username 和 password 账密即达到登录的目的,结果不言而喻。

mybatis 解决 SQL 注入问题

我们使用 mybatis 编写 SQL 语句时,难免会使用模糊查询的方法,mybatis 提供了两种方式 #{}${}

  • #{value} 在预处理时,会把参数部分用一个占位符 ? 替代,其中 value 表示接受输入参数的名称。能有效解决 SQL 注入问题
  • ${} 表示使用拼接字符串,将接受到参数的内容不加任何修饰符拼接在 SQL 中,使用${}拼接 sql,将引起 SQL 注入问题。

举个栗子:

1 查询数据库 sample 表 user 中的记录,我们故意使用特殊符号,看能否引起 SQL 注入。使用 mybatis 在 mapper.xml 配置文件中编写 SQL 语句,我们先采用拼接字符串形式,看看结果如何:

 <select id="findUserByName" parameterType="java.lang.String" resultType="cn.itcast.mybatis.po.User">
        <!-- 拼接 MySQL,引起 SQL 注入 -->
        SELECT * FROM user WHERE username LIKE ''%${value}%''
    </select>

注意在配置文件中编写 SQL 语句时,后边不需要加分号。

调用配置文件,编写测试文件,查询数据库内容,采用特殊符号,引起 SQL 注入:

    @Test
    public void testFindUserByName() throws Exception{

        SqlSession sqlSession=sqlSessionFactory.openSession();

        //创建UserMapper代理对象
        UserMapper userMapper=sqlSession.getMapper(UserMapper.class);

        //调用userMapper的方法
        List<User> list=userMapper.findUserByName("'' or ''1''=''1");

        sqlSession.close();

        System.out.println(list);
    }
}

运行结果如下图所示:

可以看到执行语句其实变为了

select * from user

将user 表中的全部记录打印出来了。发生了 SQL 注入。

2 如果将配置文件中的 SQL 语句改成 #{} 形式,可避免 SQL 注入。

 <select id="findUserByName" parameterType="java.lang.String" resultType="cn.itcast.mybatis.po.User">
        <!-- 使用 SQL concat 语句,拼接字符串,防止 SQL 注入 -->
        SELECT * FROM USER WHERE username LIKE CONCAT(''%'',#{value},''%'' )
    </select>

再次运行测试程序,控制台输出如下:

可以看到程序中参数部分用 ? 替代了,很好地解决了 SQL 语句的问题,防止了 SQL 注入。查询结果将为空。

java-mybaits-015-mybatis逆向工程最佳实践【基础mybatis-generator、tk.mybatis、mubatis-plus】

java-mybaits-015-mybatis逆向工程最佳实践【基础mybatis-generator、tk.mybatis、mubatis-plus】

一、概述

三款框架的功能对比

 

Mybatis-generator

通用Mapper

Mybatis-Plus

代码生成器

支持自动生成Model,Mapper,Mapper XML文件

生成方式不够灵活;

生成代码功能较为简单

支持自动生成Entity,Mapper,Mapper XML文件;

提供通用的Mapper模板,生成方式较灵活;

生成的Model文件包含注释能够很好地与数据库表完成映射

支持自动生成Entity,Mapper,Mapper XML,Service,Controller文件;

提供BaseMapper接口

CRUD操作

代码生成后每个Mapper有固定的CRUD方法;

在每个Mapper上分别扩展

提供通用Mapper接口;方便构造统一service

可以扩展通用接口

提供BaseMapper接口;

可以扩展通用接口

条件构造器

每个实体类自己的Example构造条件【对象方式】

提供通用Example【构建sql】

提供Wrapper进行复杂条件构造

乐观锁

 

支持

支持

主键策略

 

支持

支持

分页

 

 

支持

逻辑删除

 

 

支持

通用枚举

 

 

支持

攻击Sql阻断

 

 

支持

性能分析

 

 

支持

  通用Mapper是对Mybatis-generator的升级改造,解决了使用Mybatis-generator可能需要大量重构的问题,并且在这个基础上加入了一些新的功能。

  Mybatis-Plus可以看作是在另一个方向上对Mybatis的升级改造,不仅能够根据数据库表快速生成pojo实体类,还封装了大量CRUD方法,使用Wrapper解决了复杂条件构造等问题,更是根据开发中常见的问题给出了一系列解决方案。

  在拥有Maven和Spring boot的开发框架下,MBG、通用Mapper和MP都可以快速地完成安装,相比于MBG和通用Mapper仅需要执行插件就可以完成基本的开发工作,MP可能需要更多的开发工作量。

  最佳实践参看代码:https://github.com/bjlhx15/java_base_architecture.git

二、Mybatis-generator

  MyBatis Generator(MBG)是MyBatis MyBatis 和iBATIS的代码生成器。它为所有版本的MyBatis以及版本2.2.0之后的iBATIS版本生成代码。它将根据数据库表生成可用于访问表的文件。

  Mybatis-generator主要完成的工作是依据数据库表创建对应的model、dao、mapping文件,可以通过Maven插件或者mybatis-generator的jar包生成。

  这里介绍Maven插件使用方法:

    1、在pom.xml文件中加入mybatis-generator系列插件;

    2、创建generatorConfig.xml文件,在配置文件中指定数据库连接地址、生成类的存放地址、生成对应表的类名等信息;

    3、执行mybatis-generator插件,即可生成相应文件;

    4、此外,mybatis-generator自动生成了example类用于构造复杂的筛选条件

  Mybatis-generator使用较为简单,生成的DAO类及映射文件中包含基本的CRUD操作。

  需要注意的是,在一次项目中多次执行mybatis-generator,xml文件会追加,会覆盖原本的Model、DAO;可以使用如下方式

    

    1、每次清理要生成的xml

    2、自动生成的写入auto,

    3、个人扩展的使用上图方式

  可以参看上述github代码

三、通用Mapper【tk.mybatis】

官网:https://github.com/abel533/Mapper/wiki

  当数据库字段变化频繁时,使用MBG(mybatis-generator)会带来大量的重构工作,对此,通用Mapper给出的解决办法是:给予开发者一个具备丰富的单表方法并且容易扩展的通用的Mapper。

  通用Mapper是对单表的CRUD操作进行了较为详细的实现,使得开发人员可以随意的按照自己的需求选择通用的方法,同时允许开发人员便捷地对通用Mapper进行扩展。

1. 在pom.xml中添加插件配置

<!-- 命令:mvn mybatis-generator:generate -->
            <plugin>
                <groupId>org.mybatis.generator</groupId>
                <artifactId>mybatis-generator-maven-plugin</artifactId>
                <version>1.3.6</version>
                <configuration>
                    <!-- 配置实际调用地址-->
                    <configurationFile>src/main/resources/mybatis_generatorConfig/generatorConfig-base.xml
                    </configurationFile>
                    <verbose>true</verbose>
                    <overwrite>true</overwrite>
                </configuration>
                <dependencies>
                    <dependency>
                        <groupId>mysql</groupId>
                        <artifactId>mysql-connector-java</artifactId>
                        <version>5.1.38</version>
                    </dependency>
                    <dependency>
                        <groupId>tk.mybatis</groupId>
                        <artifactId>mapper</artifactId>
                        <version>4.0.0</version>
                    </dependency>
                </dependencies>
            </plugin>
View Code

  可以看到,通用Mapper的代码生成实际上是使用了MGB,因此通用Mapper的代码生成器只是调用了MGB,然后在这个基础上加入了一些元素来方便开发。

2. 配置文件generatorConfig.xml

<?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" >
<generatorConfiguration>
    <!--导入属性配置,前面我们写的一个配置文件,你也可以直接使用mybatis的jdbc的配置文件 -->
    <properties resource="jdbc.properties"></properties>
    <!-- 数据库驱动,注意,这里必须要修改成你的数据库的驱动地址 -->
    <!--    如果 pom配置这里可以不写-->
    <!--    <classPathEntry  location=".m2/repository/mysql/mysql-connector-java/5.1.8/mysql-connector-java-5.1.8.jar"/>-->

    <context id="Mysql" targetRuntime="MyBatis3Simple" defaultModelType="flat">
        <property name="beginningDelimiter" value="`"/>
        <property name="endingDelimiter" value="`"/>
        <plugin type="tk.mybatis.mapper.generator.MapperPlugin">
            <property name="mappers" value="tk.mybatis.mapper.common.Mapper"/>
            <property name="caseSensitive" value="true"/>
        </plugin>

        <!--数据库连接的信息:驱动类、连接地址、用户名、密码 -->
        <jdbcConnection driverClass="${jdbc.driver}"
                        connectionURL="${jdbc.url}"
                        userId="${jdbc.username}" password="${jdbc.password}">
        </jdbcConnection>

<!--        <javaTypeResolver>-->
<!--            <property name="forceBigDecimals" value="false"/>-->
<!--        </javaTypeResolver>-->
        <!-- targetProject:生成PO类的位置 -->
        <javaModelGenerator targetPackage="com.github.bjlhx15.mybatis.springboot.base.model.auto"
                            targetProject="../tk-mybatis-springboot-base1/src/main/java">
            <!-- enableSubPackages:是否让schema作为包的后缀 -->
            <property name="enableSubPackages" value="false"/>
            <!-- 从数据库返回的值被清理前后的空格 -->
            <property name="trimStrings" value="true"/>
        </javaModelGenerator>

        <!-- targetProject:mapper xml 映射文件生成的位置 -->
        <sqlMapGenerator targetPackage="autoxml"
                         targetProject="../tk-mybatis-springboot-base1/src/main/resources/mapper/">
            <!-- enableSubPackages:是否让schema作为包的后缀 -->
            <property name="enableSubPackages" value="false"/>
        </sqlMapGenerator>

        <!--targetPackage:mapper接口生成的位置 -->
        <javaClientGenerator type="XMLMAPPER"
                             targetPackage="com.github.bjlhx15.mybatis.springboot.base.repository.auto"
                             targetProject="../tk-mybatis-springboot-base1/src/main/java">
            <!-- enableSubPackages:是否让schema作为包的后缀 -->
            <property name="enableSubPackages" value="false"/>
        </javaClientGenerator>

        <!-- 指定数据库表 -->
        <table tableName="accountbalance" domainObjectName="AccountBalance">
            <generatedKey column="id" sqlStatement="JDBC"/>
        </table>


    </context>
</generatorConfiguration>
View Code

  与MGB原有的配置文件相比,这里只是多了一个插件的配置,这个插件的作用是:配置生成的Mapper接口都会自动继承这个接口,也就是说,使用通用Mapper生成的mapper接口即使看上去空空如也,但已经具备了大量的对数据库的操作方法。此外,通用 Mapper 专用代码生成器生成的 Model 会在原有基础上增加 @Table,@Id,@Column 等注解,方便自动与数据库字段进行映射。

3. 在 pom.xml 这一级目录的命令行窗口执行 mvn mybatis-generator:generate或者直接在执行mvn插件即可。

4. 通用Mapper同样有Example的设计,与MGB不同的是,MDB会对每一个表生成对应的Example类,而通用Mapper提供了一个统一的Example类,这个类和 MBG 生成的相比,需要自己设置属性名,这个类还额外提供了更多的方法。

  通用Mapper可以看作是MGB的改进和扩展,一定程度上解决了使用MGB重构的问题。

  可以参看上述github代码

四、Mybatis-Plus

  官网地址:https://mp.baomidou.com/guide/generator.html

  (以下简称MP)是Mybatis的增强工具(MBG和通用Mapper可看成插件),在Mybatis的基础上增加了很多功能,简化开发,提高效率。

在Spring Boot中的引入:

1. 在maven中添加MP启动器

<dependency>
    <groupId>com.baomidou</groupId>
    <artifactId>mybatis-plus-boot-starter</artifactId>
    <version>3.1.2</version>
</dependency>

2. 要使用代码生成器还需要添加模板引擎依赖

参看地址:AutoGenerator的使用参考 https://mybatis.plus/guide/generator.html 。

添加 模板引擎 依赖,MyBatis-Plus 支持 Velocity(默认)、Freemarker、Beetl,用户可以选择自己熟悉的模板引擎,如果都不满足您的要求,可以采用自定义模板引擎。

Velocity(默认):

<dependency>
    <groupId>org.apache.velocity</groupId>
    <artifactId>velocity-engine-core</artifactId>
    <version>2.1</version>
</dependency>

Freemarker:

<dependency>
    <groupId>org.freemarker</groupId>
    <artifactId>freemarker</artifactId>
    <version>2.3.29</version>
</dependency>

Beetl:

<dependency>
    <groupId>com.ibeetl</groupId>
    <artifactId>beetl</artifactId>
    <version>3.0.11.RELEASE</version>
</dependency>

注意!如果您选择了非默认引擎,需要在 AutoGenerator 中 设置模板引擎。

AutoGenerator generator = new AutoGenerator();

// set freemarker engine
generator.setTemplateEngine(new FreemarkerTemplateEngine());

// set beetl engine
generator.setTemplateEngine(new BeetlTemplateEngine());

// set custom engine (reference class is your custom engine class)
generator.setTemplateEngine(new CustomTemplateEngine());

// other config
...
View Code

3、代码的自动生成。AutoGenerator是MP的代码生成器,通过调用AutoGenerator,进行相应的模板、策略配置可以快速生成Entity、Mapper、Mapper XML、Service、Controller各个模块的代码。

4. MP将通用的CRUD操作封装进BaseMapper接口,而自动生成的Mapper接口便自动继承了BaseMapper接口。复杂的Sql操作,则可以使用QueryWrapper(LambdaQueryWrapper) 和 UpdateWrapper(LambdaUpdateWrapper)进行动态Sql拼接。

5、此外,MP还支持分页、逻辑删除、通用枚举、Sql注入等功能,在:https://mp.baomidou.com/guide/generator.html

  还有性能分析插件:https://mp.baomidou.com/guide/performance-analysis-plugin.html

与MBG不同,使用Mybatis-Plus自动生成代码需要编写代码,通过调用AutoAutoGenerator类实现代码生成,从这方面来说不如使用插件方便。但是它丰富的功能以及只是相对复杂的配置还是使它领先于MBG以及通用Mapper。

 

 

 

 

 

 

 

 

双方都

JavaEE--Mybatis 学习笔记(一)--Mybatis 简介

JavaEE--Mybatis 学习笔记(一)--Mybatis 简介

一、简介:

  • MyBatis 本是 apache 的一个开源项目 iBatis, 2010 年这个项目由 apache software foundation 迁移到了 google code,并且改名为 MyBatis 。2013 年 11 月迁移到 Github。
  • iBATIS 一词来源于 “internet” 和 “abatis” 的组合,是一个基于 Java 的持久层框架。iBATIS 提供的持久层框架包括 SQL Maps 和 Data Access Objects(DAO)
  • MyBatis 的前身就是 iBatis,iBatis 本是由 ClintonBegin 开发,后来捐给 Apache 基金会,成立了 iBatis 开源项目2010 5 月该项目由 Apahce 基金会迁移到了 GoogleCode,并且改名为 MyBatis。尽管如此,它的包结构仍然为 ibatis
  • 访问网站

        www.mybatis.org/

        https://github.com/mybatis

  • MyBatis 是一个数据持久层 (ORM) 框架。把实体类和 SQL 语句之间建立了映射关系,是一种半自动化的 ORM 实现。
  • 所有 sql 语句,全部定义在 xml(建议)中。也可以通过注解的方式在接口上实现。这些映射文件称之为 mapper。

二、MyBatis 的优点(与其他架构区别)

  • MyBatis 的优点:
      1. 基于 SQL 语法,简单易学。
      2. 能了解底层组装过程。
      3.   SQL 语句封装在配置文件中,便于统一管理与维护,降低了程序的耦合度。
      4. 程序调试方便。
  • 与传统 JDBC 的比较
      1. 减少了 61% 的代码量
      2. 最简单的持久化框架
      3. 架构级性能增强
      4. SQL 代码从程序代码中彻底分离,可重用
      5. 增强了项目中的分工
      6. 增强了移植性
  •   Hibernate 的对比
  • Mybatis 在 XML 文件中配置 SQL 语句,实现了 SQL 语句和代码的分离,给程序的维护带来了很大便利

 

MyBatis 和 Hibernate 比较

 MyBatis

Hibernate

是一个 SQL 语句映射的框架(工具) 主流的 ORM(对象关系映射)框架、提供了从 POJO 到数据库表的全套映射机制 注重 POJO/Map SQL 之间的映射关系。不会为程序员在运行期自动生成 SQL 会自动生成全套 SQL 语句。 自动化程度低、手工映射 SQL, 灵活程度高 因为自动化程度高、映射配置复杂,api 也相对复杂,灵活性低. 需要开发人员熟炼掌据 SQL 语句 开发人同不必关注 SQL 底层语句开发

 

 

 

 

 

 

 

 三、Mybatis 体系结构

1. 功能架构讲解:

我们把 Mybatis 的功能架构分为三层:
  • API 接口层:提供给外部使用的接口 API,开发人员通过这些本地 API 来操纵数据库。接口层一接收到调用请求就会调用数据处理层来完成具体的数据处理。
  • 数据处理层:负责具体的 SQL 查找、SQL 解析、SQL 执行和执行结果映射处理等。它主要的目的是根据调用的请求完成一次数据库操作。
  • 基础支撑层:负责最基础的功能支撑,包括连接管理、事务管理、配置加载和缓存处理,这些都是共用的东西,将他们抽取出来作为最基础的组件。为上层的数据处理层提供最基础的支撑。
2. 框架架构讲解:
  • 加载配置:配置来源于两个地方,一处是配置文件,一处是 Java 代码的注解,将 SQL 的配置信息加载成为一个
    mybatis 结构
    个 MappedStatement 对象(包括了传入参数映射配置、执行的 SQL 语句、结果映射配置),存储在内存中。
  • SQL 解析:当 API 接口层接收到调用请求时,会接收到传入 SQL 的 ID 和传入对象(可以是 Map、JavaBean 或者基本数据类型),Mybatis 会根据 SQL 的 ID 找到对应的 MappedStatement,然后根据传入参数对象对 MappedStatement 进行解析,解析后可以得到最终要执行的 SQL 语句和参数。
  • SQL 执行:将最终得到的 SQL 和参数拿到数据库进行执行,得到操作数据库的结果。
  • 结果映射:将操作数据库的结果按照映射的配置进行转换,可以转换成 HashMap、JavaBean 或者基本数据类型,并将最终结果返回。

 四、Mybatis 工作原理

 

 

5. 配置文件与约束

其中 mapper.xml 为

1 <?xml version="1.0" encoding="UTF-8"?>
2 <!DOCTYPE mapper 3  PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" 4  "http://mybatis.org/dtd/mybatis-3-mapper.dtd"> 5 <mapper> 6 7 </mapper>

mybatis.xml

1 <?xml version="1.0" encoding="UTF-8"?>
2 <!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Config 3.0//EN" 3 "http://mybatis.org/dtd/mybatis-3-config.dtd"> 4 <configuration> 5 6 </configuration>

这些都可以在下载的 mybatis 文件夹中的 pdf 找到

6.MyBatis 基本要素

    1). 基础配置文件 mybatis.xml

  •  configuration.xml系统的核心配置文件,包含数据源和事务管理器等设置和属性信息,XML 文档结构如下

 

  • configuration配置
     properties可以配置在Java属性配置文件中
     settings修改MyBatis在运行时的行为方式,如是否需要缓存
     typeAliases 为Java类型命名一个短的名字
     typeHandlers类型处理器-系统默认已经为所有类型设置OK
     objectFactory对象工厂–创建Bean。
     plugins插件  - 拦截CRUD操作。
     environments环境 -配置数据源
     environment 环境变量
     transactionManager事务管理器 JDBC|JNDI|JTA
     dataSource数据源
     mappersl 映射器 XML文件|Mapper类|网络资源

     

  •  配置环境

 1 <?xml version="1.0" encoding="UTF-8"?>
 2 <!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Config 3.0//EN"  3 "http://mybatis.org/dtd/mybatis-3-config.dtd">  4 <configuration>  5 <!-- 配置运行环境 Ctrl Shift / -->  6 <environments default="mysqlEM">  7 <environment id="mysqlEM">  8 <transactionManager type="JDBC" />  9 <dataSource type="POOLED"> 10 <!-- 使用的是数据库连接池 JDBC也是一种数据源 --> 11 <!-- driver url username password --> 12 <property name="driver" value="com.mysql.jdbc.Driver" /> 13 <!-- jdbc:mysql:/// 就是127.0.0.1:3306 --> 14 <property name="url" value="jdbc:mysql://127.0.0.1:3306/test17182" /> 15 <property name="username" value="root" /> 16 <property name="password" value="123456" /> 17 </dataSource> 18 </environment> 19 <environment id="testEM"> 20 <transactionManager type="JDBC" /> 21 <dataSource type="POOLED"> 22 <!-- 使用的是数据库连接池 JDBC也是一种数据源 --> 23 <!-- driver url username password --> 24 <property name="driver" value="com.mysql.jdbc.Driver" /> 25 <!-- jdbc:mysql:/// 就是127.0.0.1:3306 --> 26 <property name="url" value="jdbc:mysql://127.0.0.1:3306/test17182" /> 27 <property name="username" value="root" /> 28 <property name="password" value="123456" /> 29 </dataSource> 30 </environment> 31 </environments> 32 33 </configuration>

 

 

  • 基础配置文件 事务管理
  MyBatis有两种事务管理类型:
  JDBC- 这个类型直接全部使用JDBC的提交和回滚功能。它依靠使用连接的数据源来管理事务的作用域。
  MANAGED- 这个类型什么不做, 它从不提交 、 回滚和关闭连接 。 而是让窗口来管理事务的全部生命周期 。(比如说 Spring或者JAVAEE服务器)

 

  • 基础配置文件 数据源
    数据源类型有三种:UNPOOLED,POOLED,JNDI。

    UNPOOLED- 这个数据源实现只是在每次请求的时候简单的打开和关闭一个连接。虽然这有点慢,但作为一些不需要性能和立即响应的简单应用来说, 不失为一种好选择 。

    POOLED- 这个数据源缓存JDBC连接对象用于避免每次都要连接和生成连接实例而需要的验证时间。对于并发WEB应用,这种方式非常流行因为它有最快的响应时间。

    JNDI- 这个数据源实现是为了准备和Spring或应用服务一起使用,可以在外部也可以在内部配置这个数据源,然后在JNDI上下文中引用它。这个数据源配置只需要两上属性:

 

  • 基础配置文件 —SQL 映射文件
    SQL 映射文件:

              使用相对路径 (还有全路径等)

    <!-- 注册映射文件 mapper resource/url/class  package name=""-->
      <mappers>
          <mapper resource="com/ryanxu/dao/mapper.xml" />
      </mappers>

 

  • 一些别的要点

    <=1 至多一个 且按顺序

   必须要有俩 且有先后顺序

   >=0

    2).SQL 映射文件 mapper.xml

 

  • SQL 映射文件结构:(有关文件的增删改查结构将用代码来演示)
  cache-  配置给定命名空间的缓存。
  cache-ref–  从其他命名空间引用缓存配置。
  resultMap  –  最复杂,也是最有力量的元素,用来描述如何从数据库结果集中来加载对象。l
  sql–  可以重用的SQL块,也可以被其他语句引用。
  insert–  映射插入语句
  update–  映射更新语句
  delete–  映射删除语句
  select–  映射查询语句

 

  • 动态 SQL
    MyBatis 的一个强大的特性之一通常是它的动态 SQL 能力
    if  
    choose(when,otherwise)
    trim(where,set)
    foreach

7. 核心类的生命周期

  • SqlSessionFactoryBuilder 的生命周期:这个类可以被初始 、 使用和丢弃 , 如果你已经创建好了一个 SqlSessionFactory 后就不用再保留它。 因此 ,SqlSessionFactoryBuilder 的最好作用域是方法体内,比如说定义一个方法变量。你可以重复使用 SqlSessionFactoryBuilder 生成多个 SqlSessionFactory 实例, 但是最好不要强行保留 , 因为 XML 的解析资源要用来做其它更重要的事
  • SqlSession   每个线程都有自己的 SqlSession 实例,SqlSession 实例是不能被共享,也是不是线程安全的。因此最好使用 Request 作用域或者方法体作用域。不要使用类的静态变量来引用一个 SqlSession 实例,甚至不要使用类的一个实例变更来引用。如果你正在使用 WEB 框架,应该让 SqlSession 跟随 HTTP 请求的相似作用域。也就是说,在收到一个 HTTP 请求过后,打开 SqlSession,等返回一个回应以后,立马关掉这个 SqlSession。关闭 SqlSession 是非常重要的。你必须要确保 SqlSession finally 方法体中正常关闭。
  • SqlSession  的获取:

 

 1 import java.io.IOException;
 2 import java.io.InputStream;  3 import java.sql.Connection;  4 import java.sql.SQLException;  5  6 import org.apache.ibatis.io.Resources;  7 import org.apache.ibatis.session.SqlSession;  8 import org.apache.ibatis.session.SqlSessionFactory;  9 import org.apache.ibatis.session.SqlSessionFactoryBuilder; 10 11 public class SqlSessionUtil { 12 private static SqlSessionFactory ssf;// 底层对应的是Connection连接池 13 static { 14  InputStream in; 15 try { 16 in = Resources.getResourceAsStream("mybatis-config.xml");// 从classpath位置加载文件,可以使用相对路径如:cn/hncu/mybatis-config.xml 17 SqlSessionFactoryBuilder ssfb = new SqlSessionFactoryBuilder(); 18 ssf=ssfb.build(in); 19 } catch (IOException e) { 20  e.printStackTrace(); 21  } 22  } 23 24 public static SqlSessionFactory getSsf() { 25 return ssf; 26  } 27 28 public static SqlSession getSqlSession() { 29 return ssf.openSession(); 30  } 31 32 public static void main(String[] args) throws SQLException { 33 //SqlSession是Connection的包装类 34 //每次获取的是不同的SqlSession对象,如果获取一个session对象且从中访问con,则就会到池中去拿一个连接。由于我们在配置文件中设置池大小只有5,因此只有前5个session对象能够顺利取出con对象,第6个session在获取con时会阻塞。 35 //一个session对象在获取con之后如果不使用,那么超过默认时间,它所持有的con连接会被收回池中。这样其它session对象又可以从池中获取 36 37 System.out.println("ssf:"+ssf); 38 //下面这段代码,在5个session获取连接之后会阻塞。过一段时间后,才继续执行6-10个session对象 39 for(int i=1;i<=10;i++){ 40 SqlSession ss=getSqlSession(); 41 System.out.println(i+":sqlSession:"+ss);//sqlSession不同 42 Connection con=ss.getConnection(); 43 System.out.println(i+":con:"+con);//Connection相同 44 ss.close();//session对象关闭之后,它所持有的con会还回池中,被下一个session重新持有 45  } 46  } 47 }

 

  • SqlSession 接口主要方法

  新增:

    int  insert(String statement, Object parameter) 

 

  修改:

    int  update(String statement, Object parameter) 

 

  删除:

    int  delete(String statement, Object parameter)   

 

  查询:

    List selectList(String statement, Object parameter)

Mabatis三剑客分别是:mybatis-generator、mybatis-plugin、mybatis-pagehelper

Mabatis三剑客分别是:mybatis-generator、mybatis-plugin、mybatis-pagehelper

<divid="content_views">

<h3 id="本文用的是mavenidea15"><a name="t0"></a> 本文用的是maven,idea15</h3> <p> Mabatis三剑客分别是:mybatis-generator、mybatis-<a href="https://www.baidu.com/s?wd=plugin&amp;tn=24004469_oem_dg&amp;rsv_dl=gh_pl_sl_csd" target="_blank">plugin</a>、mybatis-pagehelper</p> <h2 id="一mybatis-generator"><a name="t1"></a> <a name="t1"target="_blank"></a>一、mybatis-generator</h2> <p> 根据我们的数据库自动生成pojo、dao和xml文件&nbsp;<br> pojo里面放的是跟数据库字段一一对应的对象、dao层是接口,供service使用,xml是这个dao层接口的实现,sql语句都写在xml里</p> <h4 id="1引入mabatis-generator"> <a name="t2"target="_blank"></a>1.引入mabatis-generator</h4> <p> pom.xml里引入配置</p> <prename="code" onclick="hljs.copyCode(event)"><code><ol><li><div><divdata-line-number="1"></div></div><div><div><span><span>&lt;</span><span><span><span>plugin</span></span></span><span>&gt;</span></span></div></div></li><li><div><divdata-line-number="2"></div></div><div><div> <span><span>&lt;</span><span><span><span>groupId</span></span></span><span>&gt;</span></span>org.apache.maven.plugins<span><span>&lt;/</span><span><span><span>groupId</span></span></span><span>&gt;</span></span></div></div></li><li><div><divdata-line-number="3"></div></div><div><div> <span><span>&lt;</span><span><span><span>artifactId</span></span></span><span>&gt;</span></span>maven-compiler-plugin<span><span>&lt;/</span><span><span><span>artifactId</span></span></span><span>&gt;</span></span></div></div></li><li><div><divdata-line-number="4"></div></div><div><div> <span><span>&lt;</span><span><span><span>configuration</span></span></span><span>&gt;</span></span></div></div></li><li><div><divdata-line-number="5"></div></div><div><div> <span><span>&lt;</span><span><span><span>source</span></span></span><span>&gt;</span></span>1.7<span><span>&lt;/</span><span><span><span>source</span></span></span><span>&gt;</span></span></div></div></li><li><div><divdata-line-number="6"></div></div><div><div> <span><span>&lt;</span><span><span><span>target</span></span></span><span>&gt;</span></span>1.7<span><span>&lt;/</span><span><span><span>target</span></span></span><span>&gt;</span></span></div></div></li><li><div><divdata-line-number="7"></div></div><div><div> <span><span>&lt;</span><span><span><span>encoding</span></span></span><span>&gt;</span></span>UTF-8<span><span>&lt;/</span><span><span><span>encoding</span></span></span><span>&gt;</span></span></div></div></li><li><div><divdata-line-number="8"></div></div><div><div> <span><span>&lt;</span><span><span><span>compilerArguments</span></span></span><span>&gt;</span></span></div></div></li><li><div><divdata-line-number="9"></div></div><div><div> <span><span>&lt;</span><span><span><span>extdirs</span></span></span><span>&gt;</span></span>${project.basedir}/src/main/webapp/WEB-INF/lib/<span><span>&lt;/</span><span><span><span>extdirs</span></span></span><span>&gt;</span></span></div></div></li><li><div><divdata-line-number="10"></div></div><div><div> <span><span>&lt;/</span><span><span><span>compilerArguments</span></span></span><span>&gt;</span></span></div></div></li><li><div><divdata-line-number="11"></div></div><div><div> <span><span>&lt;/</span><span><span><span>configuration</span></span></span><span>&gt;</span></span></div></div></li><li><div><divdata-line-number="12"></div></div><div><div><span><span>&lt;/</span><span><span><span>plugin</span></span></span><span>&gt;</span></span></div></div></li></ol></code><divdata-title="复制"></div></pre><p> 引入generatorConfig.xml&nbsp;<br> generatorConfig.xml</p> <prename="code" onclick="hljs.copyCode(event)"><code><ol><li><div><divdata-line-number="1"></div></div><div><div><span><span><span>&lt;?</span>xml version=<span>"1.0"</span> encoding=<span>"UTF-8"</span><span>?&gt;</span></span></span></div></div></li><li><div><divdata-line-number="2"></div></div><div><div><span><span><span>&lt;!DOCTYPE generatorConfiguration</span></span></span></div></div></li><li><div><divdata-line-number="3"></div></div><div><div><span> PUBLIC "-//mybatis.org//DTD MyBatis Generator Configuration 1.0//EN"</span></div></div></li><li><div><divdata-line-number="4"></div></div><div><div><span> "http://mybatis.org/dtd/mybatis-generator-config_1_0.dtd"&gt;</span></div></div></li><li><div><divdata-line-number="5"></div></div><div><div> </div></div></li><li><div><divdata-line-number="6"></div></div><div><div><span><span>&lt;</span><span><span><span>generatorConfiguration</span></span></span><span>&gt;</span></span></div></div></li><li><div><divdata-line-number="7"></div></div><div><div> <span><span>&lt;!--导入属性配置--&gt;</span></span></div></div></li><li><div><divdata-line-number="8"></div></div><div><div> <span><span>&lt;</span><span><span><span>properties</span></span></span><span> </span><span><span><span>resource</span></span></span><span>=</span><span><span><span>"datasource.properties"</span></span></span><span>&gt;</span></span><span><span>&lt;/</span><span><span><span>properties</span></span></span><span>&gt;</span></span></div></div></li><li><div><divdata-line-number="9"></div></div><div><div> </div></div></li><li><div><divdata-line-number="10"></div></div><div><div> <span><span>&lt;!--指定特定数据库的jdbc驱动jar包的位置--&gt;</span></span></div></div></li><li><div><divdata-line-number="11"></div></div><div><div> <span><span>&lt;</span><span><span><span>classPathEntry</span></span></span><span> </span><span><span><span>location</span></span></span><span>=</span><span><span><span>"${db.driverLocation}"</span></span></span><span>/&gt;</span></span></div></div></li><li><div><divdata-line-number="12"></div></div><div><div> </div></div></li><li><div><divdata-line-number="13"></div></div><div><div> <span><span>&lt;</span><span><span><span>context</span></span></span><span> </span><span><span><span>id</span></span></span><span>=</span><span><span><span>"default"</span></span></span><span> </span><span><span><span>targetRuntime</span></span></span><span>=</span><span><span><span>"MyBatis3"</span></span></span><span>&gt;</span></span></div></div></li><li><div><divdata-line-number="14"></div></div><div><div> </div></div></li><li><div><divdata-line-number="15"></div></div><div><div> <span><span>&lt;!-- optional,旨在创建class时,对注释进行控制 --&gt;</span></span></div></div></li><li><div><divdata-line-number="16"></div></div><div><div> <span><span>&lt;</span><span><span><span>commentGenerator</span></span></span><span>&gt;</span></span></div></div></li><li><div><divdata-line-number="17"></div></div><div><div> <span><span>&lt;</span><span><span><span>property</span></span></span><span> </span><span><span><span>name</span></span></span><span>=</span><span><span><span>"suppressDate"</span></span></span><span> </span><span><span><span>value</span></span></span><span>=</span><span><span><span>"true"</span></span></span><span>/&gt;</span></span></div></div></li><li><div><divdata-line-number="18"></div></div><div><div> <span><span>&lt;</span><span><span><span>property</span></span></span><span> </span><span><span><span>name</span></span></span><span>=</span><span><span><span>"suppressAllComments"</span></span></span><span> </span><span><span><span>value</span></span></span><span>=</span><span><span><span>"true"</span></span></span><span>/&gt;</span></span></div></div></li><li><div><divdata-line-number="19"></div></div><div><div> <span><span>&lt;/</span><span><span><span>commentGenerator</span></span></span><span>&gt;</span></span></div></div></li><li><div><divdata-line-number="20"></div></div><div><div> </div></div></li><li><div><divdata-line-number="21"></div></div><div><div> <span><span>&lt;!--jdbc的数据库连接 --&gt;</span></span></div></div></li><li><div><divdata-line-number="22"></div></div><div><div> <span><span>&lt;</span><span><span><span>jdbcConnection</span></span></span></span></div></div></li><li><div><divdata-line-number="23"></div></div><div><div><span> </span><span><span><span>driverClass</span></span></span><span>=</span><span><span><span>"${db.driverClassName}"</span></span></span><span></span></div></div></li><li><div><divdata-line-number="24"></div></div><div><div> <span><span><span>connectionURL</span></span></span><span>=</span><span><span><span>"${db.url}"</span></span></span><span></span></div></div></li><li><div><divdata-line-number="25"></div></div><div><div> <span><span><span>userId</span></span></span><span>=</span><span><span><span>"${db.username}"</span></span></span><span></span></div></div></li><li><div><divdata-line-number="26"></div></div><div><div> <span><span><span>password</span></span></span><span>=</span><span><span><span>"${db.password}"</span></span></span><span>&gt;</span></div></div></li><li><div><divdata-line-number="27"></div></div><div><div> <span><span>&lt;/</span><span><span><span>jdbcConnection</span></span></span><span>&gt;</span></span></div></div></li><li><div><divdata-line-number="28"></div></div><div><div> </div></div></li><li><div><divdata-line-number="29"></div></div><div><div> </div></div></li><li><div><divdata-line-number="30"></div></div><div><div> <span><span>&lt;!-- 非必需,类型处理器,在数据库类型和java类型之间的转换控制--&gt;</span></span></div></div></li><li><div><divdata-line-number="31"></div></div><div><div> <span><span>&lt;</span><span><span><span>javaTypeResolver</span></span></span><span>&gt;</span></span></div></div></li><li><div><divdata-line-number="32"></div></div><div><div> <span><span>&lt;</span><span><span><span>property</span></span></span><span> </span><span><span><span>name</span></span></span><span>=</span><span><span><span>"forceBigDecimals"</span></span></span><span> </span><span><span><span>value</span></span></span><span>=</span><span><span><span>"false"</span></span></span><span>/&gt;</span></span></div></div></li><li><div><divdata-line-number="33"></div></div><div><div> <span><span>&lt;/</span><span><span><span>javaTypeResolver</span></span></span><span>&gt;</span></span></div></div></li><li><div><divdata-line-number="34"></div></div><div><div> </div></div></li><li><div><divdata-line-number="35"></div></div><div><div> </div></div></li><li><div><divdata-line-number="36"></div></div><div><div> <span><span><span>&lt;!-- Model模型生成器,用来生成含有主键key的类,记录类 以及查询Example类</span></span></span></div></div></li><li><div><divdata-line-number="37"></div></div><div><div><span> targetPackage 指定生成的model生成所在的包名</span></div></div></li><li><div><divdata-line-number="38"></div></div><div><div><span> targetProject 指定在该项目下所在的路径</span></div></div></li><li><div><divdata-line-number="39"></div></div><div><div><span> --&gt;</span></div></div></li><li><div><divdata-line-number="40"></div></div><div><div> <span><span>&lt;!--&lt;javaModelGenerator targetPackage="com.mmall.pojo" targetProject=".\src\main\java"&gt;--&gt;</span></span></div></div></li><li><div><divdata-line-number="41"></div></div><div><div> <span><span>&lt;</span><span><span><span>javaModelGenerator</span></span></span><span> </span><span><span><span>targetPackage</span></span></span><span>=</span><span><span><span>"com.mmall.pojo"</span></span></span><span> </span><span><span><span>targetProject</span></span></span><span>=</span><span><span><span>"./src/main/java"</span></span></span><span>&gt;</span></span></div></div></li><li><div><divdata-line-number="42"></div></div><div><div> <span><span>&lt;!-- 是否允许子包,即targetPackage.schemaName.tableName --&gt;</span></span></div></div></li><li><div><divdata-line-number="43"></div></div><div><div> <span><span>&lt;</span><span><span><span>property</span></span></span><span> </span><span><span><span>name</span></span></span><span>=</span><span><span><span>"enableSubPackages"</span></span></span><span> </span><span><span><span>value</span></span></span><span>=</span><span><span><span>"false"</span></span></span><span>/&gt;</span></span></div></div></li><li><div><divdata-line-number="44"></div></div><div><div> <span><span>&lt;!-- 是否对model添加 构造函数 --&gt;</span></span></div></div></li><li><div><divdata-line-number="45"></div></div><div><div> <span><span>&lt;</span><span><span><span>property</span></span></span><span> </span><span><span><span>name</span></span></span><span>=</span><span><span><span>"constructorBased"</span></span></span><span> </span><span><span><span>value</span></span></span><span>=</span><span><span><span>"true"</span></span></span><span>/&gt;</span></span></div></div></li><li><div><divdata-line-number="46"></div></div><div><div> <span><span>&lt;!-- 是否对类CHAR类型的列的数据进行trim操作 --&gt;</span></span></div></div></li><li><div><divdata-line-number="47"></div></div><div><div> <span><span>&lt;</span><span><span><span>property</span></span></span><span> </span><span><span><span>name</span></span></span><span>=</span><span><span><span>"trimStrings"</span></span></span><span> </span><span><span><span>value</span></span></span><span>=</span><span><span><span>"true"</span></span></span><span>/&gt;</span></span></div></div></li><li><div><divdata-line-number="48"></div></div><div><div> <span><span>&lt;!-- 建立的Model对象是否 不可改变 即生成的Model对象不会有 setter方法,只有构造方法 --&gt;</span></span></div></div></li><li><div><divdata-line-number="49"></div></div><div><div> <span><span>&lt;</span><span><span><span>property</span></span></span><span> </span><span><span><span>name</span></span></span><span>=</span><span><span><span>"immutable"</span></span></span><span> </span><span><span><span>value</span></span></span><span>=</span><span><span><span>"false"</span></span></span><span>/&gt;</span></span></div></div></li><li><div><divdata-line-number="50"></div></div><div><div> <span><span>&lt;/</span><span><span><span>javaModelGenerator</span></span></span><span>&gt;</span></span></div></div></li><li><div><divdata-line-number="51"></div></div><div><div> </div></div></li><li><div><divdata-line-number="52"></div></div><div><div> <span><span>&lt;!--mapper映射文件生成所在的目录 为每一个数据库的表生成对应的SqlMap文件 --&gt;</span></span></div></div></li><li><div><divdata-line-number="53"></div></div><div><div> <span><span>&lt;!--&lt;sqlMapGenerator targetPackage="mappers" targetProject=".\src\main\resources"&gt;--&gt;</span></span></div></div></li><li><div><divdata-line-number="54"></div></div><div><div> <span><span>&lt;</span><span><span><span>sqlMapGenerator</span></span></span><span> </span><span><span><span>targetPackage</span></span></span><span>=</span><span><span><span>"mappers"</span></span></span><span> </span><span><span><span>targetProject</span></span></span><span>=</span><span><span><span>"./src/main/resources"</span></span></span><span>&gt;</span></span></div></div></li><li><div><divdata-line-number="55"></div></div><div><div> <span><span>&lt;</span><span><span><span>property</span></span></span><span> </span><span><span><span>name</span></span></span><span>=</span><span><span><span>"enableSubPackages"</span></span></span><span> </span><span><span><span>value</span></span></span><span>=</span><span><span><span>"false"</span></span></span><span>/&gt;</span></span></div></div></li><li><div><divdata-line-number="56"></div></div><div><div> <span><span>&lt;/</span><span><span><span>sqlMapGenerator</span></span></span><span>&gt;</span></span></div></div></li><li><div><divdata-line-number="57"></div></div><div><div> </div></div></li><li><div><divdata-line-number="58"></div></div><div><div> <span><span><span>&lt;!-- 客户端代码,生成易于使用的针对Model对象和XML配置文件 的代码</span></span></span></div></div></li><li><div><divdata-line-number="59"></div></div><div><div><span> type="ANNOTATEDMAPPER",生成Java Model 和基于注解的Mapper对象</span></div></div></li><li><div><divdata-line-number="60"></div></div><div><div><span> type="MIXEDMAPPER",生成基于注解的Java Model 和相应的Mapper对象</span></div></div></li><li><div><divdata-line-number="61"></div></div><div><div><span> type="XMLMAPPER",生成SQLMap XML文件和独立的Mapper接口</span></div></div></li><li><div><divdata-line-number="62"></div></div><div><div><span> --&gt;</span></div></div></li><li><div><divdata-line-number="63"></div></div><div><div> </div></div></li><li><div><divdata-line-number="64"></div></div><div><div> <span><span>&lt;!-- targetPackage:mapper接口dao生成的位置 --&gt;</span></span></div></div></li><li><div><divdata-line-number="65"></div></div><div><div> <span><span>&lt;!--&lt;javaClientGenerator type="XMLMAPPER" targetPackage="com.mmall.dao" targetProject=".\src\main\java"&gt;--&gt;</span></span></div></div></li><li><div><divdata-line-number="66"></div></div><div><div> <span><span>&lt;</span><span><span><span>javaClientGenerator</span></span></span><span> </span><span><span><span>type</span></span></span><span>=</span><span><span><span>"XMLMAPPER"</span></span></span><span> </span><span><span><span>targetPackage</span></span></span><span>=</span><span><span><span>"com.mmall.dao"</span></span></span><span> </span><span><span><span>targetProject</span></span></span><span>=</span><span><span><span>"./src/main/java"</span></span></span><span>&gt;</span></span></div></div></li><li><div><divdata-line-number="67"></div></div><div><div> <span><span>&lt;!-- enableSubPackages:是否让schema作为包的后缀 --&gt;</span></span></div></div></li><li><div><divdata-line-number="68"></div></div><div><div> <span><span>&lt;</span><span><span><span>property</span></span></span><span> </span><span><span><span>name</span></span></span><span>=</span><span><span><span>"enableSubPackages"</span></span></span><span> </span><span><span><span>value</span></span></span><span>=</span><span><span><span>"false"</span></span></span><span> /&gt;</span></span></div></div></li><li><div><divdata-line-number="69"></div></div><div><div> <span><span>&lt;/</span><span><span><span>javaClientGenerator</span></span></span><span>&gt;</span></span></div></div></li><li><div><divdata-line-number="70"></div></div><div><div> </div></div></li><li><div><divdata-line-number="71"></div></div><div><div> </div></div></li><li><div><divdata-line-number="72"></div></div><div><div> <span><span>&lt;</span><span><span><span>table</span></span></span><span> </span><span><span><span>tableName</span></span></span><span>=</span><span><span><span>"mmall_shipping"</span></span></span><span> </span><span><span><span>domainObjectName</span></span></span><span>=</span><span><span><span>"Shipping"</span></span></span><span> </span><span><span><span>enableCountByExample</span></span></span><span>=</span><span><span><span>"false"</span></span></span><span> </span><span><span><span>enableUpdateByExample</span></span></span><span>=</span><span><span><span>"false"</span></span></span><span> </span><span><span><span>enableDeleteByExample</span></span></span><span>=</span><span><span><span>"false"</span></span></span><span> </span><span><span><span>enableSelectByExample</span></span></span><span>=</span><span><span><span>"false"</span></span></span><span> </span><span><span><span>selectByExampleQueryId</span></span></span><span>=</span><span><span><span>"false"</span></span></span><span>&gt;</span></span><span><span>&lt;/</span><span><span><span>table</span></span></span><span>&gt;</span></span></div></div></li><li><div><divdata-line-number="73"></div></div><div><div> <span><span>&lt;</span><span><span><span>table</span></span></span><span> </span><span><span><span>tableName</span></span></span><span>=</span><span><span><span>"mmall_cart"</span></span></span><span> </span><span><span><span>domainObjectName</span></span></span><span>=</span><span><span><span>"Cart"</span></span></span><span> </span><span><span><span>enableCountByExample</span></span></span><span>=</span><span><span><span>"false"</span></span></span><span> </span><span><span><span>enableUpdateByExample</span></span></span><span>=</span><span><span><span>"false"</span></span></span><span> </span><span><span><span>enableDeleteByExample</span></span></span><span>=</span><span><span><span>"false"</span></span></span><span> </span><span><span><span>enableSelectByExample</span></span></span><span>=</span><span><span><span>"false"</span></span></span><span> </span><span><span><span>selectByExampleQueryId</span></span></span><span>=</span><span><span><span>"false"</span></span></span><span>&gt;</span></span><span><span>&lt;/</span><span><span><span>table</span></span></span><span>&gt;</span></span></div></div></li><li><div><divdata-line-number="74"></div></div><div><div> <span><span>&lt;</span><span><span><span>table</span></span></span><span> </span><span><span><span>tableName</span></span></span><span>=</span><span><span><span>"mmall_cart_item"</span></span></span><span> </span><span><span><span>domainObjectName</span></span></span><span>=</span><span><span><span>"CartItem"</span></span></span><span> </span><span><span><span>enableCountByExample</span></span></span><span>=</span><span><span><span>"false"</span></span></span><span> </span><span><span><span>enableUpdateByExample</span></span></span><span>=</span><span><span><span>"false"</span></span></span><span> </span><span><span><span>enableDeleteByExample</span></span></span><span>=</span><span><span><span>"false"</span></span></span><span> </span><span><span><span>enableSelectByExample</span></span></span><span>=</span><span><span><span>"false"</span></span></span><span> </span><span><span><span>selectByExampleQueryId</span></span></span><span>=</span><span><span><span>"false"</span></span></span><span>&gt;</span></span><span><span>&lt;/</span><span><span><span>table</span></span></span><span>&gt;</span></span></div></div></li><li><div><divdata-line-number="75"></div></div><div><div> <span><span>&lt;</span><span><span><span>table</span></span></span><span> </span><span><span><span>tableName</span></span></span><span>=</span><span><span><span>"mmall_category"</span></span></span><span> </span><span><span><span>domainObjectName</span></span></span><span>=</span><span><span><span>"Category"</span></span></span><span> </span><span><span><span>enableCountByExample</span></span></span><span>=</span><span><span><span>"false"</span></span></span><span> </span><span><span><span>enableUpdateByExample</span></span></span><span>=</span><span><span><span>"false"</span></span></span><span> </span><span><span><span>enableDeleteByExample</span></span></span><span>=</span><span><span><span>"false"</span></span></span><span> </span><span><span><span>enableSelectByExample</span></span></span><span>=</span><span><span><span>"false"</span></span></span><span> </span><span><span><span>selectByExampleQueryId</span></span></span><span>=</span><span><span><span>"false"</span></span></span><span>&gt;</span></span><span><span>&lt;/</span><span><span><span>table</span></span></span><span>&gt;</span></span></div></div></li><li><div><divdata-line-number="76"></div></div><div><div> <span><span>&lt;</span><span><span><span>table</span></span></span><span> </span><span><span><span>tableName</span></span></span><span>=</span><span><span><span>"mmall_order"</span></span></span><span> </span><span><span><span>domainObjectName</span></span></span><span>=</span><span><span><span>"Order"</span></span></span><span> </span><span><span><span>enableCountByExample</span></span></span><span>=</span><span><span><span>"false"</span></span></span><span> </span><span><span><span>enableUpdateByExample</span></span></span><span>=</span><span><span><span>"false"</span></span></span><span> </span><span><span><span>enableDeleteByExample</span></span></span><span>=</span><span><span><span>"false"</span></span></span><span> </span><span><span><span>enableSelectByExample</span></span></span><span>=</span><span><span><span>"false"</span></span></span><span> </span><span><span><span>selectByExampleQueryId</span></span></span><span>=</span><span><span><span>"false"</span></span></span><span>&gt;</span></span><span><span>&lt;/</span><span><span><span>table</span></span></span><span>&gt;</span></span></div></div></li><li><div><divdata-line-number="77"></div></div><div><div> <span><span>&lt;</span><span><span><span>table</span></span></span><span> </span><span><span><span>tableName</span></span></span><span>=</span><span><span><span>"mmall_order_item"</span></span></span><span> </span><span><span><span>domainObjectName</span></span></span><span>=</span><span><span><span>"OrderItem"</span></span></span><span> </span><span><span><span>enableCountByExample</span></span></span><span>=</span><span><span><span>"false"</span></span></span><span> </span><span><span><span>enableUpdateByExample</span></span></span><span>=</span><span><span><span>"false"</span></span></span><span> </span><span><span><span>enableDeleteByExample</span></span></span><span>=</span><span><span><span>"false"</span></span></span><span> </span><span><span><span>enableSelectByExample</span></span></span><span>=</span><span><span><span>"false"</span></span></span><span> </span><span><span><span>selectByExampleQueryId</span></span></span><span>=</span><span><span><span>"false"</span></span></span><span>&gt;</span></span><span><span>&lt;/</span><span><span><span>table</span></span></span><span>&gt;</span></span></div></div></li><li><div><divdata-line-number="78"></div></div><div><div> <span><span>&lt;</span><span><span><span>table</span></span></span><span> </span><span><span><span>tableName</span></span></span><span>=</span><span><span><span>"mmall_pay_info"</span></span></span><span> </span><span><span><span>domainObjectName</span></span></span><span>=</span><span><span><span>"PayInfo"</span></span></span><span> </span><span><span><span>enableCountByExample</span></span></span><span>=</span><span><span><span>"false"</span></span></span><span> </span><span><span><span>enableUpdateByExample</span></span></span><span>=</span><span><span><span>"false"</span></span></span><span> </span><span><span><span>enableDeleteByExample</span></span></span><span>=</span><span><span><span>"false"</span></span></span><span> </span><span><span><span>enableSelectByExample</span></span></span><span>=</span><span><span><span>"false"</span></span></span><span> </span><span><span><span>selectByExampleQueryId</span></span></span><span>=</span><span><span><span>"false"</span></span></span><span>&gt;</span></span><span><span>&lt;/</span><span><span><span>table</span></span></span><span>&gt;</span></span></div></div></li><li><div><divdata-line-number="79"></div></div><div><div> <span><span>&lt;</span><span><span><span>table</span></span></span><span> </span><span><span><span>tableName</span></span></span><span>=</span><span><span><span>"mmall_product"</span></span></span><span> </span><span><span><span>domainObjectName</span></span></span><span>=</span><span><span><span>"Product"</span></span></span><span> </span><span><span><span>enableCountByExample</span></span></span><span>=</span><span><span><span>"false"</span></span></span><span> </span><span><span><span>enableUpdateByExample</span></span></span><span>=</span><span><span><span>"false"</span></span></span><span> </span><span><span><span>enableDeleteByExample</span></span></span><span>=</span><span><span><span>"false"</span></span></span><span> </span><span><span><span>enableSelectByExample</span></span></span><span>=</span><span><span><span>"false"</span></span></span><span> </span><span><span><span>selectByExampleQueryId</span></span></span><span>=</span><span><span><span>"false"</span></span></span><span>&gt;</span></span></div></div></li><li><div><divdata-line-number="80"></div></div><div><div> <span><span>&lt;</span><span><span><span>columnOverride</span></span></span><span> </span><span><span><span>column</span></span></span><span>=</span><span><span><span>"detail"</span></span></span><span> </span><span><span><span>jdbcType</span></span></span><span>=</span><span><span><span>"VARCHAR"</span></span></span><span> /&gt;</span></span></div></div></li><li><div><divdata-line-number="81"></div></div><div><div> <span><span>&lt;</span><span><span><span>columnOverride</span></span></span><span> </span><span><span><span>column</span></span></span><span>=</span><span><span><span>"sub_images"</span></span></span><span> </span><span><span><span>jdbcType</span></span></span><span>=</span><span><span><span>"VARCHAR"</span></span></span><span> /&gt;</span></span></div></div></li><li><div><divdata-line-number="82"></div></div><div><div> <span><span>&lt;/</span><span><span><span>table</span></span></span><span>&gt;</span></span></div></div></li><li><div><divdata-line-number="83"></div></div><div><div> <span><span>&lt;</span><span><span><span>table</span></span></span><span> </span><span><span><span>tableName</span></span></span><span>=</span><span><span><span>"mmall_user"</span></span></span><span> </span><span><span><span>domainObjectName</span></span></span><span>=</span><span><span><span>"User"</span></span></span><span> </span><span><span><span>enableCountByExample</span></span></span><span>=</span><span><span><span>"false"</span></span></span><span> </span><span><span><span>enableUpdateByExample</span></span></span><span>=</span><span><span><span>"false"</span></span></span><span> </span><span><span><span>enableDeleteByExample</span></span></span><span>=</span><span><span><span>"false"</span></span></span><span> </span><span><span><span>enableSelectByExample</span></span></span><span>=</span><span><span><span>"false"</span></span></span><span> </span><span><span><span>selectByExampleQueryId</span></span></span><span>=</span><span><span><span>"false"</span></span></span><span>&gt;</span></span><span><span>&lt;/</span><span><span><span>table</span></span></span><span>&gt;</span></span></div></div></li><li><div><divdata-line-number="84"></div></div><div><div> </div></div></li><li><div><divdata-line-number="85"></div></div><div><div> </div></div></li><li><div><divdata-line-number="86"></div></div><div><div> <span><span>&lt;!-- mybatis插件的搭建 --&gt;</span></span></div></div></li><li><div><divdata-line-number="87"></div></div><div><div> <span><span>&lt;/</span><span><span><span>context</span></span></span><span>&gt;</span></span></div></div></li><li><div><divdata-line-number="88"></div></div><div><div><span><span>&lt;/</span><span><span><span>generatorConfiguration</span></span></span><span>&gt;</span></span></div></div></li></ol></code><divdata-title="复制"></div></pre><h4 id="2新建datasourceproperties文件配置数据库连接信息这里配置本地数据库"> <a name="t3"target="_blank"></a>2.新建datasource.properties文件,配置数据库连接信息(这里配置本地数据库)</h4> <p> <img src="https://img-blog.csdn.net/20170501211807876?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvdTAxMjg0MTIwOQ==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast" alt="这里写图片描述" title=""></p> <prename="code" onclick="hljs.copyCode(event)"><code><ol><li><div><divdata-line-number="1"></div></div><div><div>db.driverLocation=<span><span>F</span></span><span><span>:</span>/IdeaProjects/mmall/src/main/tool/mysql-connector-java-</span><span><span>5.1</span></span>.<span><span>6</span></span>-bin.jar</div></div></li><li><div><divdata-line-number="2"></div></div><div><div>db.driverClassName=com.mysql.jdbc.<span>Driver</span></div></div></li><li><div><divdata-line-number="3"></div></div><div><div>db.url=<span><span>jdbc:</span></span><span><span>mysql:</span></span>/<span><span>/localhost:3306/mmall</span></span>?useUnicode=<span><span>true</span></span>&amp;characterEncoding=<span>UTF</span>-<span><span>8</span></span></div></div></li><li><div><divdata-line-number="4"></div></div><div><div>db.username=root</div></div></li><li><div><divdata-line-number="5"></div></div><div><div>db.password=<span><span>940724</span></span></div></div></li></ol></code><divdata-title="复制"></div></pre><p> 配置完之后,就点击idea的左下角有个小按钮,把右侧的maven project按钮调出来(右侧已有的请忽略)&nbsp;<br><img src="https://img-blog.csdn.net/20170501212050752?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvdTAxMjg0MTIwOQ==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast" alt="这里写图片描述" title="">&nbsp;<br> 点击maven project,并选定插件加载(双击就行)&nbsp;<br><img src="https://img-blog.csdn.net/20170501212307103?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvdTAxMjg0MTIwOQ==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast" alt="这里写图片描述" title="">&nbsp;<br> 下方的控制台,出现build success就是成功了,就会发现dao的包和pojo包会生成好了接口和数据对象实体类,以及生成一个mapper文件夹,里面存储着数据库里各个实体的xml文件</p> <p> 注意mapper里生成的文件夹,我在创建的时候把时间戳给加里了,如果要完美的用的话,需要把时间戳优化一下</p> <h4 id="把insert标签下的createtimejdbctypetimestamp和updatetimejdbctypetimestamp改成now"> <a name="t4"target="_blank"></a>把insert标签下的#{createTime,jdbcType=TIMESTAMP}和#{updateTime,jdbcType=TIMESTAMP}改成now()</h4> <h4 id="把update标签下的updatetimejdbctypetimestamp改成now"> <a name="t5"target="_blank"></a>把update标签下的#{updateTime,jdbcType=TIMESTAMP}改成now()</h4> <p> 这个now()方法是数据库自带的函数,表示现在的时间</p> <hr><h2 id="二mybatis-plugin"><a name="t2"></a> <a name="t6"target="_blank"></a>二、mybatis-plugin</h2> <p> 我用的是idea15,如果其他版本不好用的,可以换成idea 15&nbsp;<br> 这是一个能够追踪dao接口和mapper文件里xml的一个插件</p> <ul><li> <p> 提供Mapper接口与配置文件中对应SQL的导航</p> </li><li> <p> 提供Mapper接口与配置文件中对应SQL的导航</p> </li><li> <p> 编辑XML文件时自动补全</p> </li><li> <p> 根据Mapper接口, 使用快捷键生成xml文件及SQL标签</p> </li><li> <p> ResultMap中的property支持自动补全,支持级联(属性A.属性B.属性C)</p> </li><li> <p> 快捷键生成@Param注解</p> </li><li> <p> XML中编辑SQL时, 括号自动补全</p> </li><li> <p> XML中编辑SQL时, 支持参数自动补全(基于@Param注解识别参数)</p> </li><li> <p> 自动检查Mapper XML文件中ID冲突</p> </li><li> <p> 自动检查Mapper XML文件中错误的属性值</p> </li><li> <p> 支持<a href="https://www.baidu.com/s?wd=Find&amp;tn=24004469_oem_dg&amp;rsv_dl=gh_pl_sl_csd" target="_blank">Find</a> Usage</p> </li><li> <p> 支持重构从命名</p> </li><li> <p> 支持别名</p> </li><li> <p> 自动生成ResultMap属性</p> </li><li> <p> 快捷键: Option + Enter(<a href="https://www.baidu.com/s?wd=Mac&amp;tn=24004469_oem_dg&amp;rsv_dl=gh_pl_sl_csd" target="_blank">Mac</a>) | Alt + Enter(Windows)(直接跳转到mapper中的sql语句的快捷键是:“Ctrl+ALT+B”)</p> </li></ul><h4 id="效果点击dao可以追踪到xml同理点击xml的sql右边小箭头可以追踪到dao方法"> <a name="t7"target="_blank"></a>效果:点击dao可以追踪到xml,,同理点击xml的sql右边小箭头,可以追踪到dao方法</h4> <p> <img src="https://img-blog.csdn.net/20170501230749182?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvdTAxMjg0MTIwOQ==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast" alt="这里写图片描述" title=""></p> <h4 id="1安装插件"> <a name="t8"target="_blank"></a>1、安装插件:</h4> <p> <img src="https://img-blog.csdn.net/20170501214736063?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvdTAxMjg0MTIwOQ==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast" alt="这里写图片描述" title="">&nbsp;<br> 然后重启下idea</p> <h4 id="2mybatis-plugin插件破解"> <a name="t9"target="_blank"></a>2.mybatis-plugin插件破解</h4> <p> 到这个网址去&nbsp;<br><a href="https://github.com/myoss/profile/tree/master/idea/plugin/MybatisPlugin" rel="nofollow"target="_blank">https://github.com/myoss/profile/tree/master/idea/plugin/MybatisPlugin</a>&nbsp;<br> 你看到了一个Git仓库,先clone下来,不会clone的down下来,记住路径&nbsp;<br> 接下来,你看到一堆版本,选择你安装的mybatis_plugin版本号,比如我的是IDEA15版本的,我安装版本就是v2.64,进入v2.64你会看到一个com文件夹,牢牢记住这个文件夹有大作用</p> <p> <img src="https://img-blog.csdn.net/20170501222135388?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvdTAxMjg0MTIwOQ==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEa" alt="这里写图片描述" title=""></p> <p> 点击如图所示的右上角的fork,登录自己的github,登录之后,会发现右边有个绿色的Dowload图标,点击那个就可以下载别人的项目了&nbsp;<br><img src="https://img-blog.csdn.net/20170501224229186?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvdTAxMjg0MTIwOQ==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast" alt="这里写图片描述" title=""></p> <h3 id="1-windows破解"><a name="t3"></a> <a name="t10"target="_blank"></a>(1) windows破解</h3> <p> 首先你要找到mybatis_plus.jar的位置,位置一般在这里&nbsp;<br> C:\Users\youname(你自己的文档).IntelliJIdea\config\plugins\mybatis_plus\lib&nbsp;<br> 用winRAR打开&nbsp;<br><img src="https://img-blog.csdn.net/20170501225736536?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvdTAxMjg0MTIwOQ==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast" alt="这里写图片描述" title="">&nbsp;<br> 将下载好的破解,与plugin插件压缩包中的文件更换,拖入压缩包,更换就行&nbsp;<br><img src="https://img-blog.csdn.net/20170501225438518?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvdTAxMjg0MTIwOQ==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast" alt="这里写图片描述" title=""></p> <h3 id="重启你的idea完毕破解搞定"><a name="t4"></a> <a name="t11"target="_blank"></a>重启你的IDEA,完毕,破解搞定</h3> <h3 id="2mac破解"><a name="t5"></a> <a name="t12"target="_blank"></a>(2)mac破解</h3> <p> 使用find命令在你的用户目录下查找mybatis_plus.jar这个文件</p> <prename="code" onclick="hljs.copyCode(event)"><code><span>find</span> <span>~ -name</span> <span>"mybatis_plus.jar"</span></code><divdata-title="复制"></div></pre><p> OK,拿到一个地址,然后进去</p> <prename="code" onclick="hljs.copyCode(event)"><code><span>cd</span> /Users/XXXXX/Library/Application Support/IntelliJIdea15/mybatis_plus/lib</code><divdata-title="复制"></div></pre><p> 看到了2个文件</p> <prename="code" onclick="hljs.copyCode(event)"><code><ol><li><div><divdata-line-number="1"></div></div><div><div><span>#创建一个文件夹</span></div></div></li><li><div><divdata-line-number="2"></div></div><div><div>mkdir m</div></div></li><li><div><divdata-line-number="3"></div></div><div><div><span>#进去 </span></div></div></li><li><div><divdata-line-number="4"></div></div><div><div>cd m</div></div></li><li><div><divdata-line-number="5"></div></div><div><div><span>#拷贝到m文件夹中 </span></div></div></li><li><div><divdata-line-number="6"></div></div><div><div><span>cp</span> ../mybatis_plus<span>.jar</span> .</div></div></li><li><div><divdata-line-number="7"></div></div><div><div><span>#解压jar包</span></div></div></li><li><div><divdata-line-number="8"></div></div><div><div>jar xf mybatis_plus<span>.jar</span> </div></div></li><li><div><divdata-line-number="9"></div></div><div><div><span>#复制com文件夹到这里 路径根据你情况而定,版本号也根据你情况而定</span></div></div></li><li><div><divdata-line-number="10"></div></div><div><div><span>cp</span> -r ~/Workspace/github/mybatis_plus/idea/plugin/MybatisPlugin/v2<span>.7</span>\~v2<span>.83</span>/<span>com</span> .</div></div></li><li><div><divdata-line-number="11"></div></div><div><div><span>#重新打为jar包</span></div></div></li><li><div><divdata-line-number="12"></div></div><div><div>jar cf mybatis_plus<span>.jar</span> *</div></div></li><li><div><divdata-line-number="13"></div></div><div><div><span>#复制到m的上层目录</span></div></div></li><li><div><divdata-line-number="14"></div></div><div><div><span>cp</span> mybatis_plus<span>.jar</span> ../</div></div></li></ol></code><divdata-title="复制"></div></pre><h3 id="重启你的idea完毕破解搞定-1"><a name="t6"></a> <a name="t13"target="_blank"></a>重启你的IDEA,完毕,破解搞定</h3> <hr><h2 id="三mybatis-pagehelper"><a name="t7"></a> <a name="t14"target="_blank"></a>三、Mybatis-pageHelper</h2> <p> 是一个开源的分页插件(如下网址有插件的全介绍)&nbsp;<br><a href="https://github.com/pagehelper/Mybatis-PageHelper" rel="nofollow"target="_blank">https://github.com/pagehelper/Mybatis-PageHelper</a>&nbsp;<br> 它的原理,是通过spring的AOP来实现的,这个插件能在执行sql的时候,把相关的数据再执行一次</p> <h4 id="1pomxml里添加依赖"> <a name="t15"target="_blank"></a>1.pom.xml里添加依赖</h4> <prename="code" onclick="hljs.copyCode(event)"><code><ol><li><div><divdata-line-number="1"></div></div><div><div><span><span>&lt;</span><span><span><span>dependency</span></span></span><span>&gt;</span></span></div></div></li><li><div><divdata-line-number="2"></div></div><div><div> <span><span>&lt;</span><span><span><span>groupId</span></span></span><span>&gt;</span></span>com.github.pagehelper<span><span>&lt;/</span><span><span><span>groupId</span></span></span><span>&gt;</span></span></div></div></li><li><div><divdata-line-number="3"></div></div><div><div> <span><span>&lt;</span><span><span><span>artifactId</span></span></span><span>&gt;</span></span>pagehelper<span><span>&lt;/</span><span><span><span>artifactId</span></span></span><span>&gt;</span></span></div></div></li><li><div><divdata-line-number="4"></div></div><div><div> <span><span>&lt;</span><span><span><span>version</span></span></span><span>&gt;</span></span>4.1.0<span><span>&lt;/</span><span><span><span>version</span></span></span><span>&gt;</span></span></div></div></li><li><div><divdata-line-number="5"></div></div><div><div> <span><span>&lt;/</span><span><span><span>dependency</span></span></span><span>&gt;</span></span></div></div></li><li><div><divdata-line-number="6"></div></div><div><div> </div></div></li><li><div><divdata-line-number="7"></div></div><div><div> <span><span>&lt;</span><span><span><span>dependency</span></span></span><span>&gt;</span></span></div></div></li><li><div><divdata-line-number="8"></div></div><div><div> <span><span>&lt;</span><span><span><span>groupId</span></span></span><span>&gt;</span></span>com.github.miemiedev<span><span>&lt;/</span><span><span><span>groupId</span></span></span><span>&gt;</span></span></div></div></li><li><div><divdata-line-number="9"></div></div><div><div> <span><span>&lt;</span><span><span><span>artifactId</span></span></span><span>&gt;</span></span>mybatis-paginator<span><span>&lt;/</span><span><span><span>artifactId</span></span></span><span>&gt;</span></span></div></div></li><li><div><divdata-line-number="10"></div></div><div><div> <span><span>&lt;</span><span><span><span>version</span></span></span><span>&gt;</span></span>1.2.17<span><span>&lt;/</span><span><span><span>version</span></span></span><span>&gt;</span></span></div></div></li><li><div><divdata-line-number="11"></div></div><div><div> <span><span>&lt;/</span><span><span><span>dependency</span></span></span><span>&gt;</span></span></div></div></li><li><div><divdata-line-number="12"></div></div><div><div> </div></div></li><li><div><divdata-line-number="13"></div></div><div><div> <span><span>&lt;</span><span><span><span>dependency</span></span></span><span>&gt;</span></span></div></div></li><li><div><divdata-line-number="14"></div></div><div><div> <span><span>&lt;</span><span><span><span>groupId</span></span></span><span>&gt;</span></span>com.github.jsqlparser<span><span>&lt;/</span><span><span><span>groupId</span></span></span><span>&gt;</span></span></div></div></li><li><div><divdata-line-number="15"></div></div><div><div> <span><span>&lt;</span><span><span><span>artifactId</span></span></span><span>&gt;</span></span>jsqlparser<span><span>&lt;/</span><span><span><span>artifactId</span></span></span><span>&gt;</span></span></div></div></li><li><div><divdata-line-number="16"></div></div><div><div> <span><span>&lt;</span><span><span><span>version</span></span></span><span>&gt;</span></span>0.9.4<span><span>&lt;/</span><span><span><span>version</span></span></span><span>&gt;</span></span></div></div></li><li><div><divdata-line-number="17"></div></div><div><div> <span><span>&lt;/</span><span><span><span>dependency</span></span></span><span>&gt;</span></span></div></div></li></ol></code><divdata-title="复制"></div></pre><h4 id="2在spring配置文件里添加配置"> <a name="t16"target="_blank"></a>2.在spring配置文件里添加配置</h4> <prename="code" onclick="hljs.copyCode(event)"><code><ol><li><div><divdata-line-number="1"></div></div><div><div> <span><span>&lt;</span><span><span><span>bean</span></span></span><span> </span><span><span><span>id</span></span></span><span>=</span><span><span><span>"sqlSessionFactory"</span></span></span><span> </span><span><span><span>class</span></span></span><span>=</span><span><span><span>"org.mybatis.spring.SqlSessionFactoryBean"</span></span></span><span>&gt;</span></span></div></div></li><li><div><divdata-line-number="2"></div></div><div><div> <span><span>&lt;</span><span><span><span>property</span></span></span><span> </span><span><span><span>name</span></span></span><span>=</span><span><span><span>"dataSource"</span></span></span><span> </span><span><span><span>ref</span></span></span><span>=</span><span><span><span>"dataSource"</span></span></span><span>/&gt;</span></span></div></div></li><li><div><divdata-line-number="3"></div></div><div><div> <span><span>&lt;</span><span><span><span>property</span></span></span><span> </span><span><span><span>name</span></span></span><span>=</span><span><span><span>"mapperLocations"</span></span></span><span> </span><span><span><span>value</span></span></span><span>=</span><span><span><span>"classpath*:mappers/*Mapper.xml"</span></span></span><span>/&gt;</span></span></div></div></li><li><div><divdata-line-number="4"></div></div><div><div> </div></div></li><li><div><divdata-line-number="5"></div></div><div><div> <span><span>&lt;!-- 分页插件 --&gt;</span></span></div></div></li><li><div><divdata-line-number="6"></div></div><div><div> <span><span>&lt;</span><span><span><span>property</span></span></span><span> </span><span><span><span>name</span></span></span><span>=</span><span><span><span>"plugins"</span></span></span><span>&gt;</span></span></div></div></li><li><div><divdata-line-number="7"></div></div><div><div> <span><span>&lt;</span><span><span><span>array</span></span></span><span>&gt;</span></span></div></div></li><li><div><divdata-line-number="8"></div></div><div><div> <span><span>&lt;</span><span><span><span>bean</span></span></span><span> </span><span><span><span>class</span></span></span><span>=</span><span><span><span>"com.github.pagehelper.PageHelper"</span></span></span><span>&gt;</span></span></div></div></li><li><div><divdata-line-number="9"></div></div><div><div> <span><span>&lt;</span><span><span><span>property</span></span></span><span> </span><span><span><span>name</span></span></span><span>=</span><span><span><span>"properties"</span></span></span><span>&gt;</span></span></div></div></li><li><div><divdata-line-number="10"></div></div><div><div> <span><span>&lt;</span><span><span><span>value</span></span></span><span>&gt;</span></span></div></div></li><li><div><divdata-line-number="11"></div></div><div><div> dialect=mysql</div></div></li><li><div><divdata-line-number="12"></div></div><div><div> <span><span>&lt;/</span><span><span><span>value</span></span></span><span>&gt;</span></span></div></div></li><li><div><divdata-line-number="13"></div></div><div><div> <span><span>&lt;/</span><span><span><span>property</span></span></span><span>&gt;</span></span></div></div></li><li><div><divdata-line-number="14"></div></div><div><div> <span><span>&lt;/</span><span><span><span>bean</span></span></span><span>&gt;</span></span></div></div></li><li><div><divdata-line-number="15"></div></div><div><div> <span><span>&lt;/</span><span><span><span>array</span></span></span><span>&gt;</span></span></div></div></li><li><div><divdata-line-number="16"></div></div><div><div> <span><span>&lt;/</span><span><span><span>property</span></span></span><span>&gt;</span></span></div></div></li><li><div><divdata-line-number="17"></div></div><div><div> </div></div></li><li><div><divdata-line-number="18"></div></div><div><div> <span><span>&lt;/</span><span><span><span>bean</span></span></span><span>&gt;</span></span></div></div></li></ol></code><divdata-title="复制"></div></pre><p> 注意不同数据库的方言的使用</p> <h2 id="这样三剑客就都配置ok了"><a name="t8"></a> <a name="t17"target="_blank"></a>这样三剑客就都配置OK了</h2> </div>

Mybatis - 学习笔记(N)mybatis-generator 生成 DAO、Mapper、entity

Mybatis - 学习笔记(N)mybatis-generator 生成 DAO、Mapper、entity

1、mybatis-generator 生成 DAO、Mapper、entity

所需环境:jdk

所需 jar 包:mybatis-generator-core-1.3.5.jar、MySQL-connector-java-5.1.34.jar

:新建一个文件夹 generator(这里我是在 E 盘新建的 E:\generator)用来存放工具 jar 包和配置文件

:将准备好的两个 jar 包直接放在 generator 文件夹下面

:在新建的文件夹下面新建一个文件,命名:generator.xml

<?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">  
<generatorConfiguration>  
    <!-- 数据库驱动包位置 -->  
    <classPathEntry location="E:\generator\mysql-connector-java-5.1.34.jar" />   
    <!-- <classPathEntry location="C:\oracle\product\10.2.0\db_1\jdbc\lib\ojdbc14.jar" />-->  
    <context id="DB2Tables" targetRuntime="MyBatis3">  
        <commentGenerator>  
            <property name="suppressAllComments" value="true" />  
        </commentGenerator>  
        <!-- 数据库链接URL、用户名、密码 -->  
        <jdbcConnection driverClass="com.mysql.jdbc.Driver" connectionURL="jdbc:mysql://localhost:3306/bruce_test?characterEncoding=utf8" userId="root" password="123456">   
        </jdbcConnection> 

        <javaTypeResolver>  
            <property name="forceBigDecimals" value="false" />  
        </javaTypeResolver>  
        <!-- 生成模型的包名和位置 -->  
        <javaModelGenerator targetPackage="andy.model" targetProject="E:\generator\src">  
            <property name="enableSubPackages" value="true" />  
            <property name="trimStrings" value="true" />  
        </javaModelGenerator>  
        <!-- 生成的映射文件包名和位置 -->  
        <sqlMapGenerator targetPackage="andy.mapping" targetProject="E:\generator\src">  
            <property name="enableSubPackages" value="true" />  
        </sqlMapGenerator>  
        <!-- 生成DAO的包名和位置 -->  
        <javaClientGenerator type="XMLMAPPER" targetPackage="andy.dao" targetProject="E:\generator\src">
            <property name="enableSubPackages" value="true" />  
        </javaClientGenerator>  
        <!-- 多个表直接复制下面的,更改tableName和domainObjectName就可以-->  
        <table tableName="bruce_userinfor" domainObjectName="Userinfor" enableCountByExample="false" enableUpdateByExample="false" enableDeleteByExample="false" enableSelectByExample="false" selectByExampleQueryId="false" />
    </context>  
</generatorConfiguration>

四 :打开 cmd 命令提示符,进入到 E:\generator,输入命令:java -jar mybatis-generator-core-1.3.5.jar -configfile generator.xml -overwrite

2、mapper 中传入多个参数

  DAO 层(不传入的参数不要使用 @Param 注解):

package com.login.dao;

import org.apache.ibatis.annotations.Param;

import com.login.entity.User;

public interface IUserMapper {
    
  User getUserByUsername(@Param("username") String username,
@Param("password") String password); }

  mapper 层:

<?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">

<mapper namespace="com.login.dao.IUserMapper">
  
  <select id="getUserByUsername" parameterType="map"  resultType="com.login.entity.User">
      SELECT * FROM user WHERE username = #{username} and password= #{password}
  </select>
</mapper>

 

我们今天的关于mybatis 学习笔记二:mybatis SQL注入问题的分享就到这里,谢谢您的阅读,如果想了解更多关于java-mybaits-015-mybatis逆向工程最佳实践【基础mybatis-generator、tk.mybatis、mubatis-plus】、JavaEE--Mybatis 学习笔记(一)--Mybatis 简介、Mabatis三剑客分别是:mybatis-generator、mybatis-plugin、mybatis-pagehelper、Mybatis - 学习笔记(N)mybatis-generator 生成 DAO、Mapper、entity的相关信息,可以在本站进行搜索。

本文标签: