0831总结
首先就是讲了一些基本的Java的基础,然后就是自己的动手实现一个自定义的集合了类,在这个集合类中,就像list的实现一样,有初始长度(size),当集合的长度大于集合类的初始长度的时候,要进行长度的扩充(例如ArrayList的扩充是扩充为原来的1.5倍,Vector是扩充为原来的2倍),要有add函数,get函数,其实都是实现的接口;
package peixun;
import java.util.Collection;
import java.util.Iterator;
import java.util.Spliterator;
import java.util.Spliterators;
public interface settest<E> extends Collection<E> {
int size();
boolean isEmpty();
boolean contains(Object o);
Iterator<E> iterator();
<T> T[] toArray(T[] a);
boolean add(E e);
boolean remove(Object o);
boolean containsAll(Collection<?> c);
boolean addAll(Collection<? extends E> c);
boolean retainAll(Collection<?> c);
boolean removeAll(Collection<?> c);
void clear();
boolean equals(Object o);
int hashCode();
@Override
default Spliterator<E> spliterator() {
return Spliterators.spliterator(this, Spliterator.DISTINCT);
}
}
然后就是讲解了一下当下的框架技术(当前公司用的比较多的就是SpringBoot、SSH、SSM)个人的理解,还是SpringBoot更好用一些,但是也不能说就只会用自己觉得好用的,其余的都不会,这样即使自己的会的技术很前端,但是和公司主用的技术不一致,在工作上也难免会有问题,所以,对我们学生来说,我们要掌握的很多,只要是能用的东西,我们都要去学习,在这里,个人对SSM框架做一个梳理和总结:
SSM就是SpringMVC、Spring和Mybatis的组合。
SpringMVC:它用于web层,相当于controller(等价于传统的servlet和struts的action),用来处理用户请求。之前学到的SpringBoot里面就是通过controller对用户的请求进行解析然后返回一个字符串(这个字符串一般就是要返回页面的名称,因为前缀和后缀在我们的框架中都已经定义好了,当然自己也可以在配置文件中进行自定义的修改),然后这个字符串就带领我们走向了一个我们后台指定的要我们去到的页面。
例如:
@Controller
@RequestMapping("/book")
public class BookController {
private Logger logger = LoggerFactory.getLogger(this.getClass());
@Autowired
private BookService bookService;
@RequestMapping(value = "/list", method = RequestMethod.GET)
private String list(Model model) {
List<Book> list = bookService.getList();
model.addAttribute("list", list);
// list.jsp + model = ModelAndView
return "list";// WEB-INF/jsp/"list".jsp
}
这里,其实就是我们通过发送请求(这里的请求就是list,也就是在我们的地址栏中访问的就是local host://8080/list),然后这个请求就会通过我们的程序,在我们的Controller中进行解析,并且在这里面可以进行一些列的相关函数操作或者是运算等等,然后就可以返回一个String类型的字符串,这个字符串就是我们我们要访问的地址,当然前缀和后缀的拼接时必不可少的,这样才能访问到我们想要去的页面,
Spring:太强大了,以至于我无法用一个词或一句话来概括它。但与我们平时开发接触最多的估计就是IOC容器,它可以装载bean(也就是我们java中的类,当然也包括service dao里面的),有了这个机制,我们就不用在每次使用这个类的时候为它初始化,很少看到关键字new。另外spring的aop,事务管理等等都是我们经常用到的。
MyBatis:个人觉得MyBatis相比Hibernate更好用。第一,它能自由控制sql,这会让有数据库经验的人编写的代码能搞提升数据库访问的效率。第二,它可以使用xml的方式来组织管理我们的sql,因为一般程序出错很多情况下是sql出错,别人接手代码后能快速找到出错地方,甚至可以优化原来写的sql。由于个人先系统的学习的是SpringBoot,SpringBoot是对这些的大体的整合,这些框架里面的机制,在SpringBoot中都有,MyBatis对于我个人的理解就是对数据库的一系列的操作,不用我们再像最开始的那样,每次的对数据库的操作都要进行相关方法的编写,这样在项目运行的时候,也会比较累,这应该也是MyBatis发展起来的原因,查找问题更方便,而且还简单。
例如:在我们的dao里面有这样一个功能代码:
Appointment queryByKeyWithBook(@Param("bookId") long bookId, @Param("studentId") long studentId);
在这里面queryByKeyWithBook就是函数的名称,并且在后面有相关参数的传递,一个是bookid一个是syudentid,然后就会在我们的mapper中进行相关方法操作的具体实现:
<select id="queryByKeyWithBook" resultType="Appointment">
<!-- 如何告诉MyBatis把结果映射到Appointment同时映射book属性 -->
<!-- 可以自由控制SQL -->
SELECT
a.book_id,
a.student_id,
a.appoint_time,
b.book_id "book.book_id",
b.`name` "book.name",
b.number "book.number"
FROM
appointment a
INNER JOIN book b ON a.book_id = b.book_id
WHERE
a.book_id = #{bookId}
AND a.student_id = #{studentId}
</select>
这就是调用了我们的方法进行的操作,然后将我们的返回值,以Appointment 类型进行返回,当然Appointment就是我们的实体类了。
其次我们的框架已经不再使用jdbc‘的方式进行数据库的连接了,现在我们的数据库的链接基本全是在配置文件中进行的;
例如这里ssm的jdbc.properties中的:
jdbc.driver=com.mysql.jdbc.Driver
jdbc.url=jdbc:mysql://localhost:3306/340message?useUnicode=true&characterEncoding=utf8
jdbc.username=root
jdbc.password=root
还有在SpringBoot 中的数据库的链接也全是在数据库中实现的:
spring:
datasource:
username: root
password: root
url:
jdbc:mysql://192.168.2.108:3306/mybatis
driver-class-name:
com.mysql.cj.jdbc.Driver
再来总结一下ssm的架构的主要的层次:
对于我们的目录层次:
Dao就是数据访问层(接口)与数据打交道,可以是数据库操作,也可以是文件读写操作,甚至是redis缓存操作,总之与数据操作有关的都放在这里,也有人叫做dal或者数据持久层都差不多意思。我们用的是mybatis,所以可以直接在配置文件中实现接口的每个方法。
Entity就是实体类,一般与数据库的表相对应,封装dao层取出来的数据为一个对象,也就是我们常说的pojo,一般只在dao层与service层之间传输。
Dto就是数据传输层,很多时间一个entity并不能满足我们的业务需求,可能呈现给用户的信息十分之多,这时候就有了dto,也相当于vo,不要把这个混杂在entity里面
Service就是业务逻辑(接口),这里面就是写我们的业务逻辑,也有人叫bll,在设计业务接口时候应该站在“使用者”的角度。
serviceImpl就是业务逻辑(实现),实现我们业务接口,一般事务控制是写在这里。
Web就是控制器,springmvc就是在这里发挥作用的,也叫做controller控制器,相当于struts中的action。
在mapper中的语法结构就是:
<?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="com.soecode.lyf.dao.BookDao">
<!-- 目的:为dao接口方法提供sql语句配置 -->
<select id="queryById" resultType="Book" parameterType="long">
<!-- 具体的sql -->
SELECT
book_id,
name,
number
FROM
book
WHERE
book_id = #{bookId}
</select>
<select id="queryAll" resultType="Book">
SELECT
book_id,
name,
number
FROM
book
ORDER BY
book_id
LIMIT #{offset}, #{limit}
</select>
<update id="reduceNumber">
UPDATE book
SET number = number - 1
WHERE
book_id = #{bookId}
AND number > 0
</update>
</mapper>
项目是maven,所以pom.xml是必不可少的:
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.soecode.ssm</groupId>
<artifactId>ssm</artifactId>
<packaging>war</packaging>
<version>0.0.1-SNAPSHOT</version>
<name>ssm Maven Webapp</name>
<url>http://github.com/liyifeng1994/ssm</url>
<dependencies>
<!-- 单元测试 -->
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.11</version>
</dependency>
<!-- 1.日志 -->
<!-- 实现slf4j接口并整合 -->
<dependency>
<groupId>ch.qos.logback</groupId>
<artifactId>logback-classic</artifactId>
<version>1.1.1</version>
</dependency>
<!-- 2.数据库 -->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.37</version>
<scope>runtime</scope>
</dependency>
<dependency>
<groupId>c3p0</groupId>
<artifactId>c3p0</artifactId>
<version>0.9.1.2</version>
</dependency>
<!-- DAO: MyBatis -->
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.3.0</version>
</dependency>
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis-spring</artifactId>
<version>1.2.3</version>
</dependency>
<!-- 3.Servlet web -->
<dependency>
<groupId>taglibs</groupId>
<artifactId>standard</artifactId>
<version>1.1.2</version>
</dependency>
<dependency>
<groupId>jstl</groupId>
<artifactId>jstl</artifactId>
<version>1.2</version>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>2.5.4</version>
</dependency>
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>javax.servlet-api</artifactId>
<version>3.1.0</version>
</dependency>
<!-- 4.Spring -->
<!-- 1)Spring核心 -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-core</artifactId>
<version>4.1.7.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-beans</artifactId>
<version>4.1.7.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>4.1.7.RELEASE</version>
</dependency>
<!-- 2)Spring DAO层 -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-jdbc</artifactId>
<version>4.1.7.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-tx</artifactId>
<version>4.1.7.RELEASE</version>
</dependency>
<!-- 3)Spring web -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-web</artifactId>
<version>4.1.7.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>4.1.7.RELEASE</version>
</dependency>
<!-- 4)Spring test -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-test</artifactId>
<version>4.1.7.RELEASE</version>
</dependency>
<!-- redis客户端:Jedis -->
<dependency>
<groupId>redis.clients</groupId>
<artifactId>jedis</artifactId>
<version>2.7.3</version>
</dependency>
<dependency>
<groupId>com.dyuproject.protostuff</groupId>
<artifactId>protostuff-core</artifactId>
<version>1.0.8</version>
</dependency>
<dependency>
<groupId>com.dyuproject.protostuff</groupId>
<artifactId>protostuff-runtime</artifactId>
<version>1.0.8</version>
</dependency>
<!-- Map工具类 -->
<dependency>
<groupId>commons-collections</groupId>
<artifactId>commons-collections</artifactId>
<version>3.2</version>
</dependency>
</dependencies>
<build>
<finalName>ssm</finalName>
</build>
</project>
在Spring中的配置还是比较多的,我们可以分为三个层次,就是dao,service,还有web也就是controller
第一步,
1、首先我们的数据库要将我们的数据库的相关的链接参数读入程序中,
2、然后我们就是要配置我们的数据库的连接池,
3、配置连接属性,可以不读配置文件直接在这里写死
4、配置c3p0的文件,只配置几个常用的就行
5、配置mybatis对象也就是说起了sessionfactory
6、扫描dao层的接口,sql和参数都写在xml中
因为数据库配置相关参数是读取配置文件,所以在resources
文件夹里新建一个jdbc.properties
文件,存放我们4个最常见的数据库连接属性,
jdbc.driver=com.mysql.jdbc.Driver
jdbc.url=jdbc:mysql://localhost:3307/ssm?useUnicode=true&characterEncoding=utf8
jdbc.username=root
jdbc.password=root
这里数据库操作用的是mybatis,我们就要在recources中进行mybatis-config.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>
<!-- 使用jdbc的getGeneratedKeys获取数据库自增主键值 -->
<setting name="useGeneratedKeys" value="true" />
<!-- 使用列别名替换列名 默认:true -->
<setting name="useColumnLabel" value="true" />
<!-- 开启驼峰命名转换:Table{create_time} -> Entity{createTime} -->
<setting name="mapUnderscoreToCamelCase" value="true" />
</settings>
</configuration>
第二步:(service层的配置),在spring文件夹中新建spring-config.xml文件
1、 扫描service包所有注解的@Service
2、 配置事物管理器,把事物管理交给Spring来完成
3、 配置基于直接的声明式事物,可以直接在方法上@Tanscation
在Spring-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:tx="http://www.springframework.org/schema/tx"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context.xsd
http://www.springframework.org/schema/tx
http://www.springframework.org/schema/tx/spring-tx.xsd">
<!-- 扫描service包下所有使用注解的类型 -->
<context:component-scan base-package="com.soecode.lyf.service" />
<!-- 配置事务管理器 -->
<bean id="transactionManager"
class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<!-- 注入数据库连接池 -->
<property name="dataSource" ref="dataSource" />
</bean>
<!-- 配置基于注解的声明式事务 -->
<tx:annotation-driven transaction-manager="transactionManager" />
</beans>
第三步:就是配置我们的web层,在Spring文件夹中新建Spring-web.xml文件
1、 要开启SpringMVC的注解模式,可以使用@RequestMapping,@Responsebody
2、 对静态文件进行处理 ,如js\css\jpg等
3、 配置jsp显示viewResolver,例如在controlller中某个方法返回一个String类型的login,实际上返回的是“WEB-INF/login.jsp”,这个其实也就是前缀和后缀的拼接
4、 扫描web层的@Controller
在Spring-web.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
http://www.springframework.org/schema/context/spring-context.xsd
http://www.springframework.org/schema/mvc
http://www.springframework.org/schema/mvc/spring-mvc-3.0.xsd">
<!-- 配置SpringMVC -->
<!-- 1.开启SpringMVC注解模式 -->
<!-- 简化配置:
(1)自动注册DefaultAnootationHandlerMapping,AnotationMethodHandlerAdapter
(2)提供一些列:数据绑定,数字和日期的format @NumberFormat, @DateTimeFormat, xml,json默认读写支持
-->
<mvc:annotation-driven />
<!-- 2.静态资源默认servlet配置
(1)加入对静态资源的处理:js,gif,png
(2)允许使用"/"做整体映射
-->
<mvc:default-servlet-handler/>
<!-- 3.配置jsp 显示ViewResolver -->
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="viewClass" value="org.springframework.web.servlet.view.JstlView" />
<property name="prefix" value="/WEB-INF/jsp/" />
<property name="suffix" value=".jsp" />
</bean>
<!-- 4.扫描web相关的bean -->
<context:component-scan base-package="com.soecode.lyf.web" />
</beans>
第四步:对web.xml文件的创建和配置,存在于web-inf下
<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_3_1.xsd"
version="3.1" metadata-complete="true">
<!-- 如果是用mvn命令生成的xml,需要修改servlet版本为3.1 -->
<!-- 配置DispatcherServlet -->
<servlet>
<servlet-name>seckill-dispatcher</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<!-- 配置springMVC需要加载的配置文件
spring-dao.xml,spring-service.xml,spring-web.xml
Mybatis - > spring -> springmvc
-->
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:spring/spring-*.xml</param-value>
</init-param>
</servlet>
<servlet-mapping>
<servlet-name>seckill-dispatcher</servlet-name>
<!-- 默认匹配所有的请求 -->
<url-pattern>/</url-pattern>
</servlet-mapping>
</web-app>
日志的配置,在resources文件夹下创建logback.xml
<?xml version="1.0" encoding="UTF-8"?>
<configuration debug="true">
<appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
<!-- encoders are by default assigned the type ch.qos.logback.classic.encoder.PatternLayoutEncoder -->
<encoder>
<pattern>%d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n</pattern>
</encoder>
</appender>
<root level="debug">
<appender-ref ref="STDOUT" />
</root>
</configuration>