在编译的时候xml文件的时候
只有在resources包下面系统才会自动编译
而在别的包里面是不会编译xml文件的 如果想要在别的包里面编译 需要手动设置
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-h4XsMTaq-1619088288667)(C:\Users\lenovo\AppData\Roaming\Typora\typora-user-images\image-20210203161425339.png)]
Mybatis逆向工程关键点
1.jar包
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>org.example</groupId>
<artifactId>Mybatis</artifactId>
<version>1.0-SNAPSHOT</version>
<dependencies>
<!--mybatis框架的jar包依赖-->
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.5.1</version>
</dependency>
<!-- mybatis-generator 一键生成增删改查等简单的代码-->
<dependency>
<groupId>org.mybatis.generator</groupId>
<artifactId>mybatis-generator-core</artifactId>
<version>1.3.7</version>
</dependency>
<!--lombok代码生成工具的jar包依赖 这个是为了简化开发-->
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.18.8</version>
</dependency>
<!--mysql的jdbc驱动jar包依赖-->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.47</version>
</dependency>
<!-- 日志-->
<dependency>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
<version>1.2.17</version>
</dependency>
</dependencies>
<build>
<plugins>
<!--mybatis代码自动生成插件-->
<plugin>
<groupId>org.mybatis.generator</groupId>
<artifactId>mybatis-generator-maven-plugin</artifactId>
<version>1.3.7</version>
<configuration>
<!--配置文件的位置-->
<configurationFile>src/main/resources/generatorConfig.xml</configurationFile>
<!--生成代码过程中是否打印日志-->
<verbose>true</verbose>
<!--生成时是否覆盖java文件,xml文件总是合并-->
<overwrite>true</overwrite>
</configuration>
</plugin>
</plugins>
<resources>
<!-- 让src/main/java所有的包都把xml文件给编译 因为在默认情况下是不会编译的-->
<resource>
<directory>src/main/java</directory>
<includes>
<include>**/*.xml</include>
</includes>
</resource>
<!-- src/main/resources下的包的文件全部编译 -->
<resource>
<directory>src/main/resources</directory>
<includes>
<include>**/*.*</include>
</includes>
</resource>
</resources>
</build>
</project>
2.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="jdbc.properties"/>
<!-- 指定连接数据库的JDBC驱动包所在位置,指定到你本机的完整路径 -->
<!--
这里写的是物理路径
-->
<classPathEntry location="D:\tools\maven\apache-maven-3.6.3\conf\repository\mysql\mysql-connector-java\5.1.47\mysql-connector-java-5.1.47.jar"/>
<!-- 配置table表信息内容体,targetRuntime指定采用MyBatis3的版本 -->
<context id="tables" targetRuntime="MyBatis3">
<!-- 抑制生成注释,由于生成的注释都是英文的,可以不让它生成 -->
<commentGenerator>
<property name="suppressAllComments" value="true" />
</commentGenerator>
<!-- 配置数据库连接信息 -->
<connectionFactory>
<property name="driverClass" value="${jdbc.driver}"/>
<property name="connectionURL" value="${jdbc.url}"/>
<property name="userId" value="${jdbc.username}"/>
<property name="password" value="${jdbc.password}"/>
</connectionFactory>
<!-- 生成domain类,targetPackage指定model类的包名, targetProject指定生成的domain放在idea的哪个工程下面-->
<javaModelGenerator targetPackage="com.baidu.mybatis.domain" targetProject="src/main/java">
<property name="enableSubPackages" value="false" />
<property name="trimStrings" value="false" />
</javaModelGenerator>
<!-- 生成MyBatis的Mapper.xml文件,targetPackage指定mapper.xml文件的包名, targetProject指定生成的mapper.xml放在idea的哪个工程下面 -->
<sqlMapGenerator targetPackage="com.baidu.mybatis.mapper" targetProject="src/main/java">
<property name="enableSubPackages" value="false" />
</sqlMapGenerator>
<!-- 生成MyBatis的Mapper接口类文件,targetPackage指定Mapper接口类的包名, targetProject指定生成的Mapper接口放在eclipse的哪个工程下面 -->
<javaClientGenerator type="XMLMAPPER" targetPackage="com.baidu.mybatis.mapper" targetProject="src/main/java">
<property name="enableSubPackages" value="false" />
</javaClientGenerator>
<!-- 数据库表名及对应的Java类名 -->
<table tableName="tbl_user" domainObjectName="User">
<!-- 这些是让对象里面的名称和数据库中对于的列名相同-->
<property name="useActualColumnNames" value="true"/>
</table>
<table tableName="tbl_role" domainObjectName="Role">
<property name="useActualColumnNames" value="true"/>
</table>
<table tableName="tbl_permission" domainObjectName="Permission">
<property name="useActualColumnNames" value="true"/>
</table>
<table tableName="tbl_user_role_relation" domainObjectName="UserRoleRelation">
<property name="useActualColumnNames" value="true"/>
</table>
<table tableName="tbl_role_permission_relation" domainObjectName="RolePermissionRelation">
<property name="useActualColumnNames" value="true"/>
</table>
</context>
</generatorConfiguration>
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-3rMqflHw-1619088288669)(C:\Users\lenovo\AppData\Roaming\Typora\typora-user-images\image-20210203191559713.png)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-izbr057b-1619088288670)(C:\Users\lenovo\AppData\Roaming\Typora\typora-user-images\image-20210203191650155.png)]
3.jdbc.properties文件
jdbc.username=root
jdbc.password=root
jdbc.driver=com.mysql.jdbc.Driver
jdbc.url=jdbc:mysql://localhost:3306/erp
4.mybatis-config.xml
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configuration
PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
<!--引入外部的数据库的配置文件-->
<properties resource="jdbc.properties"/>
<!--环境配置-->
<environments default="development">
<environment id="development">
<transactionManager type="JDBC"/>
<dataSource type="POOLED">
<property name="driver" value="${jdbc.driver}"/>
<property name="url" value="${jdbc.url}"/>
<property name="username" value="${jdbc.username}"/>
<property name="password" value="${jdbc.password}"/>
</dataSource>
</environment>
</environments>
<!--映射器-->
<mappers>
<!--
使用package这种方式 需要两个条件
1.把Dao接口与映射文件放在同一个包下
2.Dao接口的名称需要与映射文件的名称一样
-->
<package name="com.baidu.mybatis.mapper"/>
</mappers>
</configuration>
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-0pgSreOo-1619088288672)(C:\Users\lenovo\AppData\Roaming\Typora\typora-user-images\image-20210203192049788.png)]
Mybatis
1.一对多
需求: 通过班级id查询班级的消息和在改班级学生的信息
xml文件 第一种方式
<resultMap id="classMap" type="com.baidu.mybatis.domain.Class">
<!-- 主键用id-->
<id column="id" property="id"/>
<result column="class_name" property="className"/>
<collection property="studentSet" ofType="com.baidu.mybatis.domain.Student">
<id column="id" property="id"/>
<result column="name" property="name"/>
<result column="class_id" property="classId"/>
</collection>
</resultMap>
<!--通过一个班级的id获取到班级的信息和学生的信息-->
<select id="getClassStudentById" resultMap="classMap">
select * from class c join student s on c.id=s.class_id where c.id = #{id};
</select>
xml文件 第二种方式
<select id="getStudent" resultType="com.baidu.mybatis.domain.Student">
select * from student where class_id = #{id};
</select>
<resultMap id="classMap" type="com.baidu.mybatis.domain.Class">
<!-- 主键用id-->
<id column="id" property="id"/>
<result column="class_name" property="className"/>
<!-- 用于存放学生对象的集合 查询语句 用来查询学生信息 用查询出班级的id来去充当查询学生信息的查询条件 -->
<!-- 对象用association 集合用collection-->
<collection property="studentSet" select="getStudent" column="id" />
</resultMap>
<!--通过一个班级的id获取到班级的信息和学生的信息-->
<select id="getClassStudentById" resultMap="classMap">
select * from class where id=#{id};
</select>
mapper层
Class getClassStudentById(String id);
测试
//通过一个班级的id获取到班级的信息和学生的信息
InputStream is = Thread.currentThread().getContextClassLoader().getResourceAsStream("mybatis-config.xml");
//创建工程
SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(is);
//获取到SqlSession
SqlSession sqlSession = factory.openSession();
//实现ClassMapper的实例对象
ClassMapper mapper = sqlSession.getMapper(ClassMapper.class);
//通过一个班级的id获取到班级的信息和学生的信息
Class classes = mapper.getClassStudentById("1");
System.out.println(classes);
2.多对一
需求:查询一个学生信息和他所在班级的信息
xml文件 第一种方式
<resultMap id="studentMap" type="com.baidu.mybatis.domain.Student">
<id column="id" property="id"/>
<result column="name" property="name"/>
<result column="class_id" property="classId"/>
<!-- 对象用association 集合用collection-->
<association property="aClass" javaType="com.baidu.mybatis.domain.Class">
<id column="id" property="id"/>
<id column="class_name" property="className"/>
</association>
</resultMap>
<!--通过一个学生的id查询到该学生的信息和他所在班级的信息-->
<select id="getStudentClassById" resultMap="studentMap">
select * from student s join class c on s.class_id = c.id where s.id = #{id}
</select>
xml文件 第二种方式
<!-- 如果数据库的列明和对象的属性名不相同的话 可以这样来让他们的值放入-->
<resultMap id="classMap" type="com.baidu.mybatis.domain.Class">
<id column="id" property="id"/>
<result column="class_name" property="className"/>
</resultMap>
<select id="getClass" resultMap="classMap">
select * from class where id = #{id}
</select>
<resultMap id="studentMap" type="com.baidu.mybatis.domain.Student">
<id column="id" property="id"/>
<result column="name" property="name"/>
<result column="class_id" property="classId"/>
<association property="aClass" select="getClass" column="class_id"/>
</resultMap>
<!--通过一个学生的id查询到该学生的信息和他所在班级的信息-->
<select id="getStudentClassById" resultMap="studentMap">
select * from student s where id = #{id}
</select>
mapper层
Student getStudentClassById(String id);
测试
//通过一个班级的id获取到班级的信息和学生的信息
InputStream is = Thread.currentThread().getContextClassLoader().getResourceAsStream("mybatis-config.xml");
//创建工程
SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(is);
//获取到SqlSession
SqlSession sqlSession = factory.openSession();
//实现ClassMapper的实例对象
ClassMapper mapper = sqlSession.getMapper(ClassMapper.class);
//通过一个学生的id查询到该学生的信息和他所在班级的信息
Student student = mapper.getStudentClassById("1");
System.out.println(student);
3.自查询
需求 :通过id查询一个权限的子权限和孙权限
xml文件
<resultMap id="permissionMap" type="com.baidu.mybatis.domain.Permissiones">
<id column="id" property="id"/>
<result column="name" property="name"/>
<result column="pid" property="pid"/>
<collection property="permissionSet" select="getPermissions" column="id"/>
</resultMap>
<select id="getPermissions" resultMap="permissionMap">
select * from permission where pid = #{id}
</select>
mapper
List<Permissiones> getPermissions(String id);
测试
//通过一个班级的id获取到班级的信息和学生的信息
InputStream is = Thread.currentThread().getContextClassLoader().getResourceAsStream("mybatis-config.xml");
//创建工程
SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(is);
//获取到SqlSession
SqlSession sqlSession = factory.openSession();
//实现ClassMapper的实例对象
PermissionMapper mapper = sqlSession.getMapper(PermissionMapper.class);
//通过id查询一个权限的子权限和孙权限
List<Permissiones> permissionList = mapper.getPermissions("1");
for (Permissiones permission : permissionList) {
System.out.println(permission);
}
需求 :通过id查询一个该权限和子权限加孙权限
xml文件
<select id="getPermissions" resultMap="permissionMap">
select * from permission where pid = #{id}
</select>
<resultMap id="permissionMap" type="com.baidu.mybatis.domain.Permissiones">
<id column="id" property="id"/>
<result column="name" property="name"/>
<result column="pid" property="pid"/>
<collection property="permissionSet" select="getPermissions" column="id"/>
</resultMap>
<select id="getPermission" resultMap="permissionMap">
select * from permission where id = #{id}
</select>
mapper
List<Permissiones> getPermission(String id);
测试
//通过一个班级的id获取到班级的信息和学生的信息
InputStream is = Thread.currentThread().getContextClassLoader().getResourceAsStream("mybatis-config.xml");
//创建工程
SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(is);
//获取到SqlSession
SqlSession sqlSession = factory.openSession();
//实现ClassMapper的实例对象
PermissionMapper mapper = sqlSession.getMapper(PermissionMapper.class);
//通过id查询一个权限的子权限和孙权限
List<Permissiones> permissionList = mapper.getPermission("1");
for (Permissiones permission : permissionList) {
System.out.println(permission);
}