快速从零开始整合SSM,小白包会(1)
整合SSM,关键就是几个xml的配置.
准备:
1. Idea(配置好tomcat,可以安装插件freeMybatis,提高效率,安装插件不难,百度经验就有)
2. 下载好数据库MySql,以及可视化管理软件
3. 一双手,宝贵的半个小时
4. 对SSM,有认识,后面我会继续写有关这三个框架的内容.
开始:
首先,明确我们这里的工作:
建立一个通用的SSM项目,或者知道快速建立它的方法,以便于后面有什么项目,分析完可以直接就上手,避免在初始化项目,整合框架时耗费时间.
工作目标:
待会如果我们将存储在数据库里面表的信息在控制台打印出来了,那么Spring与MyBatis整合成功,如果在前端页面显示了数据库的数据,那么可以说三个框架整合成功.
提示:成功一次之后,可以反反复复多建几次,到达熟练,也可以保存模板,后面直接用.我就是从零开始边建项目边写这个博客,我都完成了,你照着来应该不会错.
毒鸡汤:在这个过程中,可能会遇到很多麻烦,但大部分都可以百度解决,也有可能被误导,但不管怎么样结果是一定成功的,毕竟它具有可预测性和有限性,而只要成功一次就可以保证成功无数次.
我还是个小白,第一次写博客(马上要期末考试了,哈哈),希望以这种方式来记录一下自己踩过的坑,都是自己慢慢摸出来的,不科学也不规范,我也希望大佬们可以多多指导.
第一步,在Idea上面新建一个项目:
此时项目应该是白的,这个样子:
我们下面建几个包和配置文件:
在config下面建立这些配置文件(这其实就是核心的配置,文件内容先不管,后面直接复制):
下面导入jar包,可以选择自动下载,或者直接使用Maven项目来添加,这里我们手动添加:
把自己的准备Jar包统统导进来即可.
再做一点小手脚,标识一下文件(test包是刚刚建的,就是一个普通的包,所以没有截图):
项目就是这个样子了:
至此, 第一步初始化项目完成,已经完成70%了.
第二步:使项目可以跑起来,在前端页面可以看到数据库的存储的信息.
1. 配置tomcat,把刚刚的建的配置文件加上内容.
2. 在数据库里面新加一表,插入一条测试数据,并为该表建立mapper文件,和接口(可以使用插件完成).
3.简单的编写一下,开始测试.
1.配置Tomcat,比较简单,就不步步展示了.后面放假了可以详细的写一下.
2.各个配置文件的内容:
applicationContext.xml :
1 <?xml version="1.0" encoding="UTF-8"?>
2 <beans xmlns="http://www.springframework.org/schema/beans"
3 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
4 xmlns:context="http://www.springframework.org/schema/context"
5 xmlns:tx="http://www.springframework.org/schema/tx"
6 xsi:schemaLocation="http://www.springframework.org/schema/beans
7 http://www.springframework.org/schema/beans/spring-beans.xsd
8 http://www.springframework.org/schema/context
9 https://www.springframework.org/schema/context/spring-context.xsd
10 http://www.springframework.org/schema/tx
11 http://www.springframework.org/schema/tx/spring-tx.xsd">
12 <!--配置数据源-->
13 <context:property-placeholder location="classpath:config/db.properties"/>
14 <context:component-scan base-package="service"/>
15 <bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource">
16 <property name="driverClassName" value="${jdbc.driver}"/>
17 <property name="url" value="${jdbc.url}"/>
18 <property name="username" value="${jdbc.username}"/>
19 <property name="password" value="${jdbc.password}"/>
20 <property name="maxIdle" value="${jdbc.maxIdle}"/>
21 <property name="initialSize" value="${jdbc.initialSize}"/>
22 </bean>
23
24 <!--mybatis-->
25 <bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
26 <property name="basePackage" value="mapper"/>
27 </bean>
28 <bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
29 <property name="dataSource" ref="dataSource"/>
30 <property name="configLocation" value="classpath:config/Mybatis-config.xml"/>
31 </bean>
32
33 <!--事务管理-->
34 <bean id="myTransactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
35 <property name="dataSource" ref="dataSource"/>
36 </bean>
37 <tx:annotation-driven transaction-manager="myTransactionManager"/>
38 <!-- <aop:aspectj-autoproxy proxy-target-class="true"/>-->
39 </beans>
db.properties(要根据自己的数据库更改) :
1 jdbc.driver=com.mysql.jdbc.Driver
2 jdbc.url=jdbc:mysql://localhost:3308/exam?useUnicode=true&characterEncoding=utf8&useSSL=false
3 jdbc.username=root
4 jdbc.password=123456
5 jdbc.maxTotal=30
6 jdbc.maxIdle=10
7 jdbc.initialSize=5
log4j.properties :
1 # Global logging configuration
2 log4j.rootLogger=ERROR, stdout
3 # MyBatis logging configuration...
4 log4j.logger.org.mybatis.example.BlogMapper=DEBUG
5 # Console output...
6 log4j.appender.stdout=org.apache.log4j.ConsoleAppender
7 log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
8 log4j.appender.stdout.layout.ConversionPattern=%5p [%t] - %m%n
mybatis-config.xml :
1 <?xml version="1.0" encoding="UTF-8"?>
2 <!DOCTYPE configuration
3 PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
4 "http://mybatis.org/dtd/mybatis-3-config.dtd">
5 <configuration>
6 <typeAliases>
7 <package name="po"/>
8 </typeAliases>
9 </configuration>
springmvc-config.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.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:component-scan base-package="controller"/>
<mvc:annotation-driven/> <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="prefix" value="/WEB-INF/jsp/"/>
<property name="suffix" value=".jsp"/>
</bean>
</beans>
web.xml
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"
version="4.0">
<!--Spring-->
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:config/applicationContext.xml</param-value>
</context-param>
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener> <!--编码过滤器-->
<filter>
<filter-name>encoding</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>
</filter>
<filter-mapping>
<filter-name>encoding</filter-name>
<url-pattern>*.action</url-pattern>
</filter-mapping> <!--spring Mvc-->
<servlet>
<servlet-name>springmvc</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:config/springmvc-config.xml</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>springmvc</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping> </web-app>
3.在数据库里面建表,插入一条数据.
4.使用插件生成这个测试表的mapper文件和dao接口
最后生成的项目结构:
生成具体的代码(这都是插件自动生成的,省事):
UserDao接口 :
package mapper; import org.springframework.transaction.annotation.Transactional;
import po.User; @Transactional
public interface UserDao {
int deleteByPrimaryKey(Integer id); int insert(User record); int insertSelective(User record); User selectByPrimaryKey(Integer id); int updateByPrimaryKeySelective(User record); int updateByPrimaryKey(User record);
}
UserDao.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">
<mapper namespace="mapper.UserDao">
<resultMap id="BaseResultMap" type="po.User">
<id column="user_id" jdbcType="INTEGER" property="id" />
<result column="user_userName" jdbcType="VARCHAR" property="userName" />
<result column="user_passWord" jdbcType="VARCHAR" property="passWord" />
<result column="user_phone" jdbcType="VARCHAR" property="phone" />
<result column="user_realName" jdbcType="VARCHAR" property="realName" />
<result column="user_sex" jdbcType="VARCHAR" property="sex" />
<result column="user_address" jdbcType="VARCHAR" property="address" />
<result column="user_email" jdbcType="VARCHAR" property="email" />
</resultMap>
<sql id="Base_Column_List">
user.id as user_id, user.userName as user_userName, user.`passWord` as `user_passWord`,
user.phone as user_phone, user.realName as user_realName, user.sex as user_sex, user.address as user_address,
user.email as user_email
</sql>
<select id="selectByPrimaryKey" parameterType="java.lang.Integer" resultMap="BaseResultMap">
select
<include refid="Base_Column_List" />
from user user
where user.id = #{id,jdbcType=INTEGER}
</select>
<delete id="deleteByPrimaryKey" parameterType="java.lang.Integer">
delete from user
where id = #{id,jdbcType=INTEGER}
</delete>
<insert id="insert" keyColumn="id" keyProperty="id" parameterType="po.User" useGeneratedKeys="true">
insert into user (userName, `passWord`, phone,
realName, sex, address,
email)
values (#{userName,jdbcType=VARCHAR}, #{passWord,jdbcType=VARCHAR}, #{phone,jdbcType=VARCHAR},
#{realName,jdbcType=VARCHAR}, #{sex,jdbcType=VARCHAR}, #{address,jdbcType=VARCHAR},
#{email,jdbcType=VARCHAR})
</insert>
<insert id="insertSelective" keyColumn="id" keyProperty="id" parameterType="po.User" useGeneratedKeys="true">
insert into user
<trim prefix="(" suffix=")" suffixOverrides=",">
<if test="userName != null">
userName,
</if>
<if test="passWord != null">
`passWord`,
</if>
<if test="phone != null">
phone,
</if>
<if test="realName != null">
realName,
</if>
<if test="sex != null">
sex,
</if>
<if test="address != null">
address,
</if>
<if test="email != null">
email,
</if>
</trim>
<trim prefix="values (" suffix=")" suffixOverrides=",">
<if test="userName != null">
#{userName,jdbcType=VARCHAR},
</if>
<if test="passWord != null">
#{passWord,jdbcType=VARCHAR},
</if>
<if test="phone != null">
#{phone,jdbcType=VARCHAR},
</if>
<if test="realName != null">
#{realName,jdbcType=VARCHAR},
</if>
<if test="sex != null">
#{sex,jdbcType=VARCHAR},
</if>
<if test="address != null">
#{address,jdbcType=VARCHAR},
</if>
<if test="email != null">
#{email,jdbcType=VARCHAR},
</if>
</trim>
</insert>
<update id="updateByPrimaryKeySelective" parameterType="po.User">
update user
<set>
<if test="userName != null">
userName = #{userName,jdbcType=VARCHAR},
</if>
<if test="passWord != null">
`passWord` = #{passWord,jdbcType=VARCHAR},
</if>
<if test="phone != null">
phone = #{phone,jdbcType=VARCHAR},
</if>
<if test="realName != null">
realName = #{realName,jdbcType=VARCHAR},
</if>
<if test="sex != null">
sex = #{sex,jdbcType=VARCHAR},
</if>
<if test="address != null">
address = #{address,jdbcType=VARCHAR},
</if>
<if test="email != null">
email = #{email,jdbcType=VARCHAR},
</if>
</set>
where id = #{id,jdbcType=INTEGER}
</update>
<update id="updateByPrimaryKey" parameterType="po.User">
update user
set userName = #{userName,jdbcType=VARCHAR},
`passWord` = #{passWord,jdbcType=VARCHAR},
phone = #{phone,jdbcType=VARCHAR},
realName = #{realName,jdbcType=VARCHAR},
sex = #{sex,jdbcType=VARCHAR},
address = #{address,jdbcType=VARCHAR},
email = #{email,jdbcType=VARCHAR}
where id = #{id,jdbcType=INTEGER}
</update>
</mapper>
User类 :
package po; import java.io.Serializable; /**
* user
* @author
*/ public class User implements Serializable {
/**
* id,主键
*/
private Integer id; /**
* 账户
*/
private String userName; /**
* 密码
*/
private String passWord; /**
* 手机号码
*/
private String phone; /**
* 真实姓名
*/
private String realName; /**
* 性别
*/
private String sex; /**
* 地址(收货)
*/
private String address; /**
* 电子邮件
*/
private String email; private static final long serialVersionUID = 1L; @Override
public boolean equals(Object that) {
if (this == that) {
return true;
}
if (that == null) {
return false;
}
if (getClass() != that.getClass()) {
return false;
}
User other = (User) that;
return (this.getId() == null ? other.getId() == null : this.getId().equals(other.getId()))
&& (this.getUserName() == null ? other.getUserName() == null : this.getUserName().equals(other.getUserName()))
&& (this.getPassWord() == null ? other.getPassWord() == null : this.getPassWord().equals(other.getPassWord()))
&& (this.getPhone() == null ? other.getPhone() == null : this.getPhone().equals(other.getPhone()))
&& (this.getRealName() == null ? other.getRealName() == null : this.getRealName().equals(other.getRealName()))
&& (this.getSex() == null ? other.getSex() == null : this.getSex().equals(other.getSex()))
&& (this.getAddress() == null ? other.getAddress() == null : this.getAddress().equals(other.getAddress()))
&& (this.getEmail() == null ? other.getEmail() == null : this.getEmail().equals(other.getEmail()));
} public Integer getId() {
return id;
} public void setId(Integer id) {
this.id = id;
} public String getUserName() {
return userName;
} public void setUserName(String userName) {
this.userName = userName;
} public String getPassWord() {
return passWord;
} public void setPassWord(String passWord) {
this.passWord = passWord;
} public String getPhone() {
return phone;
} public void setPhone(String phone) {
this.phone = phone;
} public String getRealName() {
return realName;
} public void setRealName(String realName) {
this.realName = realName;
} public String getSex() {
return sex;
} public void setSex(String sex) {
this.sex = sex;
} public String getAddress() {
return address;
} public void setAddress(String address) {
this.address = address;
} public String getEmail() {
return email;
} public void setEmail(String email) {
this.email = email;
} public static long getSerialVersionUID() {
return serialVersionUID;
} @Override
public int hashCode() {
final int prime = 31;
int result = 1;
result = prime * result + ((getId() == null) ? 0 : getId().hashCode());
result = prime * result + ((getUserName() == null) ? 0 : getUserName().hashCode());
result = prime * result + ((getPassWord() == null) ? 0 : getPassWord().hashCode());
result = prime * result + ((getPhone() == null) ? 0 : getPhone().hashCode());
result = prime * result + ((getRealName() == null) ? 0 : getRealName().hashCode());
result = prime * result + ((getSex() == null) ? 0 : getSex().hashCode());
result = prime * result + ((getAddress() == null) ? 0 : getAddress().hashCode());
result = prime * result + ((getEmail() == null) ? 0 : getEmail().hashCode());
return result;
} @Override
public String toString() {
StringBuilder sb = new StringBuilder();
sb.append(getClass().getSimpleName());
sb.append(" [");
sb.append("Hash = ").append(hashCode());
sb.append(", id=").append(id);
sb.append(", userName=").append(userName);
sb.append(", passWord=").append(passWord);
sb.append(", phone=").append(phone);
sb.append(", realName=").append(realName);
sb.append(", sex=").append(sex);
sb.append(", address=").append(address);
sb.append(", email=").append(email);
sb.append(", serialVersionUID=").append(serialVersionUID);
sb.append("]");
return sb.toString();
}
}
5.测试Spring与Mybatis的基本整合
1.在test包下面建一个Test类,用来测试 :
其内容分别为:
Test类 :
import mapper.UserDao;
import org.springframework.context.ApplicationContext;
import util.SpringUtil; /**
* test
*
* @author Mr.green
* @date 2021/11/21 17:27
*/
public class Test { @org.junit.jupiter.api.Test
void test(){
ApplicationContext applicationContext= SpringUtil.getApplicationContext();
System.out.println(applicationContext.getBean(UserDao.class).selectByPrimaryKey(1));
}
}
SpringUtil类:
1 package util;
2
3 import org.springframework.context.ApplicationContext;
4 import org.springframework.context.support.ClassPathXmlApplicationContext;
5
6 /**
7 * Spring
8 *
9 * @author Mr.green
10 * @date 2021/11/21 17:28
11 */
12 public class SpringUtil {
13 /*获取spring上下文解析器*/
14 static public ApplicationContext getApplicationContext(){
15 return new ClassPathXmlApplicationContext("config/applicationContext.xml");
16 }
17
18
19 }
直接开始测试 :
Nice,Spring与Mybatis整合成功.
6.测试Sping,Mybatis,SpringMvc的整合
1.建一个jsp页面,用来显示数据库的数据
2.建一个controller响应处理前端的请求
1: 建一个jsp页面
a.jsp的内容:
<%--
Created by IntelliJ IDEA.
User: Philosohy
Date: 2021/11/22
Time: 13:41
To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>Title</title>
</head>
<body>
${user.id}<br>
${user.userName}<br>
${user.passWord}<br>
</body>
</html>
2 .建一个controller:
其内容:
package controller; import util.SpringUtil;
import mapper.UserDao;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import org.springframework.stereotype.Controller;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping; /**
* test
*
* @author Mr.green
* @date 2021/11/21 18:23
*/
@Controller
public class TestController { @RequestMapping("/test")
public String test(Integer id, Model model){
ApplicationContext applicationContext= SpringUtil.getApplicationContext();
model.addAttribute("user",applicationContext.getBean(UserDao.class).selectByPrimaryKey(1)); return "a";
}
}
3.开始测试,启动项目,在跳出来的网页后面加上test :
这不就飞起了!!!!
快速从零开始整合SSM,小白包会(1)的更多相关文章
- 快速搭建springboot框架以及整合ssm+shiro+安装Rabbitmq和Erlang、Mysql下载与配置
1.快速搭建springboot框架(在idea中): file–>new project–>Spring Initializr–>next–>然后一直下一步. 然后复制一下代 ...
- SSM(SpringMVC+Spring+MyBatis)三大框架使用Maven快速搭建整合(实现数据库数据到页面进行展示)
本文介绍使用SpringMVC+Spring+MyBatis三大框架使用Maven快速搭建一个demo,实现数据从数据库中查询返回到页面进行展示的过程. 技术选型:SpringMVC+Spring+M ...
- 整合SSM框架必备基础—SpringMVC(下)
在上一篇文章<整合SSM框架必备基础-SpringMVC(上)>中,胖达介绍了关于SpringMVC的诞生.优势以及执行流程等理论知识点,这篇文章打算在实操中加深一下对SpringMVC的 ...
- IDEA+Maven 整合SSM框架实现简单的增删改查(新手入门,傻瓜操作)
原博客地址:https://blog.csdn.net/khxu666/article/details/79851070 选用SSM框架的原因在目前的企业级Java应用中,Spring框架是必须的.S ...
- shiro权限控制(一):shiro介绍以及整合SSM框架
shiro安全框架是目前为止作为登录注册最常用的框架,因为它十分的强大简单,提供了认证.授权.加密和会话管理等功能 . shiro能做什么? 认证:验证用户的身份 授权:对用户执行访问控制:判断用户是 ...
- 从零开始写一个npm包及上传
最近刚好自己需要写公有npm包及上传,虽然百度上资料都能找到,但是都是比较零零碎碎的,个人就来整理下,如何从零开始写一个npm包及上传. 该篇文件只记录一个大概的流程,一些细节没有记录. tips: ...
- 使用SpringBoot整合ssm项目
SpringBoot是什么? Spring Boot是由Pivotal团队提供的全新框架,其设计目的是用来简化新Spring应用的初始搭建以及开发过程. Spring Boot 现在已经成为Java ...
- Spring Boot 2.0 教程 | 快速集成整合消息中间件 Kafka
欢迎关注个人微信公众号: 小哈学Java, 每日推送 Java 领域干货文章,关注即免费无套路附送 100G 海量学习.面试资源哟!! 个人网站: https://www.exception.site ...
- SpringBoot整合SSM(代码实现Demo)
SpringBoot整合SSM 如图所示: 一.数据准备: 数据库文件:数据库名:saas-export,表名:ss_company 创建表语句: DROP TABLE IF EXISTS ss_co ...
随机推荐
- TCP服务器和客户端_Socket编程
TCP服务器 服务器启动文件 1 import java.io.IOException; 2 import java.net.ServerSocket; 3 import java.net.Socke ...
- 2021.1.23--vj补题
B - B CodeForces - 879B n people are standing in a line to play table tennis. At first, the first tw ...
- Java生成6位数验证码
public static String getCode() { return String.valueOf((int) ((Math.random() * 9 + 1) * 100000));} 生 ...
- Framework - 性能统计
摘要 近期对接客户时,客户方希望提供 SDK 的性能.内存.隐私支持等一些数据,所以就对 SDK 进行了一些性能测试. 在用表格统计整理这些数据时,突然发现,经常用统计的方式看 SDK 的相关数据,似 ...
- 第五次Alpha Scrum Meeting
本次会议为Alpha阶段第五次Scrum Meeting会议 会议概要 会议时间:2021年4月30日 会议地点:线上会议 会议时长:15min 会议内容简介:本次会议以主要围绕卡牌对接的诸多问题与对 ...
- [no code][scrum meeting] Alpha 10
项目 内容 会议时间 2020-04-16 会议主题 用户管理第一版交付 会议时长 15min 参会人员 PM+后端组成员 $( "#cnblogs_post_body" ).ca ...
- 21.10.14 test
题目 WOJ5078 到 WOJ5081 T1 Problem A \(\color{green}{100}\) 由于每轮要选择尽量多的边删除,所以想到无向图的生成树,因为在生成树上再加一条边就会形成 ...
- jQuery常用验证
1.文本框不能为为空 if ($("#RushStartTime").val() == "") { alert("请输入该产品.."); $ ...
- wpa_supplicant启动出错rfkill: Cannot open RFKILL control device
在板子是调试网络,千辛万苦把wpa_supplicant及其依赖都移植编译进来了,在板子上调试启动的时候启动报错了 D/wpa_supplicant( 1152): wpa_supplicant v2 ...
- c 不同类型的指针
今天看到了一个问题:c里面,不同类型的指针是否可以互指呢?也就是不同类型的指针之间是否可以互相赋值,我想了想,对于32位机子而言,所有类型的指针都是4Byte(64位就是8Byte,这里只讨论32位) ...