MyBatis从前世到今生一网打尽(全网最全,建议收藏)5️⃣

举报
XiaoLin_Java 发表于 2022/01/21 23:05:15 2022/01/21
【摘要】 八、MyBatis 逆向工程 8.1、逆向工程简介MyBatis Generator: 简称 MBG,是一个专门为 MyBatis 框架使用者定制的代码生成器,可以快速的根据表生成对应的映射文件,接口,以及 bean 类。支持基本的增删改查,以及 QBC 风格的条件查询。但是表连接、存储过程等这些复杂 sql 的定义需要我们手工编写官方文档地址http://www.mybatis.org/...

八、MyBatis 逆向工程

8.1、逆向工程简介

MyBatis Generator: 简称 MBG,是一个专门为 MyBatis 框架使用者定制的代码生成器,可以快速的根据表生成对应的映射文件,接口,以及 bean 类。支持基本的增删改查,以及 QBC 风格的条件查询。但是表连接、存储过程等这些复杂 sql 的定义需要我们手工编写

官方文档地址
http://www.mybatis.org/generator/
官方工程地址
https://github.com/mybatis/generator/releases

8.2、逆向工程的配置

  1. 导入逆向工程的 jar 包:mybatis-generator-core-1.3.2.jar
  2. 编写 MBG 的配置文件(重要几处配置),可参考官方手册
<?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>
<!--
targetRuntime: 执行生成的逆向工程的版本
MyBatis3Simple: 生成基本的CRUD
MyBatis3: 生成带条件的CRUD
-->
<context id="DB2Tables" targetRuntime="MyBatis3">
<jdbcConnection driverClass="com.mysql.jdbc.Driver"
connectionURL="jdbc:mysql://localhost:3306/mybatis_1129"
userId="root"
password="1234">
</jdbcConnection>
<!-- javaBean的生成策略-->
<javaModelGenerator targetPackage="com.atguigu.mybatis.beans"
                    targetProject=".\src">
<property name="enableSubPackages" value="true" />
<property name="trimStrings" value="true" />
</javaModelGenerator>
<!-- SQL映射文件的生成策略 -->
<sqlMapGenerator targetPackage="com.atguigu.mybatis.dao"
targetProject=".\conf">
<property name="enableSubPackages" value="true" />
</sqlMapGenerator>

<!-- Mapper接口的生成策略 -->
<javaClientGenerator type="XMLMAPPER"
targetPackage="com.atguigu.mybatis.dao" targetProject=".\src">
<property name="enableSubPackages" value="true" />
</javaClientGenerator>
<!-- 逆向分析的表 -->
<table tableName="tbl_dept" domainObjectName="Department"></table>
<table tableName="tbl_employee" domainObjectName="Employee"></table>
</context>
</generatorConfiguration>
  1. 编写java代码运行
    @Test
    public void testMBG() throws Exception {
        List<String> warnings = new ArrayList<String>();
        boolean overwrite = true;
        File configFile = new File("mbg.xml");
        ConfigurationParser cp = new ConfigurationParser(warnings);
        Configuration config = cp.parseConfiguration(configFile);
        DefaultShellCallback callback = new DefaultShellCallback(overwrite);
        MyBatisGenerator myBatisGenerator = new MyBatisGenerator(config,
                callback, warnings);
        myBatisGenerator.generate(null);
    }

8.3、逆向工程的使用

基本查询的测试

 @Test
    public void testSelect() throws Exception {
        SqlSessionFactory ssf = getSqlSessionFactory();
        SqlSession session = ssf.openSession();
        try {
            EmployeeMapper mapper =
                    session.getMapper(EmployeeMapper.class);
            List<Employee> emps = mapper.selectAll();
            for (Employee employee : emps) {
                System.out.println(employee);
            }
        } finally {
            session.close();
        }
    }

