发表于: 2018-03-09 20:54:46

2 601


今天完成的事情:

学习数据库三范式

数据库的设计范式是数据库设计所需要满足的规范,数据库的规范化是优化表的结构和优化把数据组织到表中的方式,这样使数据更明确,更简洁。实践中,通常把一个数据库分成两个或多个表并定义表之间的关系以做到数据隔离,添加、删除和修改某个字段只需要在一个表中进行,接着可以通过定义的关系传递到数据库中剩余的表中(和分层思想的意义所在很相似)。这样我们可以消除很多错误或垃圾数据出现的机会并减轻更新信息所必要的工作量。

目前,主要有六种范式:第一范式、第二范式、第三范式、BC范式、第四范式和第五范式。满足最低要求的叫第一范式,简称1NF。在第一范式基础上进一步满足一些要求的为第二范式,简称2NF。其余依此类推

事物往往具有多面性,设计范式也会带来一定的麻烦:操作困难,因为需要联系多个表才能得到所需要数据,而且范式越高性能就会越差。所以使用多高的范式需要权衡利弊一般在项目中,使用到第三范式也就足够了,性能好而且方便管理数据


1、第一范式1NF

定义:数据库表中的字段都是单一属性的,不可再分。

简单的说,每一个属性都是原子项,不可分割。

1NF是关系模式应具备的最起码的条件,如果数据库设计不能满足第一范式,就不称为关系型数据库。也就是说,只要是关系型数据库,就一定满足第一范式。


2、第二范式2NF

定义:数据库表中不存在非关键字段对任一候选关键字段的部分函数依赖,即符合第二范式。

如果一个表中某一个字段A的值是由另外一个字段或一组字段B的值来确定的,就称为A函数依赖于B。》

2NF可以减少插入异常,删除异常和修改异常。

简单的说,一方面,第二范式肯定要满足第一范式,否则就没有必要谈第二范式。

另一方面,当某张表中的非主键信息不是由整个主键函数来决定时,即存在依赖于该表中不是主键的部分或者依赖于主键一部分的部分时,通常会违反2NF


3、第三范式3NF

定义:在第二范式的基础上,数据表中如果不存在非关键字段对任一候选关键字段的传递函数依赖则符合3NF

我们看到,第三范式规则查找以消除没有直接依赖于第一范式和第二范式形成的表的主键的属性。我们为没有与表的主键关联的所有信息建立了一张新表。每张新表保存了来自源表的信息和它们所依赖的主键。


初步学习spring

假如我们通过spring创建一个方法会有如下步骤:

1. 创建一个Spring的IOC容器对象 
2. 从IOC容器中获取Bean实例 
3. 调用sayHello()方法  

IOC容器

Spring 容器是 Spring 框架的核心。容器将创建对象,把它们连接在一起,配置它们,并管理他们的整个生命周期从创建到销毁。Spring 容器使用依赖注入(DI)来管理组成一个应用程序的组件。这些对象被称为 Spring Beans。

通过阅读配置元数据提供的指令,容器知道对哪些对象进行实例化,配置和组装。配置元数据可以通过 XML,Java 注释或 Java 代码来表示。下图是 Spring 如何工作的高级视图。 Spring IoC 容器利用 Java 的 POJO 类和配置元数据来生成完全配置和可执行的系统或应用程序

Bean 定义

被称作 bean 的对象是构成应用程序的支柱也是由 Spring IoC 容器管理的。bean 是一个被实例化,组装,并通过 Spring IoC 容器所管理的对象。这些 bean 是由用容器提供的配置元数据创建的,例如,已经在先前章节看到的,在 XML 的表单中的 定义。

bean 定义包含称为配置元数据的信息,下述容器也需要知道配置元数据:

  • 如何创建一个 bean

  • bean 的生命周期的详细信息

  • bean 的依赖关系


依赖注入

每个基于应用程序的 java 都有几个对象,这些对象一起工作来呈现出终端用户所看到的工作的应用程序。当编写一个复杂的 Java 应用程序时,应用程序类应该尽可能独立于其他 Java 类来增加这些类重用的可能性,并且在做单元测试时,测试独立于其他类的独立性。依赖注入(或有时称为布线)有助于把这些类粘合在一起,同时保持他们独立。


使用mybatis跑通增删改查

<?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="mybatis.UserMapper">
   <!-- 需求:通过id查询用户 -->
   <select id="findUserById" parameterType="int" resultType="mybatis.User">

       select * from student where ID = #{ID}
</select>
       <!-- 根据用户名称模糊查询用户信息,可能返回多条 -->
       <select id="findUserByName" parameterType="java.lang.String" resultType="mybatis.User">
       select * from student where name like '%${value}%'
