配置文件参考大全
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 <= 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 <= 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();
}
}