SSM框架小Demo,使用反向生成工具
上传图片,批量删除,反向生成工具的使用。
一、数据库用的mysql,建表,添加测试数据
二、导入反向生成的工具文件夹,把配置文件修改一下,主要是数据库名,账号和密码,表名。还是很简单的,
修改好之后直接运行就可以自动生成pojo和dao还有mapper映射文件
反向生成的配置文件信息:
<?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>
<context id="testTables" targetRuntime="MyBatis3">
<commentGenerator>
<!-- 是否去除自动生成的注释 true:是 : false:否 -->
<property name="suppressAllComments" value="true" />
</commentGenerator>
<!--数据库连接的信息:驱动类、连接地址、用户名、密码 -->
<jdbcConnection driverClass="com.mysql.jdbc.Driver"
connectionURL="jdbc:mysql://localhost:3306/stumanager" userId="root"
password="hx123">
</jdbcConnection>
<!-- <jdbcConnection driverClass="oracle.jdbc.OracleDriver"
connectionURL="jdbc:oracle:thin:@127.0.0.1:1521:yycg"
userId="yycg"
password="yycg">
</jdbcConnection> -->
<!-- 默认false,把JDBC DECIMAL 和 NUMERIC 类型解析为 Integer,为 true时把JDBC DECIMAL 和
NUMERIC 类型解析为java.math.BigDecimal -->
<javaTypeResolver>
<property name="forceBigDecimals" value="false" />
</javaTypeResolver>
<!-- targetProject:生成PO类的位置 -->
<javaModelGenerator targetPackage="pojo"
targetProject=".\src">
<!-- enableSubPackages:是否让schema作为包的后缀 -->
<property name="enableSubPackages" value="false" />
<!-- 从数据库返回的值被清理前后的空格 -->
<property name="trimStrings" value="true" />
</javaModelGenerator>
<!-- targetProject:mapper映射文件生成的位置 -->
<sqlMapGenerator targetPackage="dao.mapper"
targetProject=".\src">
<!-- enableSubPackages:是否让schema作为包的后缀 -->
<property name="enableSubPackages" value="false" />
</sqlMapGenerator>
<!-- targetPackage:mapper接口生成的位置 -->
<javaClientGenerator type="XMLMAPPER"
targetPackage="dao"
targetProject=".\src">
<!-- enableSubPackages:是否让schema作为包的后缀 -->
<property name="enableSubPackages" value="false" />
</javaClientGenerator>
<!-- 指定数据库表 -->
<table tableName="user">
<!-- 是否启用跟字段名一样的pojo属性名 -->
<property name="useActualColumnNames" value="true"/>
</table>
<table tableName="role">
<property name="useActualColumnNames" value="true"/>
</table>
<table tableName="post">
<property name="useActualColumnNames" value="true"/>
</table>
<table tableName="classtab">
<property name="useActualColumnNames" value="true"/>
</table>
</context>
</generatorConfiguration>
三、把生成之后的dao、mapper和pojo拷贝到工程中,这里我新建了一个maven的web工程
导入相关的依赖
四、引入spring和springmvc还有mybatis的配置文件
(1)这是spring的配置文件,applicationContext.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:mvc="http://www.springframework.org/schema/mvc"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:aop="http://www.springframework.org/schema/aop" xmlns:tx="http://www.springframework.org/schema/tx"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-3.2.xsd
http://www.springframework.org/schema/mvc
http://www.springframework.org/schema/mvc/spring-mvc-3.2.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-3.2.xsd
http://www.springframework.org/schema/aop
http://www.springframework.org/schema/aop/spring-aop-3.2.xsd
http://www.springframework.org/schema/tx
http://www.springframework.org/schema/tx/spring-tx-3.2.xsd ">
<!-- 加载配置文件 -->
<context:property-placeholder location="classpath:db.properties"/>
<!-- Druid数据库连接池 -->
<bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource"
destroy-method="close">
<property name="url" value="${jdbc.url}" />
<property name="username" value="${jdbc.username}" />
<property name="password" value="${jdbc.password}" />
<property name="driverClassName" value="${jdbc.driver}" />
<property name="maxActive" value="10" />
<property name="minIdle" value="5" />
</bean>
<!--整合mybatis-->
<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
<property name="dataSource" ref="dataSource"/>
<!-- 自动扫描mapping.xml文件 -->
<property name="mapperLocations" value="classpath:dao/mapper/*.xml"/>
<!-- 自动扫描pojo包并取别名 -->
<property name="typeAliasesPackage" value="pojo"/>
<!-- 启用分页插件 -->
<property name="plugins">
<array>
<bean class="com.github.pagehelper.PageInterceptor">
<property name="properties">
<value>
<!--这个为了控制分页的上下限,不出现负数页和超过最大页-->
reasonable=true
</value>
</property>
</bean>
</array>
</property>
</bean>
<!--spring扫描mapper接口-->
<bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
<property name="basePackage" value="dao"/>
<property name="sqlSessionFactoryBeanName" value="sqlSessionFactory"/>
</bean>
<!--扫描service-->
<context:component-scan base-package="service"/>
<!--配置事务管理器-->
<bean id="txManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource" ref="dataSource"></property>
</bean>
<!--声明式事务注解方式-->
<tx:annotation-driven transaction-manager="txManager"/>
</beans>
(2)springMVC的配置文件 springmvc-servlet.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:mvc="http://www.springframework.org/schema/mvc"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:aop="http://www.springframework.org/schema/aop" xmlns:tx="http://www.springframework.org/schema/tx"
xmlns:dubbo="http://code.alibabatech.com/schema/dubbo"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-3.2.xsd
http://www.springframework.org/schema/mvc
http://www.springframework.org/schema/mvc/spring-mvc-3.2.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-3.2.xsd
http://www.springframework.org/schema/aop
http://www.springframework.org/schema/aop/spring-aop-3.2.xsd
http://code.alibabatech.com/schema/dubbo http://code.alibabatech.com/schema/dubbo/dubbo.xsd
http://www.springframework.org/schema/tx
http://www.springframework.org/schema/tx/spring-tx-3.2.xsd ">
<!-- 自动扫描该包,使SpringMVC认为包下用了@controller注解的类是控制器 -->
<context:component-scan base-package="controller" />
<!--开启注解扫描器-->
<mvc:annotation-driven/>
<!-- 定义跳转的文件的前后缀 ,视图模式配置-->
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<!-- 这里的配置我的理解是自动给后面action的方法return的字符串加上前缀和后缀,变成一个 可用的url地址 -->
<property name="prefix" value="/WEB-INF/jsp/" />
<property name="suffix" value=".jsp" />
</bean>
<!-- 不拦截资源文件 -->
<mvc:resources location="/statics/" mapping="/statics/**"/>
<!-- 配置MultipartResolver,用于文件上传 -->
<bean id="multipartResolver"
class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
<property name="maxUploadSize" value="5000000"/>
<property name="defaultEncoding" value="UTF-8"/>
</bean>
</beans>
(3) 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">
<display-name></display-name>
<welcome-file-list>
<welcome-file>index.jsp</welcome-file>
</welcome-file-list>
<!--解决全局中文乱码问题-->
<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>
<init-param>
<param-name>forceEncoding</param-name>
<param-value>true</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>CharacterEncodingFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
<!-- Spring和mybatis的配置文件 -->
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:applicationContext.xml</param-value>
</context-param>
<!-- Spring监听器 -->
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
<!-- 防止Spring内存溢出监听器 -->
<listener>
<listener-class>org.springframework.web.util.IntrospectorCleanupListener</listener-class>
</listener>
<!-- Spring MVC servlet -->
<servlet>
<servlet-name>DispatcherServlet</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:springmvc-servlet.xml</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>DispatcherServlet</servlet-name>
<!-- 此处可以可以配置成*.do,对应struts的后缀习惯 -->
<url-pattern>/</url-pattern>
</servlet-mapping>
</web-app>
(4)db.properties 的数据库连接的属性文件
jdbc.driver=com.mysql.jdbc.Driver
jdbc.url=jdbc:mysql://localhost:3306/stumanager?characterEncoding=utf-8
jdbc.username=root
jdbc.password=hx123
(5) log4j日志属性文件 log4j.properties
log4j.rootLogger=DEBUG, Console
#Console
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.java.sql.ResultSet=INFO
log4j.logger.org.apache=INFO
log4j.logger.java.sql.Connection=DEBUG
log4j.logger.java.sql.Statement=DEBUG
log4j.logger.java.sql.PreparedStatement=DEBUG
*因为spring整合了mybatis,这里我没有单独使用mybatis的配置文件,而是整合在了spring的配置文件中
这样框架搭建完成,可以开始敲代码了。
三、先运行试试看,会不会报异常。这里我使用的是插件启动的tomcat7
还好,运行没有报异常。成功进入登录页面。
UserServiceImpl中的分页工具,这里参数中的PageSearch 对象是把查询的条件封装到了对象中
@Service
@Transactional
public class UserServiceImpl implements UserService {
@Autowired
private UserMapper userMapper;
public PageInfo<User> getUserListByConditions(Integer pageIndex, PageSearch pageSearch) {
//开始分页,当前第pageIndex页,一页显示5条
PageHelper.startPage(pageIndex, 5);
UserExample example=new UserExample();
Criteria criteria = example.createCriteria();
if(StringUtils.isNotBlank(pageSearch.getUserName())){
criteria.andUserNameLike("%"+pageSearch.getUserName()+"%");
}
if(pageSearch.getClassId()!=null && pageSearch.getClassId()!=-1){
criteria.andClassIdEqualTo(pageSearch.getClassId());
}
if(pageSearch.getPostId()!=null && pageSearch.getPostId()!=-1){
criteria.andPostIdEqualTo(pageSearch.getPostId());
}
if(pageSearch.getRoleId()!=null && pageSearch.getRoleId()!=-1){
criteria.andRoleIdEqualTo(pageSearch.getRoleId());
}
List<User> list = userMapper.selectByExample(example);
PageInfo<User> info=new PageInfo<User>(list,4);
return info;
}
全选和反选,批量删除
$(function(){
$("#ckbAll").click(function(){
var status=$(this).prop("checked");
$("[name='ckb']").each(function(index,item){
$(item).prop("checked",status);
})
});
$("[name='ckb']").click(function(){
var status=true;
$("[name='ckb']").each(function(index,item){
if(!$(item).prop("checked")){
status=false;
return;
}
});
$("#ckbAll").prop("checked",status);
})
function deletSelect(){
if(!confirm('确定要删除选中的信息吗?')){
return;
}
var ids=new Array();
$("[name='ckb']:checked").each(function(index,item){
ids.push($(item).val());
});
if(ids!=null&&ids.length>0){
$.ajax({
url:'${pageContext.request.contextPath}/ajaxDelete',
data:{'ids':ids},
type:'post',
dataType:'text',
success:function(res){
alert(res);
location.href='${pageContext.request.contextPath}/index';
},
error:function(){
alert('出错了~');
}
})
}else{
alert('请选择要删除的信息~');
}
}
后台controller
@RequestMapping(value="/ajaxDelete",method=RequestMethod.POST,produces="text/html;charset=UTF-8")
@ResponseBody
public String deleteSelected(@RequestParam("ids[]") Integer[] ids){
Integer count=userService.deleteSelected(ids);
if(count>0){
return "成功删除"+count+"条记录";
}else{
return "删除失败!";
}
}
后台service
public Integer deleteSelected(Integer[] ids) {
List<Integer> list=Arrays.asList(ids);
UserExample example=new UserExample();
Criteria criteria = example.createCriteria();
criteria.andMidIn(list);
Integer count=userMapper.deleteByExample(example);
return count;
}
图片上传:(后台)
@RequestMapping(value="/uploadImage",method=RequestMethod.POST)
@ResponseBody
public String uploadImg(@RequestParam(value="pic",required=false) MultipartFile file,
HttpSession session){
JSONObject jsonObject=new JSONObject();
String oldName = file.getOriginalFilename();
String suffix = FilenameUtils.getExtension(oldName);
int fileSize=500000;
if(file.getSize()>fileSize){
jsonObject.put("error", "error");
}else{
if(suffix.equalsIgnoreCase("jpg")||
suffix.equalsIgnoreCase("jpeg")||
suffix.equalsIgnoreCase("png")||
suffix.equalsIgnoreCase("pneg")){
String finalName=System.currentTimeMillis()+UUID.randomUUID().toString()+"."+suffix;
File finalFile=new File("f:/images",finalName);
if(!finalFile.exists()){
finalFile.mkdirs();
}
try {
file.transferTo(finalFile);
} catch (Exception e) {
jsonObject.put("error", "error");
}
jsonObject.put("url", finalName);
}
}
return jsonObject.toJSONString();
}
图片上传(前台):此处用到了jquery的一个表单异步上传文件的插件
function upload(){
var $form={
type:'post',
url:'${pageContext.request.contextPath}/college/uploadImage',
dataType:'JSON',
success:function(data){
//目的是把data里的url属性赋给img标签里的src属性值
$("#img").attr("src",data.url);
$("#cpic").val(data.url);
},
error:function(){
alert("出错了!");
}
};
//是基于form表单上传提交,
$("#addForm").ajaxSubmit($form);
}
<td>
<input type="file" name="pic" id="pic" onchange="upload()"/>
<img src="" id="img" alt="预览图片" style="width:100px;height:100px"/>
</td>
<input type="hidden" name="cpic" id="cpic"/>
写的不是很完整,时间比较晚了,大家勉强看看吧 - -