Mybatis 快速入门之mybatis与spring集成

2023-10-26

目录

一:基本概念撰述

1. SqlSessionFactory对象,只有创建了SqlSessionFactory对象,才能调用openSession()方法得到SqlSession对象。

2. dao接口的代理对象,例如StudentDao接口,需要的代理对象为:SqlSeesion.getMapper(StudentDao.class)。

3. 数据源DataSource对象,使用一个更强大、功能更多的连接池对象代替mybatis自己的PooledDataSource。

二:将Mybatis与Spring集成的相关操作步骤

1:对pom.xml文件添加相关依赖

2:创建xml文件

3.通过插件自动生成代码

4.使用注解式开发开发方式完成开发

 @Repository:将Mapper类扫描后注入到Spring上下文(IOC)中定义成bean对象,通常作用在Mapper层

  @Service:将实现类扫描后注入到Spring上下文(IOC)中定义成bean对象,通常作用在service的实现类上(非接口)

    @Controller:将Controller类扫描后注入到Spring上下文(IOC)中定义成bean对象,通常作用在控制层,将在Spring MVC中使用

    @Component:是一个泛化的概念,仅仅表示spring中的一个组件(Bean),可以作用在任何层次

  @Scope:模式声明(singleton单模|prototype多模)

    @Autowired:将自动在代码上下文与其匹配(默认是类型匹配)的Bean,并自动注入到相应的地方

 @Resource:

@Resource后面没有任何内容,默认通过name属性去匹配bean,找不到再按type去匹配

指定了name或者type则根据指定的类型去匹配bean

指定了name和type则根据指定的name和type去匹配bean,任何一个不匹配都将报错

  @Transactional:在方法调用之前开启事务,在方法调用之后提交事务或者回滚事务,可以添加定任意地方

  5.Spring Test+Junit完美组合

6.   使用AOP编程完成分页


一:基本概念撰述

          将 MyBatis 与 Spring 进行整合,主要解决的问题就是将SqlSessionFactory 对象交由 Spring 来管理。所以,该整合,只需要将SqlSessionFactory 的对象生成器 SqlSessionFactoryBean 注册在 Spring 容器中,再将其注入给 Dao 的实现类即可完成整合。

           实现 Spring 与 MyBatis 的整合常用的方式:扫描的 Mapper 动态代理Spring 像插线板一样,mybatis 框架是插头,可以容易的组合到一起。插线板 spring 插上 mybatis,两个框架就是一个整体。

            使用mybatis,需要创建mybatis框架中的某些对象,使用这些对象,就可以使用mybatis提供的功能了。

对于mybatis执行sql语句,需要用到的对象有:

1. SqlSessionFactory对象,只有创建了SqlSessionFactory对象,才能调用openSession()方法得到SqlSession对象。

2. dao接口的代理对象,例如StudentDao接口,需要的代理对象为:SqlSeesion.getMapper(StudentDao.class)。

3. 数据源DataSource对象,使用一个更强大、功能更多的连接池对象代替mybatis自己的PooledDataSource。

二:将Mybatis与Spring集成的相关操作步骤

1:对pom.xml文件添加相关依赖

         在Mybatis与Spring集成中所需要添加依赖如下:

 ①:添加spring相关依赖(5.0.2.RELEASE)

  • spring-core
  • spring-beans
  • spring-context
  • spring-orm
  • spring-tx
  • spring-aspects
  • spring-web
//Spring版本
<spring.version>5.0.2.RELEASE</spring.version>
 <!--1)spring核心依赖-->
    <dependency>
      <groupId>org.springframework</groupId>
      <artifactId>spring-core</artifactId>
      <version>${spring.version}</version>
    </dependency>
    <!--spring ioc依赖 -->
    <dependency>
      <groupId>org.springframework</groupId>
      <artifactId>spring-beans</artifactId>
      <version>${spring.version}</version>
    </dependency>
    <!--spring 扩展依赖 -->
    <dependency>
      <groupId>org.springframework</groupId>
      <artifactId>spring-context</artifactId>
      <version>${spring.version}</version>
    </dependency>
    <!--2)spring dao层依赖-->
    <dependency>
      <groupId>org.springframework</groupId>
      <artifactId>spring-orm</artifactId>
      <version>${spring.version}</version>
    </dependency>
    <dependency>
      <groupId>org.springframework</groupId>
      <artifactId>spring-tx</artifactId>
      <version>${spring.version}</version>
    </dependency>
    <!--3)aop相关依赖 -->
    <dependency>
      <groupId>org.springframework</groupId>
      <artifactId>spring-aspects</artifactId>
      <version>${spring.version}</version>
    </dependency>
    <!--4)spring web相关依赖 -->
    <dependency>
      <groupId>org.springframework</groupId>
      <artifactId>spring-web</artifactId>
      <version>${spring.version}</version>
    </dependency>
    <!--5) spring test相关依赖 -->
    <dependency>
      <groupId>org.springframework</groupId>
      <artifactId>spring-test</artifactId>
      <version>${spring.version}</version>
    </dependency>

       注意:spring 5.0.1.RELEASE有冲突

②: 添加mybatis相关依赖

  • mybatis核心:mybatis(3.4.5)
  • Mybatis分页:pagehelper(5.1.2)
    <!--mybatis-->
    <mybatis.version>3.4.5</mybatis.version>
    <!--pagehelper-->
    <pagehelper.version>5.1.2</pagehelper.version>
  <!--mybatis -->
    <dependency>
      <groupId>org.mybatis</groupId>
      <artifactId>mybatis</artifactId>
      <version>${mybatis.version}</version>
    </dependency>
    <!--pagehelper-->
    <dependency>
      <groupId>com.github.pagehelper</groupId>
      <artifactId>pagehelper</artifactId>
      <version>${pagehelper.version}</version>
    </dependency>

    ③:spring整合mybatis(1.3.1)

  •    mybatis-spring
 <!--mybatis与spring的集成依赖-->
    <mybatis.spring.version>1.3.1</mybatis.spring.version>
   <!--mybatis与spring的集成依赖-->
    <dependency>
      <groupId>org.mybatis</groupId>
      <artifactId>mybatis-spring</artifactId>
      <version>${mybatis.spring.version}</version>
    </dependency>

  ④:添加dbcp2连接池

  • commons-dbcp2(2.1.1)
  •  commons-pool2(2.4.3)
 <!--dbcp2连接池-->
    <commons.dbcp2.version>2.1.1</commons.dbcp2.version>
    <commons.pool2.version>2.4.3</commons.pool2.version>
  <!--dbcp2连接池-->
    <dependency>
      <groupId>org.apache.commons</groupId>
      <artifactId>commons-dbcp2</artifactId>
      <version>${commons.dbcp2.version}</version>
    </dependency>
    <dependency>
      <groupId>org.apache.commons</groupId>
      <artifactId>commons-pool2</artifactId>
      <version>${commons.pool2.version}</version>
    </dependency>

⑤:添加日志配置(2.9.1)

  • log4j-core
  • log4j-api
  • log4j-web
 <!--log4j2-->
    <log4j2.version>2.9.1</log4j2.version>
 <!--核心log4j2jar包-->
    <dependency>
      <groupId>org.apache.logging.log4j</groupId>
      <artifactId>log4j-core</artifactId>
      <version>${log4j2.version}</version>
    </dependency>
    <dependency>
      <groupId>org.apache.logging.log4j</groupId>
      <artifactId>log4j-api</artifactId>
      <version>${log4j2.version}</version>
    </dependency>

⑥: 其他

  •  junit(4.12)
  •  javax.servlet-api(4.0.0)
    <!--junit+servlet-->
    <junit.version>4.13</junit.version>
    <servlet.version>4.0.1</servlet.version>
  <!--junit+servlet-->
    <dependency>
      <groupId>junit</groupId>
      <artifactId>junit</artifactId>
      <version>${junit.version}</version>
      <scope>test</scope>
    </dependency>
    <dependency>
      <groupId>javax.servlet</groupId>
      <artifactId>javax.servlet-api</artifactId>
      <version>${servlet.version}</version>
    </dependency>

完整版pom.xml文件代码如下:

<?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>com.tangyuan</groupId>
  <artifactId>ssm</artifactId>
  <version>1.0-SNAPSHOT</version>
  <packaging>war</packaging>

  <name>ssm Maven Webapp</name>
  <!-- FIXME change it to the project's website -->
  <url>http://www.example.com</url>

  <properties>
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    <maven.compiler.source>1.8</maven.compiler.source>
    <maven.compiler.target>1.8</maven.compiler.target>

    <!--junit+servlet-->
    <junit.version>4.13</junit.version>
    <servlet.version>4.0.1</servlet.version>
    <!--spring-->
    <spring.version>5.0.2.RELEASE</spring.version>
    <!--mybatis-->
    <mybatis.version>3.4.5</mybatis.version>
    <!--mybatis与spring的集成依赖-->
    <mybatis.spring.version>1.3.1</mybatis.spring.version>
    <!--mysql-->
    <mysql.version>5.1.44</mysql.version>
    <!--dbcp2连接池-->
    <commons.dbcp2.version>2.1.1</commons.dbcp2.version>
    <commons.pool2.version>2.4.3</commons.pool2.version>
    <!--log4j2-->
    <log4j2.version>2.9.1</log4j2.version>
    <!--lombok-->
    <lombok.version>1.18.12</lombok.version>
    <!--pagehelper-->
    <pagehelper.version>5.1.2</pagehelper.version>

  </properties>

  <dependencies>
    <!--junit+servlet-->
    <dependency>
      <groupId>junit</groupId>
      <artifactId>junit</artifactId>
      <version>${junit.version}</version>
      <scope>test</scope>
    </dependency>
    <dependency>
      <groupId>javax.servlet</groupId>
      <artifactId>javax.servlet-api</artifactId>
      <version>${servlet.version}</version>
    </dependency>
    <!--1)spring核心依赖-->
    <dependency>
      <groupId>org.springframework</groupId>
      <artifactId>spring-core</artifactId>
      <version>${spring.version}</version>
    </dependency>
    <!--spring ioc依赖 -->
    <dependency>
      <groupId>org.springframework</groupId>
      <artifactId>spring-beans</artifactId>
      <version>${spring.version}</version>
    </dependency>
    <!--spring 扩展依赖 -->
    <dependency>
      <groupId>org.springframework</groupId>
      <artifactId>spring-context</artifactId>
      <version>${spring.version}</version>
    </dependency>
    <!--2)spring dao层依赖-->
    <dependency>
      <groupId>org.springframework</groupId>
      <artifactId>spring-orm</artifactId>
      <version>${spring.version}</version>
    </dependency>
    <dependency>
      <groupId>org.springframework</groupId>
      <artifactId>spring-tx</artifactId>
      <version>${spring.version}</version>
    </dependency>
    <!--3)aop相关依赖 -->
    <dependency>
      <groupId>org.springframework</groupId>
      <artifactId>spring-aspects</artifactId>
      <version>${spring.version}</version>
    </dependency>
    <!--4)spring web相关依赖 -->
    <dependency>
      <groupId>org.springframework</groupId>
      <artifactId>spring-web</artifactId>
      <version>${spring.version}</version>
    </dependency>
    <!--5) spring test相关依赖 -->
    <dependency>
      <groupId>org.springframework</groupId>
      <artifactId>spring-test</artifactId>
      <version>${spring.version}</version>
    </dependency>
    <!--mysql-->
    <!-- https://mvnrepository.com/artifact/mysql/mysql-connector-java -->
    <dependency>
      <groupId>mysql</groupId>
      <artifactId>mysql-connector-java</artifactId>
      <version>${mysql.version}</version>
    </dependency>
   <!--mybatis -->
    <!-- https://mvnrepository.com/artifact/org.mybatis/mybatis -->
    <dependency>
      <groupId>org.mybatis</groupId>
      <artifactId>mybatis</artifactId>
      <version>${mybatis.version}</version>
    </dependency>
    <!--pagehelper-->
    <!-- https://mvnrepository.com/artifact/com.github.pagehelper/pagehelper -->
    <dependency>
      <groupId>com.github.pagehelper</groupId>
      <artifactId>pagehelper</artifactId>
      <version>${pagehelper.version}</version>
    </dependency>
    <!--mybatis与spring的集成依赖-->
    <!-- https://mvnrepository.com/artifact/org.mybatis/mybatis-spring -->
    <dependency>
      <groupId>org.mybatis</groupId>
      <artifactId>mybatis-spring</artifactId>
      <version>${mybatis.spring.version}</version>
    </dependency>
    <!--dbcp2连接池-->
    <!-- https://mvnrepository.com/artifact/org.apache.commons/commons-dbcp2 -->
    <dependency>
      <groupId>org.apache.commons</groupId>
      <artifactId>commons-dbcp2</artifactId>
      <version>${commons.dbcp2.version}</version>
    </dependency>
    <!-- https://mvnrepository.com/artifact/org.apache.commons/commons-pool2 -->
    <dependency>
      <groupId>org.apache.commons</groupId>
      <artifactId>commons-pool2</artifactId>
      <version>${commons.pool2.version}</version>
    </dependency>
    <!--核心log4j2jar包-->
    <dependency>
      <groupId>org.apache.logging.log4j</groupId>
      <artifactId>log4j-core</artifactId>
      <version>${log4j2.version}</version>
    </dependency>
    <dependency>
      <groupId>org.apache.logging.log4j</groupId>
      <artifactId>log4j-api</artifactId>
      <version>${log4j2.version}</version>
    </dependency>
    <!--web工程需要包含log4j-web,非web工程不需要-->
    <dependency>
      <groupId>org.apache.logging.log4j</groupId>
      <artifactId>log4j-web</artifactId>
      <version>${log4j2.version}</version>
    </dependency>
    <!--lombok-->
    <dependency>
      <groupId>org.projectlombok</groupId>
      <artifactId>lombok</artifactId>
      <version>${lombok.version}</version>
      <scope>provided</scope>
    </dependency>
  </dependencies>

  <build>
    <finalName>ssm</finalName>
    <plugins>
      <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-compiler-plugin</artifactId>
        <version>3.7.0</version>
        <configuration>
          <source>${maven.compiler.source}</source>
          <target>${maven.compiler.target}</target>
          <encoding>${project.build.sourceEncoding}</encoding>
        </configuration>
      </plugin>
      <plugin>
        <groupId>org.mybatis.generator</groupId>
        <artifactId>mybatis-generator-maven-plugin</artifactId>
        <version>1.3.2</version>
        <dependencies>
          <!--使用Mybatis-generator插件不能使用太高版本的mysql驱动 -->
          <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>${mysql.version}</version>
          </dependency>
        </dependencies>
        <configuration>
          <overwrite>true</overwrite>
        </configuration>
      </plugin>
    </plugins>
  </build>
</project>

2:创建xml文件

  (1):spring.xml文件

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


  <!--引入mybatis与spring的集成配置    -->
  <import resource="spring-mybatis.xml"/>

</beans>

    (2):spring-mybatis.xml(重点文件:mybatis与spring的集成配置)

   ①:开启注解式开发,并指定扫描包的位置

    <!--注解式开发 -->
    <!-- 注解驱动 -->
    <context:annotation-config/>
    <!-- 用注解方式注入bean,并指定查找范围:com.tangyuan及子子孙孙包-->
    <context:component-scan base-package="com.tangyuan"/>

 

 ②:引入外部jdbc配置文件

 <context:property-placeholder location="classpath:jdbc.properties"/>

   ③:配置dbcp2数据库连接池 

<bean id="dataSource" class="org.apache.commons.dbcp2.BasicDataSource"
          destroy-method="close">
        <property name="driverClassName" value="${jdbc.driver}"/>
        <property name="url" value="${jdbc.url}"/>
        <property name="username" value="${jdbc.username}"/>
        <property name="password" value="${jdbc.password}"/>
        <!--初始连接数-->
        <property name="initialSize" value="${jdbc.initialSize}"/>
        <!--最大活动连接数-->
        <property name="maxTotal" value="${jdbc.maxTotal}"/>
        <!--最大空闲连接数-->
        <property name="maxIdle" value="${jdbc.maxIdle}"/>
        <!--最小空闲连接数-->
        <property name="minIdle" value="${jdbc.minIdle}"/>
        <!--设置为-1时,如果没有可用连接,连接池会一直无限期等待,直到获取到连接为止。-->
        <!--如果设置为N(毫秒),则连接池会等待N毫秒,等待不到,则抛出异常-->
        <property name="maxWaitMillis" value="${jdbc.maxWaitMillis}"/>
    </bean>

   

④:实现spring和mybatis整合

<!--4. spring和MyBatis整合 -->
    <!--1) 创建sqlSessionFactory-->
    <bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
        <!-- 指定数据源 -->
        <property name="dataSource" ref="dataSource"/>
        <!-- 自动扫描XxxMapping.xml文件,**任意路径 -->
        <property name="mapperLocations" value="classpath*:com/tangyuan/**/mapper/*.xml"/>
        <!-- 指定别名 -->
        <property name="typeAliasesPackage" value="com/tangyuan/**/model"/>
        <!--配置pagehelper插件-->
        <property name="plugins">
            <array>
                <bean class="com.github.pagehelper.PageInterceptor">
                    <property name="properties">
                        <value>
                            helperDialect=mysql
                        </value>
                    </property>
                </bean>
            </array>
        </property>
     <!--配置mybatis相关参数-->
        <property name="configuration">
            <bean class="org.apache.ibatis.session.Configuration">
                  <!--开启驼峰命名-->
                  <!--若没有,则带有下划线的字段统统返回null值-->
                <property name="mapUnderscoreToCamelCase" value="true"></property>
            </bean>
        </property>
    </bean>

    <!--2) 自动扫描com/tangyuan/**/mapper下的所有XxxMapper接口(其实就是DAO接口),并实现这些接口,-->
    <!--   即可直接在程序中使用dao接口,不用再获取sqlsession对象-->
    <bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
        <!--basePackage 属性是映射器接口文件的包路径。-->
        <!--你可以使用分号或逗号 作为分隔符设置多于一个的包路径-->
        <property name="basePackage" value="com/tangyuan/**/mapper"/>
        <property name="sqlSessionFactoryBeanName" value="sqlSessionFactory"/>
    </bean>

   ps:第四步操作用来替代以前的MybatisSessionFactoryUtils文件,让代码更加简洁明了,如果对此文件感兴趣的,可以参考以下博客:

Mybatis 快速入门第一节 入门基础_靖康之耻的博客-CSDN博客MVC全名是ModelViewCotroller,是模型(model)——视图(view)——控制器(controller)的缩写,是一种软件设计典范,用一种业务逻辑、数据、界面显示分离的方法组织代码自定义MVCSSMaction(中转站-----servlet类)controller(控制层)biz(业务逻辑处理层)servicedao(数据访问层)mapperIXxxDAO.java(接口)XxxMapper.java(接口)XxxDAOImpl.java(实现类)...https://blog.csdn.net/qq_61313896/article/details/125969558

   ⑤:开启注解式事物配置

    <bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
        <property name="dataSource" ref="dataSource" />
    </bean>
    <!--tx  环绕通知-->
    <tx:annotation-driven transaction-manager="transactionManager" />

    ps:第五步操作用来替代以前的junit4单元测试的操作代码,让测试更加便捷,如果有感兴趣的,可以参考以前的博客:

Mybatis 快速入门第一节 入门基础_靖康之耻的博客-CSDN博客MVC全名是ModelViewCotroller,是模型(model)——视图(view)——控制器(controller)的缩写,是一种软件设计典范,用一种业务逻辑、数据、界面显示分离的方法组织代码自定义MVCSSMaction(中转站-----servlet类)controller(控制层)biz(业务逻辑处理层)servicedao(数据访问层)mapperIXxxDAO.java(接口)XxxMapper.java(接口)XxxDAOImpl.java(实现类)...https://blog.csdn.net/qq_61313896/article/details/125969558         将dbcp2数据库连接池通过ref方式注入到事物管理器中,只要拿到数据源,就能进行事务开启

   ⑥:开启动态代理

 <aop:aspectj-autoproxy/>
外部jdbc配置文件如下:
jdbc.driver=com.mysql.jdbc.Driver
jdbc.url=jdbc:mysql://localhost:3306/db_shopping?useUnicode=true&characterEncoding=UTF-8&useSSL=false
jdbc.username=root
jdbc.password=1234
jdbc.initialSize=10
jdbc.maxTotal=100
jdbc.maxIdle=50
jdbc.minIdle=10
jdbc.maxWaitMillis=-1
我的spring-mybatis.xml文件代码如下:
<?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:aop="http://www.springframework.org/schema/aop"
       xsi:schemaLocation="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.xsd http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx.xsd http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop.xsd">

    <!--1.开启注解式开发,并指定扫描包的位置 -->
    <!--注解式开发 -->
    <!-- 注解驱动 -->
    <context:annotation-config/>
    <!-- 用注解方式注入bean,并指定查找范围:com.tangyuan及子子孙孙包-->
    <context:component-scan base-package="com.tangyuan"/>
    <!--2.引入外部jdbc配置文件-->
    <context:property-placeholder location="classpath:jdbc.properties"/>
    <!--3.配置dbcp2数据库连接池-->
    <bean id="dataSource" class="org.apache.commons.dbcp2.BasicDataSource"
          destroy-method="close">
        <property name="driverClassName" value="${jdbc.driver}"/>
        <property name="url" value="${jdbc.url}"/>
        <property name="username" value="${jdbc.username}"/>
        <property name="password" value="${jdbc.password}"/>
        <!--初始连接数-->
        <property name="initialSize" value="${jdbc.initialSize}"/>
        <!--最大活动连接数-->
        <property name="maxTotal" value="${jdbc.maxTotal}"/>
        <!--最大空闲连接数-->
        <property name="maxIdle" value="${jdbc.maxIdle}"/>
        <!--最小空闲连接数-->
        <property name="minIdle" value="${jdbc.minIdle}"/>
        <!--设置为-1时,如果没有可用连接,连接池会一直无限期等待,直到获取到连接为止。-->
        <!--如果设置为N(毫秒),则连接池会等待N毫秒,等待不到,则抛出异常-->
        <property name="maxWaitMillis" value="${jdbc.maxWaitMillis}"/>
    </bean>
    <!--4.实现spring和mybatis整合 -->
    <!--4. spring和MyBatis整合 -->
    <!--1) 创建sqlSessionFactory-->
    <bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
        <!-- 指定数据源 -->
        <property name="dataSource" ref="dataSource"/>
        <!-- 自动扫描XxxMapping.xml文件,**任意路径 -->
        <property name="mapperLocations" value="classpath*:com/tangyuan/**/mapper/*.xml"/>
        <!-- 指定别名 -->
        <property name="typeAliasesPackage" value="com/tangyuan/**/model"/>
        <!--配置pagehelper插件-->
        <property name="plugins">
            <array>
                <bean class="com.github.pagehelper.PageInterceptor">
                    <property name="properties">
                        <value>
                            helperDialect=mysql
                        </value>
                    </property>
                </bean>
            </array>
        </property>
     <!--配置mybatis相关参数-->
        <property name="configuration">
            <bean class="org.apache.ibatis.session.Configuration">
                  <!--开启驼峰命名-->
                  <!--若没有,则带有下划线的字段统统返回null值-->
                <property name="mapUnderscoreToCamelCase" value="true"></property>
            </bean>
        </property>
    </bean>

    <!--2) 自动扫描com/tangyuan/**/mapper下的所有XxxMapper接口(其实就是DAO接口),并实现这些接口,-->
    <!--   即可直接在程序中使用dao接口,不用再获取sqlsession对象-->
    <bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
        <!--basePackage 属性是映射器接口文件的包路径。-->
        <!--你可以使用分号或逗号 作为分隔符设置多于一个的包路径-->
        <property name="basePackage" value="com/tangyuan/**/mapper"/>
        <property name="sqlSessionFactoryBeanName" value="sqlSessionFactory"/>
    </bean>

    <!--5.开启注解式事物配置-->
    <bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
        <property name="dataSource" ref="dataSource" />
    </bean>
    <!--tx  环绕通知-->
    <tx:annotation-driven transaction-manager="transactionManager" />

    <!--6.开启动态代理-->
    <aop:aspectj-autoproxy/>
   
</beans>

3.通过插件自动生成代码

   插件的配置请参考以前的博客:
Mybatis 快速入门第一节 入门基础_靖康之耻的博客-CSDN博客MVC全名是ModelViewCotroller,是模型(model)——视图(view)——控制器(controller)的缩写,是一种软件设计典范,用一种业务逻辑、数据、界面显示分离的方法组织代码自定义MVCSSMaction(中转站-----servlet类)controller(控制层)biz(业务逻辑处理层)servicedao(数据访问层)mapperIXxxDAO.java(接口)XxxMapper.java(接口)XxxDAOImpl.java(实现类)...https://blog.csdn.net/qq_61313896/article/details/125969558

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驱动jar包的位置-->
    <classPathEntry location="E:\repository\mvn-repository\mysql\mysql-connector-java\5.1.44"/>

    <!-- 一个数据库一个context -->
    <context id="infoGuardian">
        <!-- 注释 -->
        <commentGenerator>
            <property name="suppressAllComments" value="true"/><!-- 是否取消注释 -->
            <property name="suppressDate" value="true"/> <!-- 是否生成注释代时间戳 -->
        </commentGenerator>

        <!-- jdbc连接 -->
        <jdbcConnection driverClass="${jdbc.driver}"
                        connectionURL="${jdbc.url}" userId="${jdbc.username}" password="${jdbc.password}"/>

        <!-- 类型转换 -->
        <javaTypeResolver>
            <!-- 是否使用bigDecimal, false可自动转化以下类型(Long, Integer, Short, etc.) -->
            <property name="forceBigDecimals" value="false"/>
        </javaTypeResolver>

        <!-- 01 指定javaBean生成的位置 -->
        <!-- targetPackage:指定生成的model生成所在的包名 -->
        <!-- targetProject:指定在该项目下所在的路径  -->
        <javaModelGenerator targetPackage="com.tangyuan.model"
                            targetProject="src/main/java">
            <!-- 是否允许子包,即targetPackage.schemaName.tableName -->
            <property name="enableSubPackages" value="false"/>
            <!-- 是否对model添加构造函数 -->
            <property name="constructorBased" value="true"/>
            <!-- 是否针对string类型的字段在set的时候进行trim调用 -->
            <property name="trimStrings" value="false"/>
            <!-- 建立的Model对象是否 不可改变  即生成的Model对象不会有 setter方法,只有构造方法 -->
            <property name="immutable" value="false"/>
        </javaModelGenerator>

        <!-- 02 指定sql映射文件生成的位置 -->
        <sqlMapGenerator targetPackage="com.tangyuan.mapper"
                         targetProject="src/main/resources">
            <!-- 是否允许子包,即targetPackage.schemaName.tableName -->
            <property name="enableSubPackages" value="false"/>
        </sqlMapGenerator>

        <!-- 03 生成XxxMapper接口 -->
        <!-- type="ANNOTATEDMAPPER",生成Java Model 和基于注解的Mapper对象 -->
        <!-- type="MIXEDMAPPER",生成基于注解的Java Model 和相应的Mapper对象 -->
        <!-- type="XMLMAPPER",生成SQLMap XML文件和独立的Mapper接口 -->
        <javaClientGenerator targetPackage="com.tangyuan.mapper"
                             targetProject="src/main/java" type="XMLMAPPER">
            <!-- 是否在当前路径下新加一层schema,false路径com.oop.eksp.user.model, true:com.oop.eksp.user.model.[schemaName] -->
            <property name="enableSubPackages" value="false"/>
        </javaClientGenerator>

        <!-- 配置表信息 -->
        <!-- schema即为数据库名 -->
        <!-- tableName为对应的数据库表 -->
        <!-- domainObjectName是要生成的实体类 -->
        <!-- enable*ByExample是否生成 example类 -->
        <!--<table schema="" tableName="t_book" domainObjectName="Book"-->
               <!--enableCountByExample="false" enableDeleteByExample="false"-->
               <!--enableSelectByExample="false" enableUpdateByExample="false">-->
            <!--&lt;!&ndash; 忽略列,不生成bean 字段 &ndash;&gt;-->
            <!--&lt;!&ndash; <ignoreColumn column="FRED" /> &ndash;&gt;-->
            <!--&lt;!&ndash; 指定列的java数据类型 &ndash;&gt;-->
            <!--&lt;!&ndash; <columnOverride column="LONG_VARCHAR_FIELD" jdbcType="VARCHAR" /> &ndash;&gt;-->
        <!--</table>-->

      <!--  <table schema="" tableName="t_customer" domainObjectName="Customer"
               enableCountByExample="false" enableDeleteByExample="false"
               enableSelectByExample="false" enableUpdateByExample="false">
            &lt;!&ndash; 忽略列,不生成bean 字段 &ndash;&gt;
            &lt;!&ndash; <ignoreColumn column="FRED" /> &ndash;&gt;
            &lt;!&ndash; 指定列的java数据类型 &ndash;&gt;
            &lt;!&ndash; <columnOverride column="LONG_VARCHAR_FIELD" jdbcType="VARCHAR" /> &ndash;&gt;
        </table>
        <table schema="" tableName="t_order" domainObjectName="Order"
               enableCountByExample="false" enableDeleteByExample="false"
               enableSelectByExample="false" enableUpdateByExample="false">
            &lt;!&ndash; 忽略列,不生成bean 字段 &ndash;&gt;
            &lt;!&ndash; <ignoreColumn column="FRED" /> &ndash;&gt;
            &lt;!&ndash; 指定列的java数据类型 &ndash;&gt;
            &lt;!&ndash; <columnOverride column="LONG_VARCHAR_FIELD" jdbcType="VARCHAR" /> &ndash;&gt;
        </table>-->

         <!-- <table schema="" tableName="t_news" domainObjectName="News"
             enableCountByExample="false" enableDeleteByExample="false"
             enableSelectByExample="false" enableUpdateByExample="false">
          &lt;!&ndash; 忽略列,不生成bean 字段 &ndash;&gt;
          &lt;!&ndash; <ignoreColumn column="FRED" /> &ndash;&gt;
          &lt;!&ndash; 指定列的java数据类型 &ndash;&gt;
          &lt;!&ndash; <columnOverride column="LONG_VARCHAR_FIELD" jdbcType="VARCHAR" /> &ndash;&gt;
      </table>
      <table schema="" tableName="t_category" domainObjectName="Category"
             enableCountByExample="false" enableDeleteByExample="false"
             enableSelectByExample="false" enableUpdateByExample="false">
          &lt;!&ndash; 忽略列,不生成bean 字段 &ndash;&gt;
          &lt;!&ndash; <ignoreColumn column="FRED" /> &ndash;&gt;
          &lt;!&ndash; 指定列的java数据类型 &ndash;&gt;
          &lt;!&ndash; <columnOverride column="LONG_VARCHAR_FIELD" jdbcType="VARCHAR" /> &ndash;&gt;
      </table>
        <table schema="" tableName="t_news_category" domainObjectName="NewsCategory"
               enableCountByExample="false" enableDeleteByExample="false"
               enableSelectByExample="false" enableUpdateByExample="false">
            &lt;!&ndash; 忽略列,不生成bean 字段 &ndash;&gt;
            &lt;!&ndash; <ignoreColumn column="FRED" /> &ndash;&gt;
            &lt;!&ndash; 指定列的java数据类型 &ndash;&gt;
            &lt;!&ndash; <columnOverride column="LONG_VARCHAR_FIELD" jdbcType="VARCHAR" /> &ndash;&gt;
        </table>-->

    </context>
</generatorConfiguration>

4.使用注解式开发开发方式完成开发

问题:若要将mapper类注入到Spring IOC上下文容器中,方式有哪几种?

方式一:在spring-mybatis.xml文件中添加以下代码:(手动注入)

<bean id="bookMapper" class="com.tangyuan.mapper.BookMapper"></bean>

方式二:运用@Repository注解方式在mapper接口上定义:(自动注入)

       因为在spring-mybatis.xm中开启了注解式开发,所以可以使用注解方式来开发

  •  @Repository:将Mapper类扫描后注入到Spring上下文(IOC)中定义成bean对象,通常作用在Mapper层

package com.tangyuan.mapper;

import com.tangyuan.model.Book;
import org.springframework.stereotype.Repository;

import java.util.List;

//将BookMapper扫描后注入到Spring上下文(IOC)中定义成bean对象
//<bean id="" name="bookMapper"></bean>
@Repository
public interface BookMapper {
    int deleteByPrimaryKey(Integer bid);

    int insert(Book record);

    int insertSelective(Book record);

    Book selectByPrimaryKey(Integer bid);

    int updateByPrimaryKeySelective(Book record);

    int updateByPrimaryKey(Book record);

    List<Book> queryBookPager(Book book);
}

 

  •   @Service:将实现类扫描后注入到Spring上下文(IOC)中定义成bean对象,通常作用在service的实现类上(非接口)

package com.tangyuan.service.impl;

import com.tangyuan.service.IBookService;
import org.springframework.stereotype.Service;
/**
 * @author 唐渊
 * @create  2022-07-24 21:46
 */
@Service
//   @Service:通常作用在业务层 与上面作用一样
//   将BookServiceImpl扫描后注入到Spring上下文(IOC)中定义成bean对象 作用于Service层的实现类上(非接口类)
public class BookServiceImpl implements IBookService {
  
}

  •     @Controller:将Controller类扫描后注入到Spring上下文(IOC)中定义成bean对象,通常作用在控制层,将在Spring MVC中使用

package com.tangyuan.Controller;

import org.springframework.stereotype.Controller;

/**
 * @author 唐渊
 * @create  2022-07-27 15:31
 */

@Controller

public class IndexController {
  
}

  •     @Component:是一个泛化的概念,仅仅表示spring中的一个组件(Bean),可以作用在任何层次

        可以作用于任意一层中,将所指定的接口或类注入到Spring上下文(IOC)中定义成bean对象

        温馨提示:可以将上面四个注解方式看做setter方法,定义方式后,将其扫描后注入到Spring上下文(IOC)中定义成bean对象

  •   @Scope:模式声明(singleton单模|prototype多模)

  •     @Autowired:将自动在代码上下文与其匹配(默认是类型匹配)的Bean,并自动注入到相应的地方

 

 @Resource:

  1. @Resource后面没有任何内容,默认通过name属性去匹配bean,找不到再按type去匹配

  2. 指定了name或者type则根据指定的类型去匹配bean

  3. 指定了name和type则根据指定的name和type去匹配bean,任何一个不匹配都将报错

        温馨提示:可以将上面两个注解方式看做getter方法,定义方式后,将从Spring IOC上下文容器中获取指定的bean对象,相当于Spring中的DI(依赖注入)

package com.tangyuan.service.impl;

import com.tangyuan.mapper.BookMapper;
import com.tangyuan.service.IBookService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;


import javax.annotation.Resource;


/**
 * @author 唐渊
 * @create  2022-07-24 21:46
 */
@Service
//   @Service:通常作用在业务层 与上面作用一样
//   将BookServiceImpl扫描后注入到Spring上下文(IOC)中定义成bean对象 作用于Service层的实现类上(非接口类)
public class BookServiceImpl implements IBookService {
    //自动注入
    //Spring中的DI(依赖注入)
    //@Autowired 根据类型匹配
    @Resource  //@Resource后面没有任何内容,默认通过name属性去匹配bean,找不到再按type去匹配,如果找不到,就报错
    private BookMapper bookMapper;

    //手动注入
//    public BookMapper getBookMapper() {
//        return bookMapper;
//    }
//
//    public void setBookMapper(BookMapper bookMapper) {
//        this.bookMapper = bookMapper;
//    }
  
}

  •   @Transactional:在方法调用之前开启事务,在方法调用之后提交事务或者回滚事务,可以添加定任意地方

 @Transactional   //在方法调用之前开启事务,在方法调用之后提交事务或者回滚事务
    @Override
    public int insert(Book record) {
        //开启
        return bookMapper.insert(record);
        //提交或者回滚
    }

 

  5.Spring Test+Junit完美组合

   ①: 在工程的pom文件中增加spring-test的依赖

  <dependency>
       <groupId>org.springframework</groupId>
       <artifactId>spring-test</artifactId>
       <version>${spring.version}</version>
     </dependency>

②:创建BaseTestCase,并在该类上加上两个注解

 @RunWith(SpringJUnit4ClassRunner.class)
   @ContextConfiguration(locations={"classpath:applicationContext.xml"})
package com.tangyuan.service.impl;

import org.junit.runner.RunWith;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;

/**
 * @author 唐渊
 * @create  2022-07-27 11:32
 */
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations = {"classpath:spring.xml"})
public class BaseTest {
}

6.   使用AOP编程完成分页

              以前的分页代码封装繁琐,所以我们现在特地地使用AOP编程中的环绕通知来对以前的分页代码进行简化

         若对以前的分页代码有兴趣的,可以参考以前的博客:

Mybatis 快速入门之 动态sql和分页_靖康之耻的博客-CSDN博客1)在BookMapper类定义方法(2)在BookMapper.xml文件中进行sql语句的编写/*有参构造方法*/(3)在iBookService类编写代码(4)实现接口所定义的方法@Override}(5)进行junit4单元测试@Test//查询返回结果集适合使用返回值是自定义实体类的情况适合使用返回值的数据类型是非自定义的,即jdk的提供的类型println);}测试结果如下查看sql语句//分页查询@Override}...https://blog.csdn.net/qq_61313896/article/details/125981873?spm=1001.2014.3001.5501      

         特意编写一个类,来存放用环绕通知修改的分页代码:

package com.tangyuan.aspect;

import com.github.pagehelper.PageHelper;
import com.github.pagehelper.PageInfo;
import com.tangyuan.util.PageBean;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.springframework.stereotype.Component;

import java.util.List;

/**
 * @author 唐渊
 * @create  2022-07-25 9:46
 */
@Component
@Aspect
public class PageAspect {
    //环绕通知:前+后
    //切入点:* *..*Service.*Pager(..) 代表多个连接点集合
    //* 代表方法返回值不限
    //*.. 代表包名不限
    //*Service 代表以service结尾的类或者是接口
    //*Pager 代表以Pager结尾的方法
    // (..) 代表方法的参数不限
    //适配器:通知+切入点
    @Around(value = "execution(* *..*Service.*Pager(..))")
    public Object invoke(ProceedingJoinPoint joinPoint) throws Throwable {
        //获取目标的执行参数
        Object[] params = joinPoint.getArgs();
        //定义pagebean对象
        PageBean pageBean = null;
        //循环参数
        for (Object param : params) {
            //判断参数的类型是否是pagebean
            if (param instanceof PageBean) {
                pageBean = (PageBean) param;
                break;
            }
        }

        //判断是否分页
        if (null != pageBean && pageBean.isPagination())
            PageHelper.startPage(pageBean.getPage(), pageBean.getRows());

        //执行目标方法
        Object returnValue = joinPoint.proceed(params);

        if (null != pageBean && pageBean.isPagination()){
            if (returnValue instanceof List){
                List list = (List) returnValue;
               PageInfo pageInfo = new PageInfo(list);
                pageBean.setTotal(pageInfo.getTotal()+"");
    }
}
         return  returnValue;
    }



}

   

     方法测试:

 @Test
    public void queryBookPager(){
        PageBean pageBean=new PageBean();
        List<Book> books = bookService.queryBookPager(Book.builder().build(),pageBean);
        System.out.println("总记录数:"+pageBean.getTotal());
         books.forEach(System.out::println);


    }

}

   测试结果:      

 

查看sql语句:

 

     本人刚涉及此方面,博客可能有些地方不好,欢迎各位大佬前来一起讨论斧正

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Mybatis 快速入门之mybatis与spring集成 的相关文章

  • 编码java Cookie值

    应如何对 Java Cookie 对象的实际值进行编码 我无法传递 等字符或 US ASCII 之外的任何字符 Br 乔因斯 如何并不重要 但通常Base64 http en wikipedia org wiki Base64应该可以正常工
  • 如何判断lucene索引版本?

    我正在编写一个 shell 脚本 csh 它必须确定 lucene 索引版本 然后根据该版本将索引升级到下一个版本 所以 如果 lucene 索引是 2 x 我必须将索引升级到 3 x 最后索引需要升级到6 x 由于升级索引是一个顺序过程
  • Java发送邮件出错

    我的代码是 File Name SendEmail java import java util import javax mail import javax mail internet import javax activation pub
  • 如何在java中使用cypher加载CSV文件?

    我是密码新手 我想在java中使用cypher加载csv 我用谷歌搜索并找到了以下作品 LOAD CSV WITH HEADERS FROM http neo4j com docs 2 3 1 csv import movies csv A
  • VideoView SeekTo 在不同设备上工作异常 - Android

    我在视频视图上使用此代码来寻求自定义位置 但它在三星设备上工作正常 但在索尼设备上 视频寻求开始位置 开始 我想让视频回到上次暂停的位置 创建视频视图 VideoView mVideoPlayer setVideoPath ViDpath
  • Android ArrayList 的 IndexOutOfBoundsException [重复]

    这个问题在这里已经有答案了 我遇到了一个非常烦人的问题 一些代码抛出 IndexOutOfBoundsException 我真的不明白为什么 logcat 指向以下代码的 addTimetableItem 我们将对此进行更多解释 if so
  • Spring Boot 动态重置数据源

    当 Spring 配置文件或自定义数据库属性文件中的数据库名称 密码或主机名等数据库属性发生更改时 我尝试更新 Spring Boot 中的数据源 当属性更改时 应用程序必须通过侦听属性更改来自行更新 一旦数据库配置发生更改 我就使用 Sp
  • 使用 pdfbox 1.8.8 进行视觉签名

    我正在尝试生成带有视觉签名和 pdfbox 的 PDF 我有两个流 似乎 pdfbox 只能处理文件 如果没有三个临时文件 我就无法使其工作 我可以看到从here https github com apache pdfbox blob b7
  • Java - 多线程代码在更多内核上运行速度并不更快

    我只是在 4 核机器上运行一些多线程代码 希望它比在单核机器上更快 想法是这样的 我有固定数量的线程 在我的例子中每个核心一个线程 每个线程执行一个Runnable形式 private static int data data shared
  • java中如何将字符串日期转换为时间戳?

    我想在java中将字符串日期转换为时间戳 我编写了以下编码 我声明 date1 的日期是 7 11 11 12 13 14 SimpleDateFormat datetimeFormatter1 new SimpleDateFormat y
  • 编写大 JSON 文件避免内存不足问题的最佳方法

    首先 请注意今天是我第一天GSON 我正在尝试使用编写 Json 文件GSON图书馆 我有几千个JsonObjects里面一个ArrayList 当写入 Json 文件时 它应该看起来与此类似 hash index 00102x05h06l
  • 无法运行正在访问 GlassFish v3 上的 EJB 的应用程序客户端

    环境 GlassFish 3 0 1 NetBeans 6 9 JDK 6u21 Problem 无法运行正在访问 EJB 的应用程序客户端 错误报告可以在下面找到http netbeans org bugzilla show bug cg
  • 使用 Google Collections 创建弱多重地图

    是否有与 MultiMaps 的 MapMaker 相当的工具 目前我像这样创建缓存 public static Map
  • 读取pkcs12证书信息

    我在读取证书信息时遇到问题 我想以编程方式在 Android 中使用 java 和 bouncycastle 库来阅读完整信息 现在 我只是在控制台中使用 keytool 命令 gt keytool list keystore 1 p12
  • Java垂直布局?

    我需要将 JLabel 垂直放置在一些 JButton 上 就像游戏菜单一样 它们都应该居中 我已经下载了 MigLayout 但我不知道如何使用它 所以我只是想要一种方法来垂直和居中定位我的组件 无论 MigLayout 与否 另外 我不
  • MultipartEntity 类型已弃用

    文档说org apache http entity mime MultipartEntity http hc apache org httpcomponents client ga httpmime apidocs org apache h
  • 如何从 InputStream 读取一行而不缓冲输入? [复制]

    这个问题在这里已经有答案了 我有一个输入流 其中包含一行字符串 然后是二进制数据 如果我使用读取该行new BufferedReader new InputStreamReader inputStream 二进制数据也正在被读取并且不能被重
  • ORA-02289: 序列不存在,hibernbate 中出错

    ORA 02289 序列不存在 hibernbate 中出错 在 Oracle 中 您无法自动生成值 您应该创建一个序列 我们称之为 VEHICLE SEQ 然后你应该把这个注释放在你的 id 上 GeneratedValue strate
  • 奇怪的 Atomikos 异常 - init() 中的错误:日志已在使用中?

    我们尝试在多个本地环境上运行相同的 Web 应用程序 该应用程序使用 Atomikos 作为事务管理器 每个环境都使用相同版本的 spring atomikos tomact 等 并具有相同的配置文件 其中一些工作正常 但其中之一 当我们尝
  • Java 中的无符号字节

    Java 中的字节默认是有符号的 我在其他帖子中看到 具有无符号字节的解决方法类似于 int num int bite 0xFF 有人可以向我解释一下为什么它会起作用并将有符号字节转换为无符号字节 然后将其转换为相应的整数吗 ANDing一

