当前位置: 首页 > 工具软件 > sql-generator > 使用案例 >

mybatis简单教程笔记 基本配置 动态sql Generator插件

锺离昂然
2023-12-01

Mybatis

概述

什么是MyBatis

  • 一款优秀的持久层框架
  • 支持定制化sql,存储过程一级高级映射
  • 避免了几乎所有jdbc代码和手动设置参数以及获取结果集
  • 可以使用简单的xml或注解来配置和映射原生类型,接口和java的pojo为数据库中的记录
  • 本是apache的开源项目ibatis 2010年迁移到了google code 改名为mybatis
  • 2013年迁移到github

持久化

  • 持久化是将程序数据在持久状态和瞬时状态间转换的机制。通俗的讲,就是瞬时数据(比如内存中的数据,是不能永久保存的)持久化为持久数据(比如持久化至数据库中,能够长久保存)。

优点

  • 简单易学
  • 灵活
  • sql和代码的分离,提高了可维护性
  • 提供映射标签,支持兑现与数据库的orm字段关系映射
  • 提供对象关系映射标签,支持兑现关系组建维护
  • 提供xml标签,支持编写动态sql

Config

依赖

<!--mybatis-->
<dependency>
    <groupId>org.mybatis</groupId>
    <artifactId>mybatis</artifactId>
    <version>3.5.6</version>
</dependency>

环境配置

<!--可以配置多套环境 用default使用-->
<environments default="development">
    <environment id="development">
        <!--事务管理-->
        <transactionManager type="JDBC"/>
        <dataSource type="POOLED">
            <property name="driver" value="${driver}"/>
            <property name="url" value="${url}"/>
            <property name="username" value="${username}"/>
            <property name="password" value="${password}"/>
        </dataSource>
    </environment>
</environments>

引入外部配置文件

<properties resource="db.properties"/>

别名

方便mapper.xml中使用

还可以使用注解@Alias("")

<typeAliases>
    <typeAlias type="cn.lazy.pojo.User" alias="User"/>
    <package name="cn.lazy.pojo"/>
</typeAliases>

映射

将接口与mapper.xml联系起来

<mappers>
	<mapper resource=""/>
    <mapper url=""/>
    <mapper class=""/>
    <package name=""/>
</mappers>

日志

log4j.properties文件spring会自动加载

<settings>
    <!--标准日志工厂-->
    <setting name="logImpl" value="STDOUT_LOGGING"/>
    <!--log4j日志-->
    <!--<setting name="logImpl" value="LOG4J"/>-->
</settings>

log4j.properties

#将等级为DEBUG日志信息输出到console和file这两个目的地,console和file的定义在下面
log4j.rootLogger=debug,console,file
#console输出相关设置
log4j.appender.console=org.apache.log4j.ConsoleAppender
log4j.appender.console.Target=System.out
log4j.appender.console.Threshold=DEBUG
log4j.appender.console.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern= [%c]-%m%n

#文件输出的相关设置
log4j.appender.file=org.apache.log4j.RollingFileAppender
log4j.appender.file.File=./log/lazy.log
log4j.appender.file.MaxFileSize=10MB
log4j.appender.file.Threshold=DEBUG
log4j.appender.file.layout=org.apache.log4j.PatternLayout
log4j.appender.file.layout.ConversionPattern=[%p][%d{yy-MM-dd}][%c]%m%n

#日志输出级别
log4j.logger.org.mybatis=DEBUG
log4j.logger.java.sql=DEBUG
log4j.logger.java.sql.Statement=DEBUG
log4j.logger.java.sql.ResultSet=DEBUG
log4j.logger.java.sql.PreparedStatement=DEBUG

Mapper

增删改查

最基本的例子

<select id="getUserById" parameterType="int" resultType="User">
    select *
    from user
    where id = #{id}
</select>