带条件查询的测试

    @Test
    public void testSelect() throws Exception {
        SqlSessionFactory ssf = getSqlSessionFactory();
        SqlSession session = ssf.openSession();
        try {
            EmployeeMapper mapper =
                    session.getMapper(EmployeeMapper.class);
//条件查询: 名字中带有'张' 并且 email中'j' 或者 did = 2
            EmployeeExample example = new EmployeeExample();
            Criteria criteria = example.createCriteria();
            criteria.andLastNameLike("%张%");
            criteria.andEmailLike("%j%");
//or
            Criteria criteriaOr = example.createCriteria();
            criteriaOr.andDIdEqualTo(2);
            example.or(criteriaOr);
            List<Employee> emps = mapper.selectByExample(example);
            for (Employee employee : emps) {
                System.out.println(employee);
            }
        } finally {
            session.close();
        }
    }

#九、扩展-PageHelper 分页插件

9.1、PageHelper 分页插件简介

PageHelper 是 MyBatis 中非常方便的第三方分页插件,官方文档:https://github.com/pagehelper/Mybatis-PageHelper/blob/master/README_zh.md

9.2、PageHelper 的使用步骤

  1. 导入相关包 pagehelper-x.x.x.jar 和 jsqlparser-0.9.5.jar

  2. 在 MyBatis 全局配置文件中配置分页插件

<plugins>
<plugin interceptor="com.github.pagehelper.PageInterceptor"></plugin>
</plugins>
  1. 使用 PageHelper 提供的方法进行分页

  2. 可以使用更强大的 PageInfo 封装返回结果

9.3、Page 对象的使用

在查询之前通过 PageHelper.startPage(页码,条数)设置分页信息,该方法返回 Page 对象


    @Test
    public void testPageHelper() throws Exception{
        SqlSessionFactory ssf = getSqlSessionFactory();
        SqlSession session = ssf.openSession();
        try {
            EmployeeMapper mapper =
                    session.getMapper(EmployeeMapper.class);
//设置分页信息
            Page<Object> page = PageHelper.startPage(9, 1);
             List<Employee> emps = mapper.getAllEmps();
for (Employee employee : emps) {
        System.out.println(employee);
    }
		System.out.println("=============获取分页相关的信息
        =================");
        System.out.println("当前页: " + page.getPageNum());
		System.out.println("总页码: " + page.getPages());
		System.out.println("总条数: " + page.getTotal());
		System.out.println("每页显示的条数: " + page.getPageSize());
} finally {
        session.close();
        }
      }

9.4、PageInfo 对象的使用

在查询完数据后,使用 PageInfo 对象封装查询结果,可以获取更详细的分页信息以及可以完成分页逻辑

    @Test
    public void testPageHelper1() throws Exception{
        SqlSessionFactory ssf = getSqlSessionFactory();
        SqlSession session = ssf.openSession();
        try {
            EmployeeMapper mapper =
                    session.getMapper(EmployeeMapper.class);
//设置分页信息
            Page<Object> page = PageHelper.startPage(9, 1);
            List<Employee> emps = mapper.getAllEmps();
//
            PageInfo<Employee> info = new PageInfo<>(emps,5);
            for (Employee employee : emps) {
                System.out.println(employee);
            }
            System.out.println("=============获取详细分页相关的信息
                    =================");
            System.out.println("当前页: " + info.getPageNum());
            System.out.println("总页码: " + info.getPages());
            System.out.println("总条数: " + info.getTotal());
            System.out.println("每页显示的条数: " + info.getPageSize());
            System.out.println("是否是第一页: " + info.isIsFirstPage());
			System.out.println("是否是最后一页: " + info.isIsLastPage());
			System.out.println("是否有上一页: " + info.isHasPreviousPage());
			System.out.println("是否有下一页: " + info.isHasNextPage());
			System.out.println("============分页逻辑===============");
    int [] nums = info.getNavigatepageNums();
	for (int i : nums) {
        System.out.print(i +" " );
    }
} finally {
        session.close();
        }

        }

十、SSM 框架整合

10.1、整合注意事项

  1. 查看不同 MyBatis 版本整合 Spring 时使用的适配包;

image-20201010152502489

  1. 下载整合适配包:https://github.com/mybatis/spring/releases
  2. 官方整合示例,jpetstore:https://github.com/mybatis/jpetstore-6

10.2、整合思路、步骤

搭建环境

创建一个动态的 WEB 工程,导入 SSM 需要使用的 jar 包,导入整合适配包,导入其他技术的一些支持包 连接池 数据库驱动 日志…

Spring + Springmvc

  1. 在web.xml 中配置: Springmvc 的前端控制器 实例化Spring 容器的监听器 ,字符编码过滤器 REST 过滤器
  2. 创建 Spring 的配置文件: applicationContext.xml:组件扫描、 连接池、 事务…
  3. 创建 Springmvc 的配置文件: springmvc.xml : 组件扫描、 视图解析器

MyBatis

  1. 创建 MyBatis 的全局配置文件
  2. 编写实体类 Mapper 接口 Mapper 映射文件

Spring + MyBatis

  1. MyBatis 的 SqlSession 的创建 .
  2. MyBatis 的 Mapper 接口的代理实现类

测试

10.3、整合的配置

10.3.1、web.xml

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns="http://java.sun.com/xml/ns/javaee"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" id="WebApp_ID" version="2.5">
<!-- 字符编码过滤器 -->
<filter>
	<filter-name>CharacterEncodingFilter</filter-name>
	<filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
	<init-param>
		<param-name>encoding</param-name>
		<param-value>UTF-8</param-value>
	</init-param>
</filter>
<filter-mapping>
	<filter-name>CharacterEncodingFilter</filter-name>
	<url-pattern>/*</url-pattern>
</filter-mapping>
    <!-- REST 过滤器 -->
<filter>
<filter-name>HiddenHttpMethodFilter</filter-name>
<filter-class>org.springframework.web.filter.HiddenHttpMethodFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>HiddenHttpMethodFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>

<!-- 实例化SpringIOC容器的监听器 -->
<context-param>
	<param-name>contextConfigLocation</param-name>
	<param-value>classpath:applicationContext.xml</param-value>
</context-param>

<listener>
	<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>

<!-- Springmvc的前端控制器 -->
<servlet>
	<servlet-name>springDispatcherServlet</servlet-name>
	<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
	<init-param>
		<param-name>contextConfigLocation</param-name>
		<param-value>classpath:springmvc.xml</param-value>
	</init-param>
	<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
	<servlet-name>springDispatcherServlet</servlet-name>
	<url-pattern>/</url-pattern>
</servlet-mapping>
</web-app>

10.3.2、Spring 配置

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:context="http://www.springframework.org/schema/context"
       xmlns:tx="http://www.springframework.org/schema/tx"
       xmlns:mybatis-spring="http://mybatis.org/schema/mybatis-spring"
       xsi:schemaLocation="http://mybatis.org/schema/mybatis-spring
http://mybatis.org/schema/mybatis-spring-1.2.xsd
http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-4.0.xsd
http://www.springframework.org/schema/tx
http://www.springframework.org/schema/tx/spring-tx-4.0.xsd">

    <!-- 组件扫描 -->
    <context:component-scan base-package="com.atguigu.ssm">
        <context:exclude-filter type="annotation"
                                expression="org.springframework.stereotype.Controller"/>
    </context:component-scan>

    <!-- 连接池 -->
    <context:property-placeholder location="classpath:db.properties"/>
    <bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource">
        <property name="driverClass" value="${jdbc.driver}"></property>
        <property name="jdbcUrl" value="${jdbc.url}"></property>
        <property name="user" value="${jdbc.username}"></property>
        <property name="password" value="${jdbc.password}"></property>

    </bean>

    <!-- 事务 -->
    <bean id="dataSourceTransactionManager"
          class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
        <property name="dataSource" ref="dataSource"></property>
    </bean>
    <tx:annotation-driven transaction-manager="dataSourceTransactionManager"/>
</beans>

10.3.3 SpringMVC 配置

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:context="http://www.springframework.org/schema/context"
       xmlns:mvc="http://www.springframework.org/schema/mvc"
       xsi:schemaLocation="http://www.springframework.org/schema/mvc
http://www.springframework.org/schema/mvc/spring-mvc-4.0.xsd
http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-4.0.xsd">
    <!-- 组件扫描 -->
    <context:component-scan base-package="com.atguigu.ssm" use-default-filters="false">
        <context:include-filter type="annotation"
                                expression="org.springframework.stereotype.Controller"/>
    </context:component-scan>
    <!--视图解析器 -->
    <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
        <property name="prefix" value="/WEB-INF/views/"></property>
        <property name="suffix" value=".jsp"></property>
    </bean>

    <mvc:default-servlet-handler/>
    <mvc:annotation-driven/>
</beans>

10.3.4、MyBatis 配置

全局文件的配置

<?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>
    <!-- Spring 整合 MyBatis 后, MyBatis中配置数据源,事务等一些配置都可以
    迁移到Spring的整合配置中。MyBatis配置文件中只需要配置与MyBatis相关
    的即可。
    -->
    <!-- settings: 包含很多重要的设置项 -->
    <settings>
        <!-- 映射下划线到驼峰命名 -->
        <setting name="mapUnderscoreToCamelCase" value="true"/>
        <!-- 设置Mybatis对null值的默认处理 -->
        <setting name="jdbcTypeForNull" value="NULL"/>
        <!-- 开启延迟加载 -->
        <setting name="lazyLoadingEnabled" value="true"/>
        <!-- 设置加载的数据是按需还是全部 -->
        <setting name="aggressiveLazyLoading" value="false"/>
        <!-- 配置开启二级缓存 -->
        <setting name="cacheEnabled" value="true"/>
    </settings>
</configuration>

SQL 映射文件配置

<?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="com.atguigu.ssm.mapper.EmployeeMapper">
    <!-- public List<Employee> getAllEmps(); -->
    <select id="getAllEmps" resultMap="myEmpsAndDept" >
        select e.id eid, e.last_name,e.email,e.gender, d.id did, d.dept_name
        from tbl_employee e ,tbl_dept d
        where e.d_id = d.id
    </select>
    <resultMap type="com.atguigu.ssm.beans.Employee" id="myEmpsAndDept">
        <id column="eid" property="id"/>
        <result column="last_name" property="lastName"/>
        <result column="email" property="email"/>
        <result column="gender" property="gender"/>
        <association property="dept" javaType="com.atguigu.ssm.beans.Department">
            <id column="did" property="id"/>
            <result column="dept_name" property="departmentName"/>
        </association>
    </resultMap>
</mapper>

Spring 整合 MyBatis 配置

<!-- Spring 整合 Mybatis -->
<!--1. SqlSession -->
<bean class="org.mybatis.spring.SqlSessionFactoryBean">
<!-- 指定数据源 -->
<property name="dataSource" ref="dataSource"></property>
<!-- MyBatis的配置文件 -->
<property name="configLocation"
value="classpath:mybatis-config.xml"></property>
<!-- MyBatis的SQL映射文件 -->
<property name="mapperLocations"
value="classpath:mybatis/mapper/*.xml"></property>
<property name="typeAliasesPackage"
value="com.atguigu.ssm.beans"></property>
</bean>
<!-- Mapper接口
MapperScannerConfigurer 为指定包下的Mapper接口批量生成代理实现类.bean
的默认id是接口名首字母小写.
-->
<bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
<property name="basePackage" value="com.atguigu.ssm.mapper"></property>
</bean>
<!-- <mybatis-spring:scan base-package="com.atguigu.ssm.mapper"/> -->

测试

【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。