</select>

       <!-- 添加用户 -->
       <insert id="insertUser" parameterType="mybatis.po.User">
       insert into user(username,birthday,sex,address) values(#{username},#{birthday},#{sex},#{address})
<!-- 将插入数据的主键返回,返回到user对象中 -->
       <selectKey keyProperty="id" order="AFTER" resultType="java.lang.Integer">
       select last_insert_id()
</selectKey>
       <selectKey keyProperty="id" order="BEFORE" resultType="java.lang.String">
       select uuid()
</selectKey>
       </insert>

       <!-- 删除用户 -->
       <delete id="deleteUser" parameterType="java.lang.Integer">
       delete from student where ID=#{id}
</delete>

       <!-- 更新用户 -->
       <update id="updateUser" parameterType="mybatis.User">
       update student set name=#{username} where id=#{id}
</update>
       </mapper>


/**
* @author Arike
* Create_at  2017/11/20 9:38
*                            _ooOoo_
//                           o8888888o
//                           88" . "88
//                           (| -_- |)
//                            O\ = /O
//                        ____/`---'\____
//                      .   ' \\| |// `.
//                       / \\||| : |||// \
//                     / _||||| -:- |||||- \
//                       | | \\\ - /// | |
//                     | \_| ''\---/'' | |
//                      \ .-\__ `-` ___/-. /
//                   ___`. .' /--.--\ `. . __
//                ."" '< `.___\_<|>_/___.' >'"".
//               | | : `- \`.;`\ _ /`;.`/ - ` : | |
//                 \ \ `-. \_ __\ /__ _/ .-` / /
//         ======`-.____`-.___\_____/___.-`____.-'======
//                            `=---='
//
//         .............................................
//                  佛祖保佑             永无BUG
//          佛曰:
//                  写字楼里写字间,写字间里程序员;
//                  程序人员写程序,又拿程序换酒钱。
//                  酒醒只在网上坐,酒醉还来网下眠;
//                  酒醉酒醒日复日,网上网下年复年。
//                  但愿老死电脑间,不愿鞠躬老板前;
//                  奔驰宝马贵者趣,公交自行程序员。
//                  别人笑我忒疯癫,我笑自己命太贱;
//                  不见满街漂亮妹,哪个归得程序员?
*/
package mybatis;

import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
import org.junit.Before;
import org.junit.Test;

import java.io.InputStream;
import java.util.List;

public class MapperTest {
private SqlSessionFactory sqlSessionFactory;
   
   @Before //创建sqlSessionFactory
   public void setUp() throws Exception {
String resource = "SqlMapConfig.xml"; //mybatis配置文件
       //得到配置文件的流
       InputStream inputStream = Resources.getResourceAsStream(resource);
       //创建会话工厂SqlSessionFactory,要传入mybaits的配置文件的流
       sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
   }

@Test
   public void testFindUserById() throws Exception {

SqlSession sqlSession = sqlSessionFactory.openSession();
       //创建UserMapper对象,mybatis自动生成mapper代理对象
       UserMapper userMapper = sqlSession.getMapper(UserMapper.class);
       User user = userMapper.findUserById(1);
       System.out.println(user);
   }

@Test
   public void testFindUserByName() throws Exception {

SqlSession sqlSession = sqlSessionFactory.openSession();
       //创建UserMapper对象,mybatis自动生成mapper代理对象
       UserMapper userMapper = sqlSession.getMapper(UserMapper.class);
       List<User> list = userMapper.findUserByName("韩");
       sqlSession.close();
       System.out.println(list);
   }

@Test
   public void testDeleteUser() throws Exception {
SqlSession sqlSession = sqlSessionFactory.openSession();
       UserMapper userMapper = sqlSession.getMapper(UserMapper.class);
       userMapper.deleteUser(10);
       System.out.println("hello world");
   }
}

log4j配置

Log4j有三个主要的组件:Loggers(记录器),Appenders (输出源)和Layouts(布局)。这里可简单理解为日志类别,日志要输出的地方和日志以何种形式输出。综合使用这三个组件可以轻松地记录信息的类型和级别,并可以在运行时控制日志输出的样式和位置。

1、Loggers

Loggers组件在此系统中被分为五个级别:DEBUG、INFO、WARN、ERROR和FATAL。这五个级别是有顺序的,DEBUG < INFO < WARN < ERROR < FATAL,分别用来指定这条日志信息的重要程度,明白这一点很重要,Log4j有一个规则:只输出级别不低于设定级别的日志信息,假设Loggers级别设定为INFO,则INFO、WARN、ERROR和FATAL级别的日志信息都会输出,而级别比INFO低的DEBUG则不会输出。

2、Appenders

禁用和使用日志请求只是Log4j的基本功能,Log4j日志系统还提供许多强大的功能,比如允许把日志输出到不同的地方,如控制台(Console)、文件(Files)等,可以根据天数或者文件大小产生新的文件,可以以流的形式发送到其它地方等等。

常使用的类如下:

org.apache.log4j.ConsoleAppender(控制台)
org.apache.log4j.FileAppender(文件)
org.apache.log4j.DailyRollingFileAppender(每天产生一个日志文件)
org.apache.log4j.RollingFileAppender(文件大小到达指定尺寸的时候产生一个新的文件)
org.apache.log4j.WriterAppender(将日志信息以流格式发送到任意指定的地方)

配置模式:
log4j.appender.appenderName = className
log4j.appender.appenderName.Option1 = value1

log4j.appender.appenderName.OptionN = valueN

3、Layouts

有时用户希望根据自己的喜好格式化自己的日志输出,Log4j可以在Appenders的后面附加Layouts来完成这个功能。Layouts提供四种日志输出样式,如根据HTML样式、自由指定样式、包含日志级别与信息的样式和包含日志时间、线程、类别等信息的样式。

常使用的类如下:

org.apache.log4j.HTMLLayout(以HTML表格形式布局)
org.apache.log4j.PatternLayout(可以灵活地指定布局模式)
org.apache.log4j.SimpleLayout(包含日志信息的级别和信息字符串)
org.apache.log4j.TTCCLayout(包含日志产生的时间、线程、类别等信息)

配置模式:

log4j.appender.appenderName.layout =className
log4j.appender.appenderName.layout.Option1 = value1

log4j.appender.appenderName.layout.OptionN = valueN


周会回顾了一下mybatis,同时学会了查看源码


明天计划的事情:

今天WIKI一直登陆不上,明天上传小课堂

学习动态SQL和spring


遇到的问题:


收获:巩固了基础知识


返回列表 返回列表
评论

    分享到