spring整合mybatis、IOC、mvc、duird

配置文件参考大全

MyBatis的config.xml 整合之前

该文件可有可无,因为spring和MyBaits整合之后,大多数配置信息都写到Spring的ApplicationContext.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="db.properties"></properties>
    <settings>
        <!--这里是设置日志的格式-->
        <setting name="logImpl" value="LOG4J"/>
    </settings>

    <!--这里是配置类型别名 给StudentMapper接口类型 设置一个别名 -->
    <typeAliases>
        <typeAlias type="com.etoak.student.mapper.StudentMapper" alias="student"></typeAlias>
        <!--以下是给实体类起别名 应为在Mapper映射文件中 resultType和resulMap parameterType都需要类型 设置别名后
            直接使用别名即可指向类型
        -->
        <typeAlias type="com.etoak.student.entity.School" alias="sch"></typeAlias>
        <typeAlias type="com.etoak.student.entity.Course" alias="cs"></typeAlias>
        <typeAlias type="com.etoak.student.entity.Sc" alias="sc"></typeAlias>
        <typeAlias type="com.etoak.student.entity.Locations" alias="locations"></typeAlias>
        <typeAlias type="com.etoak.student.entity.Student" alias="stu"></typeAlias>
    </typeAliases>
    <!--
        这里是环境配置
        default:代表默认的
        可以存在多个环境
    -->
    <environments default="m">
        <environment id="m">
            <!--事务管理器的类型是JDBC-->
            <transactionManager type="JDBC"></transactionManager>
            <!--数据源的类型是连接池 POOLED-->
            <dataSource type="POOLED">

                <property name="driver" value="${m.driver}"/>
                <property name="url" value="${m.url}"/>
                <property name="username" value="${m.user}"/>
                <property name="password" value="${m.pwd}"/>
            </dataSource>
        </environment>
    </environments>
    <!--声明映射文件是谁-->
    <mappers>
        <mapper resource="StudentMapper.xml"></mapper>
    </mappers>
</configuration>

db.properties 连接mysql的文件

m.driver=com.mysql.jdbc.Driver
m.url=jdbc:mysql://127.0.0.1:3306/et2010
m.user=root
m.pwd=etoak
m.maxWait=5000
m.maxActive=100

MyBatis的Mapper.xml

<?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">

<!--
    此处是声明命名空间
    代理模式 namespace必须和Mapper接口的名字一样

    mapper中的sql标签的id必须和抽象方法名一致

-->
<mapper namespace="com.etoak.student.mapper.StudentMapper">
<!--
    在mapper里面的sql标签的id必须Mapper接口中的抽象方法名一致才行
    因为使用的是动态代理

-->
<!--添加学校-->
    <insert id="addSchool" parameterType="sch">
    <!--
        这里的#{name} 因为传进来的是一个对象 所以底层中一定是用了反射 存在getXXX来获取对象中的值

        而普通参数:
            一个参数 mybatis不做特殊处理 name就是name 直接就能拿到值
            多个参数 mybatis会做特殊处理 每个参数封装成map key是mybatis指定的
            使用@Param设置key为参数名 就可以直接使用#{参数名}拿取数据了
    -->
        insert into school(name, phone, proid, cityid, areaid, info) VALUES (#{name},#{phone},#{proid},#{cityid},#{areaid},#{info})
    </insert>

    <!--添加学生-->
    <insert id="addStudent" parameterType="stu">
        insert into student(name, age, birth, schid)
        values (#{name},#{age},#{birth},#{schid})
    </insert>

    <!--根据pid拿取城市信息-->
    <select id="queryById" resultType="locations">
        select * from locations where pid = #{pid}
    </select>

    <!--根据学校名字 进行分页查询
        如果 数据库中表的字段名和实体类的属性名不一致
        则:要么给select后的字段起别名 要么使用resultMap映射
    -->
    <select id="querySomeSch" resultType="sch">
        select sc.id as id,sc.name name,sc.phone phone,concat(pro.name,city.name,area.name,sc.info) info
        from school sc
        left join locations pro on sc.proid = pro.id
        left join locations city on sc.cityid = city.id
        left join locations area on sc.areaid = area.id
        <!--
            使用where标签的作用 就是 如果没有传名字 就查全部
        -->
        <where>
            <!--如果非要用#{} 那么使用concat拼接字符串即可
                concat('%',#{schname},'%')
            -->
            <if test="name != null and name != ''">
                and sc.name like concat('%',#{name},'%')
            </if>
        </where>
        limit #{start},#{max}
    </select>

    <!--还需要查询获取总记录数-->
    <select id="countSch" resultType="int">
        select count(*) from school
        <where>
            <if test="name!=null and name!=''">
                and name like concat('%',#{name},'%')
            </if>
        </where>
    </select>

    <!--
        此处就是使用resultMap进行映射
        type就是映射到什么类型 此处是起的别名
        id 是resultMap的唯一标识
        注意 此处只是为了展示resultMap的使用 表中的字段名和实体类的属性名(我建的是一样的)
        展示的原因 使出里不一样的情况
    -->
    <resultMap id="scMap" type="sch">
        <!--
            id标签 就是主键
                property:实体类属性名
                column:数据库字段名

        -->
        <id property="id" column="id"></id>
        <result property="name" column="name"></result>
        <result property="phone" column="phone"></result>
        <result property="info" column="info"></result>
    </resultMap>

    <!--查询所有学校-->

    <select id="queryAllSchool" resultMap="scMap">
        select name,phone,info from school
    </select>

    <!--此处是分页和条件查询学生信息 要体现学校奥
        对于学生和学校来说 一个学生对应一个学校
        一对一的关系
    -->
    <resultMap id="stuMap" type="stu">
        <id property="id" column="sid"></id>
        <result property="name" column="sname"></result>
        <result property="age" column="sage"></result>
        <result property="birth" column="sbirth"></result>
        <association property="sch" javaType="sch">
            <id property="id" column="schid"></id>
            <result property="name" column="schname"></result>
            <result property="phone" column="schphone"></result>
            <result property="info" column="sinfo"></result>
        </association>
    </resultMap>
    <select id="querySomeStu" resultMap="stuMap">
        select stu.id as sid,stu.name as sname,stu.age sage,stu.birth as sbirth,
        sch.id as schid,sch.name as schname,sch.phone as schphone,concat('-',pro.name,city.name,area.name,sch.info)as sinfo
        from student stu
        left join school sch
        on stu.schid = sch.id
        left join locations pro
        on sch.proid =  pro.id
        left  join locations city
        on sch.proid = city.id
        left join locations area
        on sch.areaid = area.id
        <where>
            <if test="tj!=null and tj.name !=null and tj.name!=''">
                and stu.name like concat('%',#{tj.name},'%')
            </if>
            <if test="tj !=null and tj.schid!=null and tj.schid!=''">
                and stu.schid = #{tj.schid}
            </if>
            <if test="tj!=null and tj.startdate!=null and tj.startdate!=''">
                <!--
                    注意 此处使用了mysql的date_format 将标准日期转换成指定格式的
                    而当stu.birth的时候 其实调用的getBirth方法
                    由于在Student类中使用@JSONField(format = "yyyy-MM-dd")进行了格式转换
                    所以二者要对应起来
                -->
                and stu.birth >= date_format(#{tj.startdate},'%y-%m-%d')
            </if>
            <if test="tj!=null and tj.enddate!=null and tj.enddate!=''">
                and stu.birth &lt;= date_format(#{tj.enddate},'%y-%m-%d')
            </if>
        </where>

        limit #{start},#{max}
    </select>

    <!--查询学生的总记录数-->
    <select id="countStu"  resultType="int">
        select count(*) from student
        <where>
            <if test="tj!=null and tj.name !=null and tj.name!=''">
                and stu.name like concat('%',#{tj.name},'%')
            </if>
            <if test="tj !=null and tj.schid!=null and tj.schid!=''">
                and stu.schid = #{tj.schid}
            </if>
            <if test="tj!=null and tj.startdate!=null and tj.startdate!=''">
                <!--
                    注意 此处使用了mysql的date_format 将标准日期转换成指定格式的
                    而当stu.birth的时候 其实调用的getBirth方法
                    由于在Student类中使用@JSONField(format = "yyyy-MM-dd")进行了格式转换
                    所以二者要对应起来
                -->
                and stu.birth >= date_format(#{tj.startdate},'%y-%m-%d')
            </if>
            <if test="tj!=null and tj.enddate!=null and tj.enddate!=''">
                and stu.birth &lt;= date_format(#{tj.enddate},'%y-%m-%d')
            </if>
        </where>
    </select>

    <!--此处是查询每个课程的选课人数 搞一个map来接收 最后展示的时候
        name: xxx
        rs:xxx
        每一条记录是一个map

        更简单的办法 就是搞一个类 属性是课程名和人数 返回集合 集合的泛型是这个类
     -->
    <select id="countByCourse" resultType="map">
        select cs.name as name,count(stu.name)as rs
        from course cs
        left join sc
        on sc.cid = cs.id
        left join student stu
        on sc.sid = stu.id
        group by cs.id
    </select>

    <!--查询每个学校的人数 -->
    <select id="countBySch" resultType="map">
        select sc.name scname,count (stu.id) rs
        from school sc
        left join student stu
        on sc.id = stu.schid
        group by sc.id
    </select>

    <!--查询指定课程的最高分 显示人名 学校 课程名 分数-->
    <!--
    这里是去指定课程名的最高成绩
    先拿到指定课程的id 再算最高成绩
    再拿到最高成绩是这个的 sid
    select max(score) from sc where cid = (select id from course where name ='高等数学')
    -->
    <resultMap id="sc_Map" type="sc">
        <result property="score" column="score" />
        <association property="stu" javaType="stu">
            <result property="name" column="sname"/>
            <result property="age" column="sage" />
                <association property="sch" javaType="sch">
                    <result property="name" column="scname" />
                    <result property="info" column="scinfo" />
            </association>
        </association>

    </resultMap>
    <select id="queryByMax" resultMap="sc_Map">
        select sc.score score,stu.name sname,stu.age sage,sch.name scname,
               concat('-',pro.name,city.name,area.name,sch.info) scinfo
        from sc
                 left join student stu
                           on sc.sid = stu.id
                 left join school sch
                           on sch.id = stu.schid
                 left join locations pro
                           on sch.proid = pro.id
                 left join locations city
                           on city.id = sch.cityid
                 left join locations area
                           on sch.areaid = area.id
                 left join course cs
                           on cs.id = sc.cid
        where sid in (
            select sid from sc left join course c on sc.cid = c.id where sc.score =
                                                                         (select max(score) from sc where cid = (select id from course where name = '高等数学')
                                                                         )and c.name=#{name})
          and cs.name=#{name}


    </select>

    <!--查询所有课程-->
    <select id="queryAllCourse" resultType="cs">
        select * from course
    </select>

</mapper>

Spring的ApplicationContext.xml

作用是实现控制反转 以下是注解+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:mvc="http://www.springframework.org/schema/mvc"
       xsi:schemaLocation="http://www.springframework.org/schema/beans
   http://www.springframework.org/schema/beans/spring-beans-4.0.xsd
   http://www.springframework.org/schema/context
   https://www.springframework.org/schema/context/spring-context.xsd
   http://www.springframework.org/schema/mvc https://www.springframework.org/schema/mvc/spring-mvc.xsd">

    <!--导入外部资源-->
    <context:property-placeholder location="classpath:db.properties"/>
    <!--开启IOC包扫描 @Component @Service @Repository @Controller @Autowired @Resource @Value-->
    <context:component-scan base-package="com.etoak.student"/>

    <!--开启MVC的包扫描 @RequestMapping @ResponseBody-->
    <mvc:annotation-driven />

    <!--
        mybatis
        只需要提供SqlSessionFactoryBean
        创建mybatis提供的创建SqlSessionFactory对象

    -->
    <bean class="org.mybatis.spring.SqlSessionFactoryBean">
        <property name="dataSource" ref="ds"/>
        <!--
            给com.etoak.student包及其子包下的所有类起别名 别名就是类名字首字母小写
            别名要在Mapper映射文件中使用的
        -->
        <property name="typeAliasesPackage" value="com.etoak.student"/>
        <!--mybatis的config文件-->
        <property name="configLocation" value="classpath:mybatis_config.xml"/>
        <!--存放SQL的Mapper文件-->
        <property name="mapperLocations" value="classpath:xml/*Mapper.xml"/>
    </bean>
    <!--以下是配置数据源 此处使用的是阿里巴巴提供的德鲁伊-->
    <bean id="ds" class="com.alibaba.druid.pool.DruidDataSource">
        <property name="driverClassName" value="${m.driver}"/>
        <property name="url" value="${m.url}"/>
        <property name="username" value="${m.user}"/>
        <property name="password" value="${m.pwd}"/>
        <property name="maxWait" value="${m.maxWait}"/>
        <property name="maxActive" value="${m.maxActive}"/>
    </bean>
    <!--
        这里是MyBatis提供的和spring整合时,不需要自己getMapper()得到一个dao层对象
        MyBatis提供了和spring整合时,自动扫描dao层接口[XXXMapper.xml] 并且返回代理对象的配置
        扫描所有的com.etoak.student包及其子包,给 接口 提供代理类并生成对象,注册到IOC容器中
        所以就不需要自己在mapper接口上加@Repisitory注解了 MyBatis会创建好对象 注册到IOC中
    -->
    <bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
        <property name="basePackage" value="com.etoak.student"/>
    </bean>
</beans>

MyBatis的congif.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>
    <settings>
        <!--这里是设置日志的格式-->
        <setting name="logImpl" value="LOG4J"/>
    </settings>
</configuration>

log4j.properties

log4j.rootLogger=DEBUG, stdout

# SqlMap logging configuration...
log4j.logger.com.ibatis=DEBUG
log4j.logger.com.ibatis.common.jdbc.SimpleDataSource=DEBUG
log4j.logger.com.ibatis.sqlmap.engine.cache.CacheModel=DEBUG
log4j.logger.com.ibatis.sqlmap.engine.impl.SqlMapClientImpl=DEBUG
log4j.logger.com.ibatis.sqlmap.engine.builder.xml.SqlMapParser=DEBUG
log4j.logger.com.ibatis.common.util.StopWatch=DEBUG
log4j.logger.java.sql.Connection=DEBUG
log4j.logger.java.sql.Statement=DEBUG
log4j.logger.java.sql.PreparedStatement=DEBUG
log4j.logger.java.sql.ResultSet=DEBUG

# Console output...
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern=%5p [%t] - %m%n

后端跨域参考文件

package com.etoak.student.filter;

import javax.servlet.*;
import javax.servlet.annotation.WebFilter;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
@WebFilter("/*") //http://localhost:8080/stu/stu?method=querySomeSch

//解决跨域问题 实现过滤器
public class CrossFilter implements Filter {
    
    
    @Override
    public void init(FilterConfig filterConfig) throws ServletException {
    
    

    }

    @Override
    public void doFilter(ServletRequest request,
                         ServletResponse response, FilterChain chain) throws IOException, ServletException {
    
    
        HttpServletResponse httpResponse = (HttpServletResponse) response;

        // 允许所有的请求域名访问我们的跨域资源,可以固定单个或者多个内容
        httpResponse.setHeader("Access-Control-Allow-Origin", "*");//
        // httpResponse.setHeader("Access-Control-Allow-Origin", "http://localhost:9090");// 允许所有的请求域名访问我们的跨域资源,可以固定单个或者多个内容
        httpResponse.setHeader("Access-Control-Allow-Methods", "POST, GET, OPTIONS, DELETE,PUT");// 允许何种请求方法访问该跨域资源服务器
        httpResponse.setHeader("Access-Control-Max-Age", "3600");// 预检请求的有效期,单位为秒。有效期内,不会重复发送预检请求
        httpResponse.addHeader("Access-Control-Allow-Headers",
                "Accept, authorization,Origin, No-Cache, X-Requested-With, If-Modified-Since, Pragma, Last-Modified, Cache-Control, Expires, Content-Type, X-E4M-With");// 允许所有的请求header访问,可以自定义设置任意请求头信息
        httpResponse.setHeader("Access-Control-Allow-Credentials", "true");// 是否允许用户发送、处理cookie
        //如果额外设置自己的头需要在这定义
        httpResponse.setHeader("Access-Control-Expose-Headers", "Access-Token");
        ///放行==》通过了过滤器 继续执行
        chain.doFilter(request, httpResponse);

    }

    @Override
    public void destroy() {
    
    

    }
}


文件上传

        //前台使用elementUI 发同步 不设置method
        String method =req.getParameter("method");
        if(null==method){
    
    
            //文件上传 这里是获取请求头 再判断是不是文件上传
            String ct = req.getHeader("content-type");
            if(ct.indexOf("multipart")>=0){
    
    
              //调用文件上传的处理方法
              addPic(req,resp);
            }

        }




 protected void addPic(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
    
    
        //构造解析器==》所谓解析器,是用来帮助我们解析请求的。取参数的。
        FileItemFactory f = new DiskFileItemFactory();
        //解析器
        ServletFileUpload su = new ServletFileUpload(f);

        try {
    
    //解析请求
            List<FileItem> items = su.parseRequest(req);
            for(FileItem item:items){
    
    
                //判断当前控件<input type="">是否是文件上传
                if(item.isFormField()) {
    
    

                    String fieldName = item.getFieldName();
                    //参数名字
                    String value = item.getString("utf-8");
                }else {
    
    
                    //该表单 项是个文件<input type="file"
                    String name = item.getName();
                    //后缀
                    String fext = name.substring(name.lastIndexOf("."));
                    String newname = UUID.randomUUID().toString().replaceAll("-","")
                            +fext;

                    //把文件保存到服务器上的指定文件夹
                    ServletContext application = this.getServletContext();
                    String path = application.getRealPath("/files/" + newname);
                    File file = new File(path);
                    //保存文件
                    item.write(file);
					
                    //单独使用一个类 组装响应内容
                    Pic p = new Pic();
                    p.setSavepath("/files/"+newname);
                    p.setName(name);
                    //上传时间
                    p.setUploadtime(new Timestamp(System.currentTimeMillis()));
                    p.setFlag(0);
                    //调用后台的文件上传的执行
                    StudentService ss = new StudentService();
                    ss.addPic(p);
                    //Mapper映射中 插入图片后 要获得id 把图片的id返回 用在一会根据id更改表的学生id
                    int id= p.getId();
                    PrintWriter out = resp.getWriter();
                    out.print("{\"id\":\""+id+"\"}");
                    out.flush();
                    out.close();
                }
                    //把文件地址放到数据库

            }

        }catch(Exception e){
    
    
            e.printStackTrace();
        }
    }

猜你喜欢

转载自blog.csdn.net/G7581/article/details/114992055
今日推荐