Mybatis插件自动开发

第一步:创建项目,导入依赖


<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.34</version>
</dependency>

<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.4.5</version>
</dependency>

<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis-spring</artifactId>
<version>1.3.1</version>
</dependency>
<dependency>
<groupId>org.mybatis.caches</groupId>
<artifactId>mybatis-ehcache</artifactId>
<version>1.1.0</version>
</dependency>

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

添加 插件: 自动生成插件 在plugins 标签内部加入
<plugin>
<groupId>org.mybatis.generator</groupId>
<artifactId>mybatis-generator-maven-plugin</artifactId>
<version>1.3.5</version>
<configuration>
<verbose>true</verbose>
<overwrite>true</overwrite>
</configuration>
</plugin>

需要把<pluginManagement>标签单独移除,不被它管理。

查询配置成功的显示:

image.png

第二步:创建核心配置文件

直接拷贝之前的核心配置文件即可 

第三步:自动生成POJO实体类和Mapper映射文件+DAO接口

配置插件:插件模板文件,固定写法,用模板generatorConfig.xml修改。
手动创建resources目录,转化为资源文件目录。
模板文件必须放入: src\main\resources 这个目录not resource
文件名称不修改:generatorConfig.xml
这里选择不生成Example类

<?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="D:\Program Files\repository\mysql\mysql-connector-java\5.1.34\mysql-connector-java-5.1.34.jar" ></classPathEntry>
<context id="context1" >
<commentGenerator>

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

<jdbcConnection driverClass="com.mysql.jdbc.Driver" connectionURL="jdbc:mysql://localhost:3306/testmybatis01?characterEncoding=utf-8" userId="root" password="zyh" />

<javaModelGenerator targetPackage="com.zyh.pojo" targetProject="src/main/java" />

<sqlMapGenerator targetPackage="com.zyh.mapper" targetProject="src/main/java" />

<javaClientGenerator targetPackage="com.zyh.dao" targetProject="src/main/java" type="XMLMAPPER" />

<table tableName="t_user_info" domainObjectName="UserInfo"
enableCountByExample="false"
enableDeleteByExample="fales"
enableSelectByExample="false"
enableUpdateByExample="false">

</table>

</context>
</generatorConfiguration>

选择的表必须有主键。
这里选择字段带下划线的表:

image.png

*********************************注意***********************************************
工作中字段命名规范:
1)全小写,单词组合[hostname,hostip,hostaddr]
2)全小写,单词之间加下划线。[host_name,host_ip,host_addr]
3)不要使用关键子,数据库的函数名称。[password,sum,desc,asc]


上下文配置关键项:
jdbcConnection ---数据库链接URL、用户名、密码
javaModelGenerator---生成模型的包名和位置,就是entity 类。
sqlMapGenerator ---生成的映射文件包名和位置,就是sql 语句映射。
javaClientGenerator---生成DAO的包名和位置,就是dao 接口。
table---这个配置项是配置在项目中操作的数据库表
tableName表名, domainObjectName实体名

Mybatis也属于ORM框架(半自动):对象关系型映射
Hibernate是全自动的ORM框架
MYSQL:属于关系型数据库
Java :面向对象编程语言
ORM:使用面向对象的思想来操作数据库。
让程序员操作数据库养成面向对象编程的方式操作。

配置插件自动生成:

方式一:(了解)
在Intellij IDEA添加一个”Run运行”选项,使用maven运行mybatis-generator-maven-plugin插件

添加Maven运行选项:
Working directory选择具体的模块项目;
在 “Command line” 选项中输入mybatis-generator:generate -e加”-e”选项是让该插件输出详细信息,帮助我们定位问题。只能点击生成一次:

image.png

选中与点击:

image.png

注意:只能点击一次。
生成结果:

image.png

注册实体mapper映射文件

方式二(掌握):
插件视图直接点击

image.png

或者

image.png

同样只能生成一次,再次点击配置文件内容会重复(****Mapper.xml)。
注册实体:

image.png

注意:这里的mapper配置文件放在java目录中,默认Idea是不认的。

