`

工作中遇到的mysql+mybatis的问题小结

 
阅读更多

1、mysql中插入一条数据时,条件排重。

 

insert into t_net_base (net_id, parent_id, address )
SELECT #{netId,jdbcType=INTEGER}, #{parentId,jdbcType=INTEGER}, #{address,jdbcType=VARCHAR}
FROM DUAL
where not exists(select...(子查询->排重条件))
 

 使用 dual 做表名可以让你在 select 语句后面直接跟上要插入字段的值,即使这些值还不存在当前表中。

 

 2、按类型字段分组后,按时间字段取最大值

 

  我以为直接用这个:

 

select * from 表名 group by 类型 having max(时间);

  然而,查询结果并不是我想要的。

 

  网上也有很多错误答案,不加思考就贴出来。

 

  发现一个靠谱的思路:

 

https://blog.csdn.net/u011734144/article/details/51982134?locationNum=10&fps=1
 

   即是,先分组,用max(时间)查询到最大时间和对应的类型字段的值,再inner join 原表。貌似可行。

 

  但是后面再思考,如果分组后,同一组中的数据的时间字段的值如果有重复。那么后面inner join后,就会

 

  出现多个主键不同的最大值数据。如果业务上允许的话。取其中一条。也是可行的。

   

 

其它:

 

分组后,每组成员按时间字段排序,取第一个。

 

例如oracle中可以:

 

  -- 每个流量计的最新一条数据
                
SELECT * FROM(
                    
  SELECT
                        
    afrd.*,
                        
    ROW_NUMBER() OVER(PARTITION BY afrd.FLOWMETER_ID ORDER BY afrd.METER_TIME DESC) rn
                    
  FROM ARCHIVES_FLOWMETER_RECORD afrd
                
)
                
WHERE rn =1

 

 

 

 

 

3、mapper文件中的转义字符

mybatis 的映射文件(xxx.xml)中,书写sql语句时,不能出现"<"、">"等会被解析成标签符号的运算符号。这时需要将"<"、">"替换成xml的转义字符。

 

附:XML转义字符:

 

                     &lt;                                 

                     <

                     小于号                                           

                     &gt;

                     >                                      

                     大于号

                     &amp;

                     &

                     和

                     &apos;

                     ’

                     单引号

                     &quot;

                     "

                     双引号

 

第二种方法是使用<![CDATA[ ]]>符号进行说明,将此类符号不进行解析 

 

你的可以写成这个: 

 

mapper文件示例代码
<![CDATA[ when min(starttime)<='12:00' and max(endtime)<='12:00' ]]>   
 转自:https://blog.csdn.net/zheng0518/article/details/10449549
 

 4、mysql如何保存boolean类型字段

 

设置is_del字段类型为tinyInt(1),通过mybatis的逆向工程,生成的projo里面,对应属性isDel的
 
数据类型为boolean。
 
另外:
MySQL没有boolean类型。这也是比较奇怪的现象。例:

create table xs
(
   id int primary key,
   bl boolean
)
 
这样是可以创建成功,但查看一下建表后的语句,就会发现,mysql把它替换成tinyint(1)。也就是说mysql把boolean=tinyInt了。 

boolean类型

MYSQL保存BOOLEAN值时用1代表TRUE,0代表FALSE,boolean在MySQL里的类型为tinyint(1),

MySQL里有四个常量:true,false,TRUE,FALSE,它们分别代表1,0,1,0

5、索引创建

创建索引:

CREATE [UNIQUE] INDEX indexName ON mytable(columnname(length));

ALTER mytable ADD [UNIQUE] INDEX [indexName] ON (columnname(length));

  删除索引:

DROP INDEX [indexName] ON mytable;

  查看索引:

SHOW INDEX FROM table_name\G

 有四种方式来添加数据表的索引:

--  该语句添加了一个主键,这一位置索引值必须是唯一的,且不能为null

ALTER TABLE tbl_name ADD PRIMARY(column_list);

--  这条语句创建索引的值必须是唯一的(除了null外,null可能会出现多次)

ALTER TABLE tbl_name ADD UNIQUE index_name(column_list)

--  添加普通索引,索引值可出现多次。

ALTER TABLE tbl_name ADD INDEX index_name(column_list)

--  该语句指定了索引为FULLTEXT,用于全文索引。

ALTER TABLE tbl_name ADD FULLTEXT index_name(column_list)

 

6、数据的批量更新

 

参考链接:https://blog.csdn.net/xyjawq1/article/details/74129316

 

实体类:

/**
 * 文件
 *
 */
public class RFile {

	/**
	 * 主键
	 */
	private Long id;

	/**
	 * 下载次数
	 */
	private Integer downloadCount;
	
...

	public Long getId() {
		return id;
	}

	public void setId(Long id) {
		this.id = id;
	}

	public Integer getDownloadCount() {
		return downloadCount;
	}

	public void setDownloadCount(Integer downloadCount) {
		this.downloadCount = downloadCount;
	}
...


}

 mapper接口:

/**
	 * 批量更新下载次数
	 * 
	 */
	public int updateDownloadCountByPrimaryKey(@Param("fileList") List<RFile> fileList);

 mapper映射文件:

<update id="updateDownloadCountByPrimaryKey" parameterType="java.util.List">
        update `r_file`
        <trim prefix="set" suffixOverrides=",">
            <trim prefix="download_count =case" suffix="end,">
                 <foreach collection="fileList" item="item" index="index">
                     <if test="item.downloadCount !=null">
                         when id=#{item.id} then #{item.downloadCount}
                     </if>
                   	<if test="item.downloadCount == null or item.downloadCount &lt; 0">
                         when id=#{item.id} then `r_file`.download_count <!-- 原数据 -->
                     </if> 
                 </foreach>
            </trim>
        </trim>
        where id in
        <foreach collection="fileList" index="index" item="item" separator="," open="(" close=")">
            #{item.id,jdbcType=BIGINT}
        </foreach>
    </update>

 参考执行的sql:

update `r_file` 
set download_count =
	case when id=? then ? 
		when id=? then ? 
		when id=? then ? 
		when id=? then ? 
	end 
where id in ( ? , ? , ? , ? )

 7、case when 使用的一些小问题

 

参考链接:https://www.cnblogs.com/blogxiao/p/7600964.html

 

 

8、maven工程中遇到的问题

 

在maven工程中,在整合mybatis时,如果是maven命令启动,可能会报找不到mapper文件的错误,关键词:...not found ...statement...xxxMapper.XXX...

如果在确认了注解或者其它无误后依然报错。那么,可能是因为mapper.xml文件放到了src/main/java目录下,maven默认是将src/main/resource目录下的文件作为资源文件打包。src/main/java目录下的xml文件被忽略掉了。所以需要在pom文件中标识资源文件的目录。

<resources>
			<resource>
				<directory>src/main/java</directory>
				<includes>
					<include>**/*.properties</include>
					<include>**/*.xml</include>
				</includes>
				<filtering>false</filtering>
			</resource>
			<resource>
				<directory>src/main/resources</directory>
			</resource>
		</resources>

 

 

参考链接:https://blog.csdn.net/biren_wang/article/details/78200805

 

9、group by遇到的问题

 

需求举例:

一张表示动物(猫)的表:

CREATE TABLE `cat` (
  `id` int(12) NOT NULL AUTO_INCREMENT,
  `name` varchar(255) DEFAULT NULL,
  `type` int(2) DEFAULT NULL,
  `age` int(2) DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=10 DEFAULT CHARSET=utf8;

 type字段关联一张类型(颜色)表:

CREATE TABLE `cat_type` (
  `id` int(12) NOT NULL AUTO_INCREMENT,
  `name` varchar(255) DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=6 DEFAULT CHARSET=utf8;

 分别插入测试数据:

cat:



 

cat_type:

 



 

要求统计查询出不同颜色的猫的个数,年龄段作为查询条件。没有为0。

 

第一次查询(条件:猫年龄>10):

SELECT
	ct.`name` '颜色',
	COUNT(cat.id) '数量'
FROM
	cat_type ct
LEFT JOIN cat ON cat.type = ct.id
WHERE
	cat.age > 10
GROUP BY
	ct.`name`

 

 结果:




 
 

不是想要的结果。

修改后查询:

SELECT
	ct.`name` '颜色',
	COUNT(temp_.id) '数量'
FROM
	cat_type ct
LEFT JOIN (
	SELECT * FROM cat WHERE cat.age > 10
) temp_ ON temp_.type = ct.id
GROUP BY
	ct.`name`

 结果:

 



 

第一次查询中,where条件筛选在join之后,而题意是想先条件过滤再进行分组统计。这里where筛掉了需要进行group by统计的数据。

 

10.mapper入参为String单个参数时,查询时的if标签可能会报错。

 

<select id="listAllExclude" resultType="com.qciot.module.org.domain.org.Org" parameterType="java.lang.String">
		select * from sys_org
		where 1=1
		<if test="_parameter !=null and _parameter != ''">
			and id not in(#{id})
		</if>
	</select>

 需要将if标签的test属性中的参数名改为_parameter。或者在入参里面为入参见上@Param注解。

 

11.更新数据时。如果传入的字段有为null的情况,需要添加jdbcType。否则可能会报错。如下面的birthday字段。

 

<update id="update" parameterType="com.qciot.module.rbac.domain.user.User">
		UPDATE sys_user
		SET
			username=#{username},
			password=#{password},
			enabled=#{enabled},
			accountExpired=#{accountExpired},
			credentialsExpired=#{credentialsExpired},
			accountLocked=#{accountLocked},
			name=#{name},
			gender=#{gender},
			phone=#{phone},
			emergencyPhone=#{emergencyPhone},
			birthday=#{birthday,jdbcType=TIMESTAMP},
			org_id=#{orgId},
			remark=#{remark}
		WHERE id=#{id}
	</update>

 参考链接:https://www.cnblogs.com/tongxuping/p/7134113.html

 

 

12.mybatis代码生成工具(逆向工程):

 

1、首先需要mybatis-generator的jar包。

 

比如在maven仓库中找找:

 

D:\maven\repository\org\mybatis\generator\mybatis-generator-core\1.3.2\mybatis-generator-core-1.3.2.jar

 

2、数据库连接的jar包:

 

也是maven仓库中找,或者自己下载:

 

D:\java\repository\mysql\mysql-connector-java\8.0.11\mysql-connector-java-8.0.11.jar

 

3、然后是需要一个配置文件generatorConfig.xml,配置generator相关的信息。

 

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>
    <!-- !!!! Driver Class Path !!!! -->
    <classPathEntry location="D:\java\repository\mysql\mysql-connector-java\8.0.11\mysql-connector-java-8.0.11.jar"/>

    <context id="context" targetRuntime="MyBatis3">

        <property name="mergeable" value="false"></property>
        <commentGenerator>
            <!--是否关闭注释-->
            <property name="suppressAllComments" value="true"/>
            <!--是否关闭时间标志-->
            <property name="suppressDate" value="true"/>
        </commentGenerator>

        <!-- !!!! Database Configurations !!!! -->
        <jdbcConnection
                driverClass="com.mysql.cj.jdbc.Driver"
                connectionURL="jdbc:mysql://localhost:3306/taxserver_7?serverTimezone=CTT"
                userId="root"
                password="111111">
        </jdbcConnection>

        <javaTypeResolver>
            <property name="forceBigDecimals" value="false"/>
        </javaTypeResolver>

        <!-- pojo生成路径 -->
        <javaModelGenerator targetPackage="com.platform.entity"
                            targetProject="F:/test-g">
            <property name="enableSubPackages" value="false"/>
            <property name="trimStrings" value="true"/>
        </javaModelGenerator>

        <!-- mapper.xml生成路径 -->
        <sqlMapGenerator targetPackage="mapper.generator" targetProject="F:/test-g">
            <property name="enableSubPackages" value="false"/>
        </sqlMapGenerator>

        <!-- mapper接口生成路径 -->
        <javaClientGenerator targetPackage="com.platform.mapper.generator"
                             targetProject="F:/test-g" type="XMLMAPPER">
            <property name="enableSubPackages" value="false"/>
        </javaClientGenerator>

        <!-- 表配置 -->
        <table tableName="jkgl_kpfwqxx" enableCountByExample="false" enableDeleteByExample="false"
               enableSelectByExample="false" enableUpdateByExample="false">
            <generatedKey column="id" sqlStatement="MySql" identity="true"/>
        </table>
        
        
       
        


    </context>
</generatorConfiguration>
 

 

 

4、最后是一句执行命令

 

java -jar D:\maven\repository\org\mybatis\generator\mybatis-generator-core\1.3.2\mybatis-generator-core-1.3.2.jar -configfile E:\probe\src\main\resources\generatorConfig.xml -overwrite

 

 

13.mapper 数据批量插入:

 

<insert id="saveList" useGeneratedKeys="true" parameterType="java.util.List">
		<selectKey resultType="long" keyProperty="id" order="AFTER">
			SELECT
			LAST_INSERT_ID()
		</selectKey>
		insert into
		f_admin_msg (name, user_name, phone, mail,apply_id,type,valid)
		values
		<foreach collection="items" item="item" index="index"
			separator=",">
			(#{item.name},#{item.userName},#{item.phone},#{item.mail},#{item.applyId},#{item.type},#{item.valid})
		</foreach>
	</insert>

 

 14.maven命令快速导出pom.xml依赖的所有jar

 

在pom目录下,命令行执行:mvn dependency:copy-dependencies

 

  • 大小: 5.6 KB
  • 大小: 2.3 KB
  • 大小: 2.5 KB
  • 大小: 4 KB
  • 大小: 2.3 KB
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics