第一步:创建项目,导入依赖
mysql
mysql-connector-java
5.1.34
org.mybatis
mybatis
3.4.5
org.mybatis
mybatis-spring
1.3.1
org.mybatis.caches
mybatis-ehcache
1.1.0
org.mybatis.generator
mybatis-generator-core
1.3.5
添加 插件: 自动生成插件 在plugins 标签内部加入
org.mybatis.generator
mybatis-generator-maven-plugin
1.3.5
true
true
需要把标签单独移除,不被它管理。
查询配置成功的显示:
image.png
第二步:创建核心配置文件
直接拷贝之前的核心配置文件即可
第三步:自动生成POJO实体类和Mapper映射文件+DAO接口
配置插件:插件模板文件,固定写法,用模板generatorConfig.xml修改。
手动创建resources目录,转化为资源文件目录。
模板文件必须放入: src\main\resources 这个目录not resource
文件名称不修改:generatorConfig.xml
这里选择不生成Example类
enableCountByExample="false"
enableDeleteByExample="fales"
enableSelectByExample="false"
enableUpdateByExample="false">
选择的表必须有主键。
这里选择字段带下划线的表:
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代理方式不可以自定义路径。
这个路径和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 文件里面加入资源文件的配置:
src/main/resources
src/main/java
/.properties
/.xml
false
当我们使用idea的时候总会发现有编译版本的问题 原因在于不同的模块的编译版本不同 ,所以会导致编译问题 所以我们在这里统一使用编译插件:
org.apache.maven.plugins
maven-compiler-plugin
3.1
1.8
1.8
UTF-8
结果:
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 动态更新:可以任意修改一个字段