<!--对象中的属性,可以直接取出来 名字要一致-->
<insert id="add" parameterType="User">
    insert into user
    values (#{id}, #{name}, #{password})
</insert>

<update id="updateById" parameterType="User">
    update user
    set name=#{name},
    password=#{password}
    where id = #{id}
</update>

<delete id="deleteById" parameterType="int">
    delete
    from user
    where id = #{id}
</delete>

结果集映射

<!--结果集映射 用于解决名字不一致 一样的可以不用写-->
<resultMap id="userMap" type="User">
    <result column="id" property="id"/>
    <result column="name" property="name"/>
    <result column="password" property="pwd"/>
</resultMap>

<!--查询语句-->
<select id="getUserList" resultMap="userMap">
    select *
    from user
</select>

一对多

<select id="getTeacher" resultMap="map">
	select s.id sid, s.name sname, t.id tid, t.name tname
    from student s,
         teacher t
    where s.tid = t.id and t.id = 1;
</select>

<resultMap id="map" type="Teacher">
	<result property="id" column="tid"/>
    <result property="name" column="tn"/>
    <collection property="student" ofType="Student">
    	<result property="id" column="sid"/>
        <result property="name" column="sn"/>
    </collection>
</resultMap>

多对一

方法一

<select id="getStudent" resultMap="map">
select * from student
</select>

<resultMap id="map" type="Student">
	<result property="id" column="id"/>
    <result property="name" column="name"/>
    <association property="teacher" column="tid" javaType="Teacher" select="getTeacher"/>
</resultMap>

<select id="getTeacher" resultType="Teacher">
	select * from teacher
</select>

方法二 推荐使用

<select id="getStudent" resultMap="map">
	select s.id sid,s.name sn ,t.id tid ,t.name tn 
    from student s,teacher t 
    where s.tid = t.id
</select>

<resultMap id="map" type="Student">
	<result property="id" column="sid"/>
    <result property="name" column="sn"/>
    <association property="teacher" javaType="Teacher">
    	<result property="id" column="tid"/>
        <result property="name" column="tn"/>
    </association>
</resultMap>

动态sql语句

<if test=""></if>

<choose>
	<when test=""></when>
    <otherwise></otherwise>
</choose>

<!--可以自动过滤第一个 AND 或者 OR-->
<where></where>

<!--prefixOverrides 与 suffixOverrides 是删除第一个 最后一个连接符-->
<trim prefix="WHERE" prefixOverrides="AND |OR ">
	<if test="id!=null">AND t.id=#{id}</if>
    <if test="name!=null">OR t.name=#{name}</if>
</trim>
<trim prefix="set" suffixOverrides=",">
	<if test="id!=null">t.id=#{id},</if>
</trim>

<!--可以引用其他文件的sql 引入需要加 namespace-->
<sql id="sql1"></sql>
<include refid="sql1"></include>

注解

//别名 写在类上面
@Alias("")
//sql语句 代替mapper.xml 建议简单sql使用注解
@Select("") 
@Insert("")
@Delete("")
@Update("")
//写在方法的每一个参数前 用于向sql语句对应传值.
@Param("")

插件

Generator

概述

MyBatis Generator,简称MBG

它只需要很少量的简单配置,就可以完成大量的表到Java对象的生成工作,拥有零出错和速度快的优点

生成
  • Model实体文件,一个数据库表对应生成一个 Model 实体;
  • Mapper 接口文件,数据数操作方法都在此接口中定义;
  • Mapper XML配置文件

依赖

<dependency>
    <groupId>org.mybatis.generator</groupId>
    <artifactId>mybatis-generator-core</artifactId>
    <version>1.3.6</version>
</dependency>

<!--mybatis generator-->
<plugins>
    <plugin>
        <groupId>org.mybatis.generator</groupId>
        <artifactId>mybatis-generator-maven-plugin</artifactId>
        <version>1.4.0</version>
        <configuration>
            <verbose>true</verbose>
            <overwrite>true</overwrite>
        </configuration>
        <executions>
            <execution>
                <id>Generate MyBatis Artifacts</id>
                <goals>
                    <goal>generate</goal>
                </goals>
            </execution>
        </executions>
        <dependencies>
            <dependency>
                <groupId>org.mybatis.generator</groupId>
                <artifactId>mybatis-generator-core</artifactId>
                <version>1.4.0</version>
            </dependency>
            <dependency>
                <groupId>mysql</groupId>
                <artifactId>mysql-connector-java</artifactId>
                <version>8.0.23</version>
            </dependency>
        </dependencies>
    </plugin>
</plugins>

配置

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>

    <properties resource="db.properties"/>
    
    <!--<classPathEntry location="mysql-connector-java-8.0.23.jar"/>-->

    <context id="simple" targetRuntime="MyBatis3Simple">

        <commentGenerator>
            <property name="suppressDate" value="true"/>
            <property name="suppressAllComments" value="true"/>
        </commentGenerator>

        <!--数据库链接-->
        <jdbcConnection driverClass="${db.driver}"
                        connectionURL="${db.url}"
                        userId="${db.username}"
                        password="${db.password}">
            <property name="nullCatalogMeansCurrent" value="true"/>
        </jdbcConnection>

        <!--是否强制DECIMAL和NUMERIC类型的字段转换为Java类型的java.math.BigDecimal-->
        <javaTypeResolver>
            <property name="forceBigDecimals" value="false"/>
        </javaTypeResolver>

        <!--实体类生成配置-->
        <javaModelGenerator 
                targetPackage="com.lazy.lazyshop.pojo" 
                targetProject="src/main/java">
            <property name="enableSubPackage" value="true"/>
            <property name="trimStrings" value="true"/>
        </javaModelGenerator>

        <!--Mapper生成配置-->
        <sqlMapGenerator 
                targetPackage="com.lazy.lazyshop.dao"
                targetProject="src/main/java">
            <property name="enableSubPackage" value="true"/>
        </sqlMapGenerator>

        <!--Dao生成配置-->
        <javaClientGenerator
                targetPackage="com.lazy.lazyshop.dao"
                targetProject="src/main/java"
                type="XMLMAPPER">
            <property name="enableSubPackage" value="true"/>
        </javaClientGenerator>
        
        <!--重命名 % 所有的文件名-->
        <table tableName="%"
               enableCountByExample="false"
               enableUpdateByExample="false"
               enableDeleteByExample="false"
               enableSelectByExample="false"
               selectByExampleQueryId="false">
            <generatedKey column="id" sqlStatement="Mysql"/>
            <!--替换-->
            <!--例:数据库中的名:lazy_user 生成后本该:LazyUser 经过下面修改:User-->
            <domainObjectRenamingRule searchString="^Lazy" replaceString=""/>
        </table>
    </context>
</generatorConfiguration>

问题

  1. 插件不显示

    <pludins>放在了<pluginManagement>里面 应同级

  2. Cannot instantiate object of type null

    Dao生成配置少写 type="XMLMAPPER"

 类似资料: