Spring项目整合基本操作-含源码与项目结构

203 阅读2分钟

Spring项目整合

1、在pox文件中配置相关依赖

2、配置jdbc.properties文件

  • mysql配置:
jdbc.driver=com.mysql.jdbc.Driver
jdbc.url=jdbc:mysql:?
jdbc.username=?
jdbc.password=?
  • redis配置
#连接端口
redis.port=6379
#连接地址
redis.host=127.0.0.1
#超时时间:单位ms
redis.timeout=3000
#授权密码
redis.password=
#最大连接数:能够同时建立的“最大链接个数”
redis.maxTotal=200
#最大空闲数:空闲链接数大于maxIdle时,将进行回收
redis.maxIdle=20
#最小空闲数:低于minIdle时,将创建新的链接
redis.minIdle=5
#最大等待时间:单位ms
redis.maxWait=3000
#使用连接时,检测连接是否成功
redis.testOnBorrow=true

3、配置log4j日志文件properties

#代表root节点整个工程下所有输出日志的地方配置的输出的级别和输出的位置。
log4j.rootLogger=DEBUG,Console,D
#代表配置控制台的类。
log4j.appender.Console=org.apache.log4j.ConsoleAppender
log4j.appender.Console.layout=org.apache.log4j.PatternLayout
log4j.appender.Console.layout.ConversionPattern=%d [%t] %-5p [%c] - %m%n
log4j.logger.org.apache=INFO
​
log4j.logger.java.sql.ResultSet=INFO
log4j.logger.java.sql.Connection=DEBUG  
log4j.logger.java.sql.Statement=DEBUG  
log4j.logger.java.sql.PreparedStatement=DEBUG
### 输出到日志文件 ###
log4j.appender.D = org.apache.log4j.DailyRollingFileAppender
log4j.appender.D.File = logs/mybatis.log
log4j.appender.D.Append = true
log4j.appender.D.Threshold = DEBUG
log4j.appender.D.layout = org.apache.log4j.PatternLayout
log4j.appender.D.layout.ConversionPattern =%-d{yyyy-MM-dd HH:mm:ss}  [ %t:%r ] - [ %p ]  %m%n

4、mybatis-config.xml文件

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configuration
        PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
        "https://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration></configuration>

5、spring-db.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:contxt="http://www.springframework.org/schema/context"
       xmlns:context="http://www.springframework.org/schema/context"
       xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context https://www.springframework.org/schema/context/spring-context.xsd">
<!--    注解扫描-->
    <contxt:component-scan base-package="com">
<!--        springmvc中的注解不扫-->
        <contxt:exclude-filter type="annotation" expression="org.springframework.stereotype.Controller"/>
        <contxt:exclude-filter type="annotation" expression="org.springframework.web.bind.annotation.RestController"/>
    </contxt:component-scan>
<!--    开启注解模式-->
    <contxt:annotation-config/>
<!--    引入jdbc配置文件-->
    <context:property-placeholder location="classpath:/jdbc.properties"></context:property-placeholder>
    <!--配置数据库连接池(druid) -->
    <bean id="dataSource"
          class="com.alibaba.druid.pool.DruidDataSource" init-method="init"
          destroy-method="close">
        <!--配置连接池属性 -->
        <!--配置驱动类名字 -->
        <property name="driverClassName" value="${jdbc.driver}" />
        <!-- 基本属性 url、user、password -->
        <property name="url" value="${jdbc.url}" />
        <property name="username" value="${jdbc.username}" />
        <property name="password" value="${jdbc.password}" />
        <!-- 配置初始化大小、最小、最大 -->
        <property name="initialSize" value="5" />
        <property name="minIdle" value="5" />
        <property name="maxActive" value="20" />
        <!-- 配置获取连接等待超时的时间 -->
        <property name="maxWait" value="60000" />
        <!-- 配置间隔多久才进行一次检测,检测需要关闭的空闲连接,单位是毫秒 -->
        <property name="timeBetweenEvictionRunsMillis" value="60000" />
        <!-- 配置一个连接在池中最小生存的时间,单位是毫秒 -->
        <property name="minEvictableIdleTimeMillis" value="300000" />
        <!-- 验证连接有效与否的SQL,不同的数据配置不同 -->
        <property name="validationQuery" value="select 1" />
        <!-- 建议配置为true,不影响性能,并且保证安全性。申请连接的时候检测,如果空闲时间大于timeBetweenEvictionRunsMillis,执行validationQuery检测连接是否有效。 -->
        <property name="testWhileIdle" value="true" />
        <!-- 这里建议配置为TRUE,防止取到的连接不可用,但会影响性能 -->
        <property name="testOnBorrow" value="false" />
        <!-- 归还连接时执行validationQuery检测连接是否有效,做了这个配置会降低性能 -->
        <property name="testOnReturn" value="false" />
    </bean>
</beans>

6、通用mapper扫描、分页组件配置、数据源配置

<?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">
<!--通用mapper扫描-->
    <bean class="tk.mybatis.spring.mapper.MapperScannerConfigurer">
<!--        注册mapper接口-->
        <property name="basePackage" value="com.zking.mapper"></property>
    </bean>
<!--   SqlSessionFactoryBean sqlsession连接工厂 -->
    <bean class="org.mybatis.spring.SqlSessionFactoryBean">
<!--        分页插件-->
        <!-- 注意其他配置 -->
        <property name="plugins">
            <array>
                <bean class="com.github.pagehelper.PageInterceptor">
                    <property name="properties">
                        <!--使用下面的方式配置参数,一行配置一个 -->
                        <value>
                            helperDialect=mysql
                            reasonable=true
                        </value>
                    </property>
                </bean>
            </array>
        </property>
<!--        数据源配置-->
        <property name="dataSource" ref="dataSource"></property>
<!--        mapper .xml 文件扫描 如果有就写,-->
        <property name="mapperLocations" value="classpath:/mapper/*.xml"></property>
<!--    实体别名设置 实体名作为别名-->
        <property name="typeAliasesPackage" value="com.zking.entity"></property>
<!--        引入mybatis 如果有就写-->
        <property name="configLocation" value="classpath:/mybatis-config.xml"></property>
    </bean>
</beans>

6、redis缓存配置

  • spring-redis.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"
       xsi:schemaLocation="http://www.springframework.org/schema/beans
       http://www.springframework.org/schema/beans/spring-beans.xsd
       http://www.springframework.org/schema/context
       https://www.springframework.org/schema/context/spring-context.xsd">
    <!--设置jedisPool链接池的配置-->
    <bean id="jedisPoolConfig" class="redis.clients.jedis.JedisPoolConfig">
        <property name="maxTotal" value="${redis.maxTotal}"/>
        <property name="maxIdle" value="${redis.maxIdle}"/>
        <property name="minIdle" value="${redis.minIdle}"></property>
        <property name="maxWaitMillis" value="${redis.maxWait}"/>
        <property name="testOnBorrow" value="${redis.testOnBorrow}"/>
    </bean>
    <!--密码对象-->
    <bean id="password" class="org.springframework.data.redis.connection.RedisPassword">
        <constructor-arg name="thePassword" value="${redis.password}"></constructor-arg>
    </bean>
​
    <!--spring-data-redis2.0以上的配置-->
    <bean id="redisStandaloneConfiguration" class="org.springframework.data.redis.connection.RedisStandaloneConfiguration">
        <property name="hostName" value="${redis.host}"/>
        <property name="port" value="${redis.port}"/>
        <property name="password" ref="password" />
        <property name="database" value="0"/>
    </bean>
    <!-- redis连接 spring-data-redis2.0以上建议获取的方式-->
    <bean id="connectionFactory"
          class="org.springframework.data.redis.connection.jedis.JedisConnectionFactory">
        <constructor-arg name="standaloneConfig" ref="redisStandaloneConfiguration"></constructor-arg>
    </bean>
    <!--
        Spring 封装了 RedisTemplate 来操作 Redis,它支持所有的 Redis 原生的 API。
        在 RedisTemplate 中定义了对5种数据结构的操作方法。
​
        opsForValue():操作字符串。
        opsForList():操作列表。
        opsForHash():操作哈希。
        opsForSet():操作集合。
        opsForZSet():操作有序集合。
    --></beans>
  • redis配置文件

@bean注解等同于xmk中的bean标签

如果要指定组件在容器中的id: @Bean(id)

RedisTemplate 可以自定义存储的序列化器类型

StringRedisTemplate 只能存储String类型的数据

package com.zking.config;
​
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.data.redis.connection.jedis.JedisConnectionFactory;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.data.redis.serializer.JdkSerializationRedisSerializer;
import org.springframework.data.redis.serializer.StringRedisSerializer;
​
@Configuration // 等同xml文件
public class RedisConfig {
    @Bean
    public RedisTemplate<String ,Object> redisTemplate(JedisConnectionFactory jcf) {
        RedisTemplate<String ,Object>  redis = new RedisTemplate<>();
//        设置连接对象
        redis.setConnectionFactory(jcf);
//        1.jdk序列化器,必须实现序列化接口,可读性差
        JdkSerializationRedisSerializer jdk = new JdkSerializationRedisSerializer();
//        2. String序列化器,存储数据必须是String数据类型
        StringRedisSerializer string = new StringRedisSerializer();
//        设置String 数据类型和hash数据类型的key和value使用那儿种序列化器
        redis.setKeySerializer(string);
        redis.setValueSerializer(string);
        return redis;
    }
}
​

7、测试,使用整合后的项目查询数据库中emp表中的所有数据

  • emp实体类
@AllArgsConstructor
@NoArgsConstructor
@Data
public class Emp implements Serializable {
​
    @Id //导入persistence 包中的id 
    @KeySql(useGeneratedKeys = true) //主键回填
  private Integer empno;
  private String ename;
  private String job;
  private Double mgr;
  private String  hiredate;
  private Double sal;
  private Double comm;
  private Integer deptno;
}
  • mapper包中定义EmpMapper接口
package com.zking.mapper;
​
import com.zking.entity.Emp;
import tk.mybatis.mapper.common.Mapper;
​
import java.util.List;
​
public interface EmpMapper extends Mapper<Emp> {
    List<Emp> getByHiredate(String year);
}
  • 测试
package com.zking.mapper;
​
import com.zking.entity.Emp;
import tk.mybatis.mapper.common.Mapper;
​
import java.util.List;
​
public interface EmpMapper extends Mapper<Emp> {
    List<Emp> getByHiredate(String year);
}
  • test
![项目整合测试结果](D:\桌面\MD博客文档\图片\11-18项目整合\项目整合测试结果.png)@RunWith(SpringRunner.class) //以spring环境进行测试//要加载的配置文件
@ContextConfiguration({
         "classpath:/spring-db.xml",
        "classpath:/spring-mybatis.xml",
        "classpath:/spring-redis.xml"
})
public class SsmTest {
       @Autowired
    EmpMapper em;
        @Test
    public void b() {
        Page<Object> page = PageHelper.startPage(1, 3);
        List<Emp> list = em.getByHiredate("1981");
        list.forEach(System.out::println);
        System.out.println("当前页"+page.getPageNum());
        System.out.println("总条数"+page.getTotal());
        System.out.println("总页数"+page.getPages());
        System.out.println("每页条数"+page.getPageSize());
    }
}

运行结果、项目结构

项目整合测试结果.png

项目结构.png

解决resource报红问题

  • 在project structrue中设置

resource报红问题.png