Java研学-SSM综合案例(二)

二 MyBatis逆向工程

1 介绍

  Maven中的插件,可根据数据表生成实体类 Mapper 接口和 Mapper XML,可单独创建一个Maven项目,将所需的资源生成后,拷贝到对应的项目中(推荐),或者直接在项目中使用。

2 配置pom依赖插件

<build><plugins><plugin><groupId>org.apache.tomcat.maven</groupId><artifactId>tomcat7-maven-plugin</artifactId><version>2.1</version><configuration><port>8080</port> <!-- 端口 --><path>/</path> <!-- 上下路径 --><uriEncoding>UTF-8</uriEncoding> <!-- 针对 GET 方式乱码处理 --></configuration></plugin><!-- MyBatis 逆向工程插件 --><plugin><groupId>org.mybatis.generator</groupId><artifactId>mybatis-generator-maven-plugin</artifactId><version>1.3.2</version><configuration><verbose>true</verbose><overwrite>false</overwrite></configuration><dependencies><dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId><version>5.1.45</version></dependency></dependencies></plugin></plugins></build>

3 数据库表

# 部门表
CREATE TABLE `department` (`id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '表示部门编号,由数字组成',`name` varchar(14) DEFAULT NULL COMMENT '部门名称,最多由14个字符所组成',`sn` varchar(13) DEFAULT NULL COMMENT '部门编号',PRIMARY KEY (`id`) USING BTREE
) ENGINE=InnoDB AUTO_INCREMENT=7 DEFAULT CHARSET=utf8 ROW_FORMAT=DYNAMIC;# 员工表
CREATE TABLE `employee` (`id` bigint(20) NOT NULL AUTO_INCREMENT,`name` varchar(255) DEFAULT NULL,`password` varchar(255) DEFAULT NULL,`email` varchar(255) DEFAULT NULL,`age` int(11) DEFAULT NULL,`admin` bit(1) DEFAULT NULL,`dept_id` bigint(20) DEFAULT NULL,PRIMARY KEY (`id`) USING BTREE
) ENGINE=InnoDB AUTO_INCREMENT=21 DEFAULT CHARSET=utf8 ROW_FORMAT=DYNAMIC;

4 配置generatorConfig.xml – resources目录

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE generatorConfigurationPUBLIC "-//mybatis.org//DTD MyBatis Generator Configuration 1.0//EN""http://mybatis.org/dtd/mybatis-generator-config_1_0.dtd">
<!-- 配置生成器 -->
<generatorConfiguration><!--选用MyBatis3版本的简化模型--><context id="mysql" defaultModelType="hierarchical" targetRuntime="MyBatis3Simple"><!-- 自动识别数据库关键字,默认false,如果设置为true,根据SqlReservedWords中定义的关键字列表; 一般保留默认值,遇到数据库关键字(Java关键字),使用columnOverride覆盖 --><property name="autoDelimitKeywords" value="false"/><!-- 生成的Java文件的编码 --><property name="javaFileEncoding" value="UTF-8"/><!-- 格式化java代码 --><property name="javaFormatter"value="org.mybatis.generator.api.dom.DefaultJavaFormatter"/><!-- 格式化XML代码 --><property name="xmlFormatter"value="org.mybatis.generator.api.dom.DefaultXmlFormatter"/><!-- beginningDelimiter和endingDelimiter:指明数据库的用于标记数据库对象名的符号,比如ORACLE就是双引号,MYSQL默认是`反引号; --><property name="beginningDelimiter" value="`"/><property name="endingDelimiter" value="`"/><commentGenerator><property name="suppressDate" value="true"/><property name="suppressAllComments" value="true"/></commentGenerator><!-- 必须要有的,使用这个配置链接数据库 --><jdbcConnection driverClass="com.mysql.jdbc.Driver"connectionURL="jdbc:mysql:///ssm" userId="root" password="root"><!-- 这里面可以设置property属性,每一个property属性都设置到配置的Driver--></jdbcConnection><!-- java类型处理器 用于处理DB中的类型到Java中的类型,默认使用JavaTypeResolverDefaultImpl; 注意一点,默认会先尝试使用IntegerLongShort等来对应DECIMALNUMERIC数据类型; --><javaTypeResolvertype="org.mybatis.generator.internal.types.JavaTypeResolverDefaultImpl"><!-- true:使用BigDecimal对应DECIMALNUMERIC数据类型 false:默认, scale>0;length>18:使用BigDecimal;  scale=0;length[10,18]:使用Long; scale=0;length[5,9]:使用Integer; scale=0;length<5:使用Short--><property name="forceBigDecimals" value="false"/></javaTypeResolver><!-- java模型创建器,是必须的元素 负责:1,key类(见context的defaultModelType);2,java类;3,查询类 targetPackage:生成的类要放的包,真实的包受enableSubPackages属性控制; targetProject:当前项目指定一个存在的目录下,生成的内容会放到指定目录中,如果目录不存在,MBG不会自动建目录,于该目录下创建对应的包 --><javaModelGenerator targetPackage="cn.tj.domain"targetProject="src/main/java"><!-- for MyBatis3/MyBatis3Simple 自动为每一个生成的类创建一个构造方法,构造方法包含了所有的field;而不是使用setter; --><property name="constructorBased" value="false"/><!-- for MyBatis3 / MyBatis3Simple 是否创建一个不可变的类,如果为true, 那么MBG会创建一个没有setter方法的类,取而代之的是类似constructorBased的类 --><property name="immutable" value="false"/><!-- 设置是否在getter方法中,对String类型字段调用trim()方法<property name="trimStrings" value="true" /> --></javaModelGenerator><!-- 生成SQL map的XML文件生成器, 注意,在Mybatis3之后,我们可以使用mapper.xml文件+Mapper接口(或者不用mapper接口),或者只使用Mapper接口+Annotation,所以,如果 javaClientGenerator配置中配置了需要生成XML的话,这个元素就必须配置targetPackage/targetProject:同javaModelGenerator --><sqlMapGenerator targetPackage="cn.tj.mapper"targetProject="src/main/resources"><!-- 在targetPackage的基础上,根据数据库的schema再生成一层package,最终生成的类放在这个package下,默认为false --><property name="enableSubPackages" value="true"/></sqlMapGenerator><!--生成Mapper接口,注意,如果没有配置该元素,那么默认不会生成Mapper接口targetPackage/targetProject:同javaModelGenerator type:选择怎么生成mapper接口(在MyBatis3/MyBatis3Simple下): 1ANNOTATEDMAPPER:会生成使用Mapper接口+Annotation的方式创建(SQL生成在annotation中),不会生成对应的XML2MIXEDMAPPER:使用混合配置,会生成Mapper接口,并适当添加合适的Annotation,但是XML会生成在XML中; 3XMLMAPPER:会生成Mapper接口,接口完全依赖XML;注意,如果context是MyBatis3Simple:只支持ANNOTATEDMAPPERXMLMAPPER --><javaClientGenerator targetPackage="cn.tj.mapper"type="XMLMAPPER" targetProject="src/main/java"><!-- 在targetPackage的基础上,根据数据库的schema再生成一层package,最终生成的类放在这个package下,默认为false --><property name="enableSubPackages" value="true"/><!-- 可以为所有生成的接口添加一个父接口,但是MBG只负责生成,不负责检查 <property name="rootInterface" value=""/> --></javaClientGenerator><!--通过修改tableName,完成对指定表的逆向工程,一个table标签代表一张表--><table tableName="employee"><property name="useActualColumnNames" value="true"/><property name="constructorBased" value="false"/><generatedKey column="id" sqlStatement="JDBC"/></table><table tableName="department"><property name="useActualColumnNames" value="true"/><property name="constructorBased" value="false"/><generatedKey column="id" sqlStatement="JDBC"/></table></context>
</generatorConfiguration>

5 运行逆向工程

  双击运行即可,此时生成的为单表的增删改查操作,多表关联需进行编辑
运行逆向工程

6 生成的实体类

// Department
@Data
public class Department {private Long id;private String name;private String sn;
}// Employee
@Data
public class Employee {private Long id;private String username;private String name;private String password;private String email;private Integer age;private Boolean admin;private Long dept_id;private  Department dept;
}

7 生成的接口

// DepartmentMapper
public interface DepartmentMapper {/*删除*/int deleteByPrimaryKey(Long id);/*增加*/int insert(Department record);/*根据id查询*/Department selectByPrimaryKey(Long id);/*查询所有*/List<Department> selectAll();/*修改*/int updateByPrimaryKey(Department record);/*查询总条数*/public int selectForCount(QueryObject qo);/*分页查询*/public List<Department> selectForList(QueryObject qo);
}// EmployeeMapper
public interface EmployeeMapper {int deleteByPrimaryKey(Long id);int insert(Employee record);Employee selectByPrimaryKey(Long id);List<Employee> selectAll();int updateByPrimaryKey(Employee record);/*查询总条数*/public  int selectForCount(EmployeeQueryObject qo);/*分页查询*/public List<Employee> selectForList(EmployeeQueryObject qo);
}

8 生成的xml

 DepartmentMapper.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" >
<mapper namespace="cn.tj.mapper.DepartmentMapper" ><resultMap id="BaseResultMap" type="cn.tj.domain.Department" ><id column="id" property="id" jdbcType="BIGINT" /><result column="name" property="name" jdbcType="VARCHAR" /><result column="sn" property="sn" jdbcType="VARCHAR" /></resultMap><delete id="deleteByPrimaryKey" parameterType="java.lang.Long" >delete from departmentwhere id = #{id,jdbcType=BIGINT}</delete><insert id="insert" parameterType="cn.tj.domain.Department" useGeneratedKeys="true" keyProperty="id" >insert into department (name, sn)values (#{name,jdbcType=VARCHAR}, #{sn,jdbcType=VARCHAR})</insert><update id="updateByPrimaryKey" parameterType="cn.tj.domain.Department" >update departmentset name = #{name,jdbcType=VARCHAR},sn = #{sn,jdbcType=VARCHAR}where id = #{id,jdbcType=BIGINT}</update><select id="selectByPrimaryKey" resultMap="BaseResultMap" parameterType="java.lang.Long" >select id, name, snfrom departmentwhere id = #{id,jdbcType=BIGINT}</select><select id="selectAll" resultMap="BaseResultMap" >select id, name, snfrom department</select><!--查询总条数--><select id="selectForCount" resultType="int">SELECT count(*) from department</select><!--分页查询部门--><select id="selectForList" resultMap="BaseResultMap">SELECT * from  department limit #{start},#{pageSize}</select>
</mapper>

 EmployeeMapper.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" >
<mapper namespace="cn.tj.mapper.EmployeeMapper" ><resultMap id="BaseResultMap" type="cn.tj.domain.Employee" ><id column="id" property="id" jdbcType="BIGINT" /><result column="username" property="username" jdbcType="VARCHAR" /><result column="name" property="name" jdbcType="VARCHAR" /><result column="password" property="password" jdbcType="VARCHAR" /><result column="email" property="email" jdbcType="VARCHAR" /><result column="age" property="age" jdbcType="INTEGER" /><result column="admin" property="admin" jdbcType="BIT" /><result column="dept_id" property="dept_id" jdbcType="BIGINT" /><result column="d_id" property="dept.id" jdbcType="BIGINT" /><result column="d_name" property="dept.name" jdbcType="VARCHAR" /><result column="d_sn" property="dept.sn" jdbcType="VARCHAR" /></resultMap><delete id="deleteByPrimaryKey" parameterType="java.lang.Long" >delete from employeewhere id = #{id,jdbcType=BIGINT}</delete><insert id="insert" parameterType="cn.tj.domain.Employee" useGeneratedKeys="true" keyProperty="id" >insert into employee (username, name, password, email, age, admin, dept_id)values (#{username,jdbcType=VARCHAR}, #{name,jdbcType=VARCHAR}, #{password,jdbcType=VARCHAR}, #{email,jdbcType=VARCHAR}, #{age,jdbcType=INTEGER}, #{admin,jdbcType=BIT}, #{dept.id})</insert><update id="updateByPrimaryKey" parameterType="cn.tj.domain.Employee" >update employeeset username = #{username,jdbcType=VARCHAR},name = #{name,jdbcType=VARCHAR},email = #{email,jdbcType=VARCHAR},age = #{age,jdbcType=INTEGER},admin = #{admin,jdbcType=BIT},dept_id = #{dept.id}where id = #{id,jdbcType=BIGINT}</update><select id="selectByPrimaryKey" resultMap="BaseResultMap" parameterType="java.lang.Long" >select id, username, name, password, email, age, admin, dept_idfrom employeewhere id = #{id,jdbcType=BIGINT}</select><select id="selectAll" resultMap="BaseResultMap" >select id, username, name, password, email, age, admin, dept_idfrom employee</select><!--根据条件查询总条数--><select id="selectForCount" resultType="int">SELECT count(*) from employee e<include refid="where_sql"></include></select><!--根据条件分页查询--><select id="selectForList" resultMap="BaseResultMap">SELECT e.*,d.id d_id,d.`name` d_name,d.sn d_snfrom employee e JOIN department d on e.dept_id=d.id<include refid="where_sql"></include>LIMIT #{start},#{pageSize};</select><!--条件sql片段--><sql id="where_sql"><where><if test="keyword != null">and  e.name like concat("%",#{keyword},"%")  or e.email like concat("%",#{keyword},"%")</if><if test="deptId !=null">and e.dept_id =#{deptId}</if></where></sql>
</mapper>

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/744556.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

信息检索(十一):Nonparametric Decoding for Generative Retrieval

Nonparametric Decoding for Generative Retrieval 摘要1. 引言2. 相关工作3. 非参数解码3.1 关键优势3.2 Base Np3.3 异步 Np3.4 对比 Np3.5 聚类 4. 实验设置4.1 基线4.2 数据集和评价指标4.3 构建CE 的细节 5. 实验结果5.1 普通解码 vs Np 解码5.2 非参数解码的优点5.3 什么…

IPFoxy的正确打开方式

IPFoxy是一个全球动静态代理IP服务器软件&#xff0c;为全球用户提供优质的大数据代理服务&#xff0c;促进网络业务高校进行。目前拥有千万真实纯净IP资源&#xff0c;覆盖超过220个国家和地区&#xff0c;汇聚成优质海外代理池&#xff0c;支持http、https、socks5多种协议类…

visa卡支持美区苹果Apple id绑定

苹果手机我相信大家都很熟悉&#xff0c;所以很多小伙伴都需要绑定卡来进行一系列的体验&#xff0c;这里我使用的是559666 在绑定之前我们需要先开一张visa卡&#xff0c;点击获取 开卡步骤如下&#xff0c;按图片步骤即可开卡 卡片信息在卡中心cvc安全码里面

ATFX汇市:日本首相称尚未摆脱通缩问题,日央行加息时点或再度推迟,日系货币普跌

ATFX汇市&#xff1a;关于日本是否已经“克服通缩”的消息出现巨大矛盾。3月2日&#xff0c;外媒援引知情人士表示&#xff0c;日本政府正在讨论正式宣布经济已经克服通缩&#xff0c;日本首相岸田文雄或内阁成员之后可能会在政府会议和新闻发布会上公开发布这一声明&#xff0…

在win10下搭建linux环境的LORAWAN服务器chirpstack

文章目录 前言一、安装WSL第一步以管理员模式打开PowerShell第二步 安装WSL第三步 设置Linux用户信息 二、将WSL迁移到其他磁盘第一步 输入wsl -l -v查看ubuntu状态第二步 迁移第三步 注销原来的Ubuntu第四步 从D:\wsl-ubuntu导入 三、安装chirpstack第一步 安装git第二步 下载…

wxss和css的区别

目录 1. 语法差异 2. 尺寸单位 3. 样式导入 WXSS 示例代码&#xff1a; CSS 示例代码&#xff1a; 4. 组件和属性的支持 总结 WXSS (WeiXin Style Sheets) 和 CSS (Cascading Style Sheets) 都是用于描述文档样式的语言&#xff0c;但它们在微信小程序和网页开发中有一些…

JavaScript进阶:js的一些学习笔记-原型

文章目录 js面向对象1. 原型2. constructor属性3. 对象原型4. 原型继承5. 原型链 js面向对象 构造函数 属性和方法 function Person(name,age){this.name name;this.age age;this.play ()>{console.log(玩&#xff01;);} } const a new Person(1,12),b new Person(2…

redis中的zset的原理

一、zset有序集合的原理 如果有序集合元素个数少于128个且元素值小于64字节&#xff0c;使用压缩列表&#xff08;新版本已经废弃压缩列表改用listpack数据结构了&#xff09; 如果不满足上述条件&#xff0c;采用跳表作为redis的底层数据结构 二、压缩列表 1.由连续内存块组…

漏洞复现-金和OA系列

漏洞复现-金和OA系列 🗡金和OA jc6 RCE金和OA GetTreeDate.aspx SQL注入【新】金和OA RssModulesHttp.aspx接口SQL注入漏洞复现C6-GetSgIData.aspx SQL注入金和OA C6 GetTreeDate.aspx SQL注入金和OA C6 GetTreeDate.aspx未授权金和OA JC6 OfficeServer 任意文件上传漏洞金和…

全栈之路-新坑就绪-星野空间

感觉自己的技术栈一直没有形成一个很好的闭环 开新坑&#xff0c;准备把自己的技术栈链路打通&#xff0c; Don‘t think too much&#xff0c; just act&#xff01;[得意]

C++ 网络编程学习五

C网络编程学习五 网络结构的更新单例模式懒汉单例模式饿汉单例模式懒汉式指针智能指针设计单例类 服务器优雅退出asio的多线程模型IOServiceasio多线程IOThreadPoolepoll 和 iocp的一些知识点 网络结构的更新 asio网络层&#xff0c;会使用io_context进行数据封装&#xff0c;…

1.下载安装ESP32开发环境ESP-IDE

ESP32简介 ESP32介绍 说到ESP32&#xff0c;首先ESP32不是一个芯片&#xff0c;ESP32是一个系列芯片&#xff0c; 是乐鑫自主研发的一系列芯片微控制器。它主要的功能就是支持WiFi和蓝牙&#xff0c; ESP32指的是ESP32裸芯片。但是&#xff0c;“ESP32”一词通常指ESP32系列芯…

Unity之PUN实现多人联机射击游戏的优化

目录 &#x1f3ae;一、 跳跃&#xff0c;加速跑 &#x1f3ae;二、玩家自定义输入昵称 &#x1f345;2.1 给昵称赋值 &#x1f345;2.2 实现 &#x1f3ae;三、玩家昵称同步到房间列表 &#x1f345;3.1 获取全部玩家 &#x1f345;3.2 自定义Player中的字段 &#…

圈内大佬呕心之作,一年后斩获腾讯T3,这份Java学习笔记有多厉害

说这句话的人其实有一些误解&#xff0c;误解就在于&#xff0c;安逸的生活并不等于不需要奋斗&#xff0c;这要看你的家底。 某聪如果说要选择安逸的生活&#xff0c;他可以很安逸&#xff0c;因为他有了安逸的资本&#xff0c;而大部分的你&#xff0c;并没有这个资本&#…

SQL中的distinct的使用方法

1. distinct含义与使用方法 distinct用来查询不重复记录的条数,即用distinct来返回不重复字段的条数&#xff08;count(distinct id)&#xff09;,其原因是distinct只能返回他的目标字段&#xff0c;而无法返回其他字段。 注意事项 distinct 【查询字段】&#xff0c;必须放…

压缩json字符串

GZIPOutputStream 需要关闭&#xff0c;而 ByteArrayOutputStream 不需要关闭。具体原因如下&#xff1a; GZIPOutputStream&#xff1a;GZIPOutputStream是一种过滤流&#xff0c;它提供了将数据压缩为GZIP格式的功能。当使用此类的实例写入数据时&#xff0c;它会对数据进行压…

阿里云数据湖存储加速套件JindoData

计算存储分离已经成为云计算的一种发展趋势。在计算存储分离之前&#xff0c;普遍采用的是传统的计算存储相互融合的架构&#xff0c;但是这种架构存在一定的问题&#xff0c;比如在集群扩容的时候会面临计算能力和存储能力相互不匹配的问题。用户在某些情况下只需要扩容计算能…

[MYSQL数据库]- 索引

前言 作者&#xff1a;小蜗牛向前冲 名言&#xff1a;我可以接受失败&#xff0c;但我不能接受放弃 如果觉的博主的文章还不错的话&#xff0c;还请点赞&#xff0c;收藏&#xff0c;关注&#x1f440;支持博主。如果发现有问题的地方欢迎❀大家在评论区指正 目录 一、认识索…

力扣--课程表--bfs+dfs

整体思路&#xff1a; 这是一道拓扑序列的题目&#xff0c;我们将边的方向定义成从先修课指向后修课的方向&#xff0c;借一下官方的题解图片&#xff0c;我们需要判断的是形成的这个图结构是否存在环&#xff0c;如果存在环&#xff0c;那么代表不能完成所有课程的学习。 bfs思…

强推游戏爱好者!雾锁王国联机服务器部署教程

继《幻兽帕鲁》游戏爆火之后&#xff0c;与它同类型的《雾锁王国》也是强力刷屏&#xff0c;不分伯仲&#xff0c;在 Steam 上的评分一直稳定在“特别好评”&#xff0c;让小伙伴们很“上头”。就在两者游戏玩家反响爆火的同时&#xff0c;官方服务器人数爆满&#xff0c;卡顿频…