随机推荐

  • 【对比Java学Kotlin】在 foreach 中使用 break&continue

    正常情况下 我们只能在 loop 中使用 break 和 continue 但是 foreach 是扩展函数 不属于 loop 的范畴 如果我们想在 foreach 中达到 break 和 continue 的效果 只能使用 return
  • echo source 命令与 setup.bash与.bashrc文件

    编译完毕后键 echo source catkin ws devel setup bash gt gt bashrc source bashrc 本文分析这两条命令 echo 与source 以及setup bash文件与 bashrc两个
  • Flutter 布局Row(水平方向布局)、Column(垂直方向布局)、Wrap(可以自动换行的布局)、Flex(弹性布局)、Stack(叠层布局)、

    1 线性布局 Row 水平方向布局 Row 表示水平方向子组件的布局顺序 是从左往右还是从右往左 默认为系统当前Locale环境的文本方向 如中文 英语都是从左往右 而阿拉伯语是从右往左 TextDirection textDirectio
  • 通过模拟退火改进的Elman神经网络(Matlab代码实现)

    目录 1 概述 2 运行结果 3 参考文献 4 Matlab代码 1 概述 神经网络是一个庞大的体系和概念 根据处理信息的不同方式来区分不同的network 比如根据处理信息结果的传递方向 分前馈型与反馈型 前馈型网络会根据输出数值来调整网
  • dede php调用指定文章,DedeCMS调用指定文章内容的两种实现方法

    有时候我们需要dedecms能够调用指定文章的内容 尤其是在建企业网站的时候 需要在首页调用网站简介联系我们什么的 今天 织梦技术研究中心就给大家介绍两种实现调用指定文章内容的方法 方法一 打开include inc arcpart vie
  • Golang基础 函数详解 函数基础

    文章目录 01 函数声明 02 更多样的参数列表 03 更灵活的返回值列表 参考资料 函数是一个固定的 可重复使用的程序段 子程序 它在实现单一或相关联功能的同时 还可以带有入口和出口 所谓的入口 就是函数参数即形参 通过这个入口把函数的参
  • 最强 Verilog 中 IP核 调用实现及思想

    写在前面 无论是在 ISE 还是 Vivado 中 关于 IP核 的调用都是非常方便的 所以对于初学者来说最关键的不是在 IP Catalog 中设置相关的 IP核 参数 而是在生成相关的 IP核 后该怎么做 也即如何让这些 IP核 为项目
  • 海思3516系列芯片SPI速率慢问题深入研究与优化(基于PL022 SPI 控制器)

    海思3516系列芯片SPI速率慢问题深入分析与优化 基于PL022 SPI 控制器 我在某个海思主控的项目中需要使用SPI接口来驱动一块液晶屏 液晶屏主控为 st7789 分辨率 240x240 图像格式 RGB565 查阅海思相关手册可知
  • HDU - 1598之为达目的不择手段(并查集的应用)

    find the most comfortable road Time Limit 1000 1000 MS Java Others Memory Limit 32768 32768 K Java Others Total Submissi
  • docker快速搭建redis集群(两种暴露宿主网络的方法)

    宿主机IP 192 168 123 181 方案一 host网络模式 1 新建6个容器节点 for port in seq 4001 4006 do docker run itd name redis port network host v
  • Java线程:volatile关键字

    本文转载至 http lavasoft blog 51cto com 62575 222076 Java线程 volatile关键字 Java 语言包含两种内在的同步机制 同步块 或方法 和 volatile 变量 这两种机制的提出都是为了
  • 自制个人图床

    如何自制个人图床 有时候我们想要将自己的图片以链接的形式展示 就得需要使用图床 或者上传到自己的服务器 别人的图床会担心图片链接过期 然而自己的服务器会占用内存资源 所以我们就自制个人图床 首先你得有服务器和域名 好了废话不多说直接上教程
  • 2021-10-21

    当打开一个页面 需要第一行显示当前用户能够领取奖励的按钮 应用场景 1 当某些游戏有在线领奖的活动 比如在线10分钟 20分钟 以此类推可以领取一些奖励 当有很多时 页面装不下的时候 我们希望显示的第一个就是玩家可以领取的奖励 比如10分钟
  • C++—类和对象

    文章目录 1 类 2 对象 2 1 创建对象 2 2 对象的操作 2 3 构造函数 2 4 析构函数 3 静态成员 4 this指针 5 友元 一切我们研究的事物 都可以叫做对象 对象具有状态 操作和行为 通常用一个数值来描述对象的状态 对
  • DVWA ----Buete Force

    DVWA Buete Force 暴力破解 low 直接使用Burip suite来进行暴力破解 medium 与low的方法一样 但是在破解速度上比较慢 因为在源代码中多了sleep 函数 high 同样使用Burip suite进行暴力
  • RK3588开发板上使用Qt+OpenCV捕获摄像头图像

    在Qt下没有专门的视频采集与播放工具 这里使用了OpenCV所带的库函数捕获摄像头的视频图像 硬件环境 讯为RK3588开发板 OV5695 MIPI接口 摄像头 软件版本 OS ubuntu20 04镜像固件 QT 5 12 8 Qt C
  • 安全运营场景下的语言模型应用

    接上篇 将安全运营的定义为 使用算法能力提取关键信息 以此来规避算法误判漏判带来的责任问题 同时提升运营人员的工作效率 在这篇尝试对语言模型的使用方法做一下讨论和分享 1 语言模型 先聊一下语言模型 这里刻意规避了 大模型 这个词 主要是对
  • 【Python】循环语句

    目录 1 while 循环 2 for 循环 3 continue 4 break 1 while 循环 基本语法格式 while 条件 循环体 条件为真 则执行循环体代码 条件为假 则结束循环 例1 打印 1 10 的整数 num 1 w
  • pyspark合并两个dataframe_PySpark源码解析,教你用Python调用高效Scala接口

    在数据科学领域 Python 一直占据比较重要的地位 仍然有大量的数据工程师在使用各类 Python 数据处理和科学计算的库 例如 numpy Pandas scikit learn 等 相较于Scala语言而言 Python具有其独有的优
  • Mybatis 快速入门之mybatis与spring集成

    目录 一 基本概念撰述 1 SqlSessionFactory对象 只有创建了SqlSessionFactory对象 才能调用openSession 方法得到SqlSession对象 2 dao接口的代理对象 例如StudentDao接口