第四步:Mapper代理开发DAO
最终框架整合后是不需要开发DAO实现类?
观察自动生成代码(Mapper代理)的现象:
插件方式完成CRUD后,对比Mapper代理方式:
Mapper dao接口全路径名要和mapper映射文件的namespace值一致。
Mapper dao接口方法名称要和mapper映射文件的statement的id一致。
Mapper dao接口方法参数类型要和mapper映射文件的parameterType的值一致,而且它的参数是一个。
mapper接口方法返回值类型要和mapper映射文件的resultType的值一致。
自动生成就符合上面的条件。

分析:
满足条件一:
<mapper namespace="com.zyh.dao.UserInfoMapper">
使用Mapper代理方式不可以自定义路径。
这个路径和DAO接口的全路径一致。


image.png

满足条件二:Mapper的id:


image.png

image.png

Id和DAO接口中的方法名称一致

满足条件三:参数:


image.png
image.png

参数也是一致的。

满足条件四:返回类型:


image.png

image.png

返回类型也一致。

注册实体:Idea默认不能认java目录中的配置文件。


image.png

bug:


image.png

打包确认bug:
image.png

问题:


image.png

普通jar项目打包默认只加载resources中的资源文件,mapper中的映射文件需要处理:

加入resources节点加载非资源目录中的资源文件
在 pom.xml 文件里面加入资源文件的配置:
<resources>
<resource>
<directory>src/main/resources</directory>
</resource>
<resource>
<directory>src/main/java</directory>
<includes>
<include>/.properties</include>
<include>
/.xml</include>
</includes>

<filtering>false</filtering>
</resource>
</resources>

当我们使用idea的时候总会发现有编译版本的问题 原因在于不同的模块的编译版本不同 ,所以会导致编译问题 所以我们在这里统一使用编译插件:

<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.1</version>
<configuration>
<source>1.8</source>
<target>1.8</target>
<encoding>UTF-8</encoding>
</configuration>
</plugin>
结果:


image.png

打包install到本地仓库确认


image.png

打包成功 解压 jar包 观察所生成的文件是否是全的。

如下图所示:所有的文件都是全的 ,
*******************所以千万不要忘记加入资源文件的依赖。*********************


image.png

测试代码如下所示:
public class TestDao {
@Test
public void testInsert(){
SqlSession sqlSession = SqlSessionFactoryUtilSingleL.getSqlSession();
UserInfoMapper mapper = sqlSession.getMapper(UserInfoMapper.class);
UserInfo userInfo =new UserInfo();
userInfo.setuName("張穎好");
userInfo.setuPass("是個好人");
mapper.insert(userInfo);
sqlSession.commit();
sqlSession.close();
}
/**
* 当我们测试 修改的时候 当我们不给 id 值得时候 发现并不能更新所有的数据
* 但是如果我们在数据里面使用 update 语句的时候 可以修改整个表的所有数据
/
@Test
public void testUpdate(){
SqlSession sqlSession = SqlSessionFactoryUtilSingleL.getSqlSession();
UserInfoMapper mapper = sqlSession.getMapper(UserInfoMapper.class);
UserInfo userInfo=new UserInfo();
userInfo.setuName("名字");
userInfo.setuPass("密码");
userInfo.setuId(1l);
mapper.updateByPrimaryKey(userInfo);
sqlSession.commit();
sqlSession.close();
}
@Test
public void testDelete(){
SqlSession sqlSession = SqlSessionFactoryUtilSingleL.getSqlSession();
UserInfoMapper mapper = sqlSession.getMapper(UserInfoMapper.class);
mapper.deleteByPrimaryKey(1L);
sqlSession.commit();
sqlSession.close();
}
/
*
* 现在的查询只能根据id 进行查询 但是不能动态的查询所有的记录
*/
@Test
public void testQuery(){
SqlSession sqlSession = SqlSessionFactoryUtilSingleL.getSqlSession();
UserInfoMapper mapper = sqlSession.getMapper(UserInfoMapper.class);
UserInfo userInfo = mapper.selectByPrimaryKey(1l);
System.out.println(userInfo.getuName()+"\t"+userInfo.getuPass());
}
}

上面注释列出来了问题 所以需要注意。

观察Dao 里面有两个特定的方法并没有被调用 ,这两个方法有什么不同吗?

这两个方法的作用?


image.png

insertSelective 动态添加:可以任意添加一个字段
updateByPrimaryKeySelective 动态更新:可以任意修改一个字段

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

推荐阅读更多精彩内容