发表于: 2017-05-22 14:32:38

2 1253


今日完成(这是昨天和今天两天做的,昨天做的太晚还没解决log4j的坑就没写)

任务一的大概算是做完了,决定重新做一遍,算是复盘。


1: 搭建MySQL

首先,在服务器上搭建好MySQL 服务器,这样就可以直接在网上建立数据库了。因为项目使用了Spring和MyBatis,所以在本地MySQL和在线的MySQL之间切换只需要修改Spring配置文件里面dataSource的连接即可(前提是两个数据库里面表格一致)。搭建MySQL没有遇到什么问题。搭建好了MySQL之后就可以使用Navicat连接数据库了。


2:建立Table

链接好了数据库之后可以吧报名的table建立好了。我的表格设计如下:

我没有给任何field加unique,比如真实姓名,有重名的可能,所以不能用unique,online_id可能报不同的班级,所以也没用unique,关系用service里面控制吧。

向数据库插入第一个数据,以后用来测试连接时候用。

insert into enroll.enroll (created_at, updated_at, realname, qq, school, tutor, online_id, study_note_link, study_aoth, expected_start_date, heard_us_from, class_name) values ('2017-05-20 05:20:00', '2017-05-20 05:20:00', 'JAVA', '1314', 'Xiuzhen', 'Master Java', 'JAVA-999', 'www.google.com', 'Study hard', '2017-05-20', 'Zhinu', 'JAVA 88'); 

现在有了数据库和table,接着可以进入写码了。


3:创建maven项目

我在eclipse里面选择了Maven-archetype-quickstart 1.1的项目结构。创建好的结构的classpath是src/main/java. Test的classpath是src/test/java.


项目默认的junit是3.8的,我把它替换成4.12的,替换掉原来的依赖如下

<dependency>

<groupId>junit</groupId>

<artifactId>junit</artifactId>

<version>4.12</version>

</dependency>


因为后面还要用到log4j我把log4j以来加入(不是log4j2)

<dependency>

<groupId>log4j</groupId>

<artifactId>log4j</artifactId>

<version>1.2.17</version>

</dependency>


4:创建Spring配置文件spring.xml

首先在pom.xml里面加上Spring的依赖

<dependency>

<groupId>org.springframework</groupId>

<artifactId>spring-context</artifactId>

<version>4.3.8.RELEASE</version>

</dependency>


spring.xml 加上DataSource。一共有两个Dependencies一个是MySql的jdbc driver。还有一个是Spring的JDBC 连接用的。如下:

        <!-- 这个是mysqljdbc driver -->

        <dependency>

            <groupId>mysql</groupId>

            <artifactId>mysql-connector-java</artifactId>

            <version>5.1.6</version>

        </dependency>


        <!-- Spring 的 datasource 连接MySql使用了这个 -->

        <dependency>

            <groupId>org.springframework</groupId>

            <artifactId>spring-jdbc</artifactId>

            <version>4.3.8.RELEASE</version>

        </dependency>

有了这两个,我们就可以在spring.xml里面配置DataSource连接MySql了。在Spring里配置DataSource如下

<bean id="dataSource"

class="org.springframework.jdbc.datasource.DriverManagerDataSource">

<property name="driverClassName" value="com.mysql.jdbc.Driver" />

<property name="url"

value="jdbc:mysql://你的MySql IP地址:3306/enroll?characterEncoding=utf8" />

<property name="username" value="你的帐号" />

<property name="password" value="你的密码" />

</bean>

这里遇到第一个坑是连接url上没有加characterEncoding=utf8,结果保存的中文都是???,加上编码后可以存中文了。


到这里,可以写个测试来验证已经可以通过Spring连接MySQL了。

import java.sql.Connection;

import java.sql.ResultSet;

import java.sql.SQLException;

import java.sql.Statement;


import javax.sql.DataSource;


import org.junit.Test;

import org.springframework.context.ApplicationContext;

import org.springframework.context.support.ClassPathXmlApplicationContext;

import org.springframework.jdbc.datasource.DataSourceUtils;



public class MySQLSpringConnectionTest {

@Test

public void mySqlSpringConnectionTest() throws SQLException {

ApplicationContext ctx

new ClassPathXmlApplicationContext("springtest.xml");

DataSource ds = (DataSource) ctx.getBean("dataSource");

Connection conn = DataSourceUtils.getConnection(ds);

Statement stmt = null;

ResultSet rs = null;

try {

stmt = conn.createStatement();

rs = stmt.executeQuery("select * from enroll where enroll_id=1");

while (rs.next()) {

String name = rs.getString("realname");

System.out.println(name);

}

} catch (Exception e) {

} finally {

if (rs != null)

rs.close();

if (stmt != null)

stmt.close();

if (conn != null)

conn.close();

}

}

}

我的连接成功的打印出了前面insert的第一条数据。Spring的DataSource已经设置好了,可以来引入MyBatis了。


5: 引入MyBatis

首先在pom.xml里面引入mybatis的dependencies,有两个,一个是mybatis自己,另外一个是mybatis-spring,如下

<dependency>

<groupId>org.mybatis</groupId>

<artifactId>mybatis</artifactId>

<version>3.4.4</version>

</dependency>


<dependency>

<groupId>org.mybatis</groupId>

<artifactId>mybatis-spring</artifactId>

<version>1.3.1</version>

</dependency>

然后在Spring里面设置myBatis如下

<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">

<property name="dataSource" ref="dataSource" />

</bean>

这样mybatis就设置好了,可以开始写mybatis的mapper 了。(写mapper之前先写了POJO)


6: 报名业务的POJO class 

public class EnrollData {


int enroll_Id;

java.sql.Timestamp created_at;

java.sql.Timestamp updated_at;

String realname;

String qq;

String school;

String tutor;

String online_id;

String study_note_link;

String study_aoth;

java.sql.Date expected_start_date;

String heard_us_from;

String class_name;

// 以及这些class variable的getter setter

我没有使用java命名规范,而是使用了和数据库里面列一样的名字,以免自己记混。


7: MyBatis mapper

首先是创建最简单的mapper interface

import java.util.List;

import com.xiuzhen.enroll.po.EnrollData;


public interface EnrollDataMapper {

List<EnrollData> selectAll();

List<EnrollData> selectByRealname(String realname);

List<EnrollData> selectByOnlineId(String online_id);

EnrollData selectById(int enroll_id);

int insert(EnrollData ed);

int update(EnrollData ed);

int delete(EnrollData ed);

}

我选择返回List的都是有可能有重复的,比如重名,比如一个online id报名两个课程


我选了使用XML配置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.xiuzhen.enroll.dal.EnrollDataMapper'>


    <resultMap type="com.xiuzhen.enroll.po.EnrollData" id="EnrollDataResult">

        <id property="enroll_id" column="enroll_id"/>

        <result property="created_at" column="created_at"/>

        <result property="updated_at" column="updated_at"/>

        <result property="realname" column="realname"/>

        <result property="qq" column="qq"/>

        <result property="school" column="school"/>

        <result property="tutor" column="tutor"/>

        <result property="online_id" column="online_id"/>

        <result property="study_note_link" column="study_note_link"/>

        <result property="expected_start_date" column="expected_start_date"/>

        <result property="study_aoth" column="study_aoth"/>

        <result property="heard_us_from" column="heard_us_from"/>

        <result property="class_name" column="class_name"/>

    </resultMap>

    

    <select id='selectById' parameterType='int' resultMap="EnrollDataResult">

        select * from enroll where id=#{enroll_id}

    </select>


    <select id='selectByOnlineId' parameterType='string' resultMap="EnrollDataResult">

        select * from enroll where online_id=#{online_id}

    </select>

    

    <select id='selectByRealname' parameterType='string' resultMap="EnrollDataResult">

        select * from enroll where realname=#{realname}

    </select>

    

    <select id='selectAll' resultMap="EnrollDataResult">

        select * from enroll

    </select>

    

    <insert id='insert' parameterType='com.xiuzhen.enroll.po.EnrollData'>

        insert into enroll (created_at, updated_at, realname, qq, school, 

        tutor, online_id, study_note_link, study_aoth, 

        expected_start_date, heard_us_from, class_name)

        values  

        (#{created_at}, #{updated_at}, #{realname}, #{qq}, #{school}, 

        #{tutor}, #{online_id}, #{study_note_link}, #{study_aoth}, 

        #{expected_start_date}, #{heard_us_from}, #{class_name})

    </insert>

    

    <update id="update" parameterType="com.xiuzhen.enroll.po.EnrollData">

        update enroll set

         created_at=#{created_at}, 

         updated_at=#{updated_at}, 

         realname=#{realname}, 

         qq=#{qq}, 

         school=#{school}, 

         tutor=#{tutor}, 

         online_id=#{online_id}, 

         study_note_link=#{study_note_link}, 

         study_aoth=#{study_aoth}, 

         expected_start_date=#{expected_start_date}, 

         heard_us_from=#{heard_us_from}

         class_name=#{class_name}

         where id=#{enrollDataId}

    </update>

    

    <delete id="delete" parameterType="com.xiuzhen.enroll.po.EnrollData">

        delete from enroll where id=#{enroll_id}

    </delete>

</mapper>

这里遇到一个问题就是。。。在mapper.xml里面写错名字。。写错了名字结果找了好久才找到。。。

mapper写好了不用着急测试,可以DAO一起写了。


8:DAO

先写interface,和mapper interface很像,但是把返回int变成boolean。如下

public interface EnrollDataDAO {

List<EnrollData> selectAll();

List<EnrollData> selectByRealname(String realname);

List<EnrollData> selectByOnlineId(String online_id);

EnrollData selectById(int enroll_id);

boolean insert(EnrollData ed);

boolean update(EnrollData ed);

boolean delete(EnrollData ed);

}

然后写DAO的impl,里面加入了一些判断,以及try catch控制一些错误。

DAOImpl里面有个private的mapper class variable,以及它的setter。以后使用的时候可以通过spring 注入这个mapper。

package com.xiuzhen.enroll.dal;

import java.util.List;

import com.xiuzhen.enroll.po.EnrollData;


public class EnrollDataDAOImpl implements EnrollDataDAO{

private EnrollDataMapper enrollDataMapper = null;

public void setEnrollDataMapper(EnrollDataMapper enrollDataMapper) {

this.enrollDataMapper = enrollDataMapper;

}


public List<EnrollData> selectAll() {

// selectAll 不需要测试,因为如果没有数据返回的也是一个list,不过size=0

// 遍历这个size 0 的list也不会出错,只是没有东西

// 不过。。。还是要catch一下。。万一断了连接呢。。。

try {

return enrollDataMapper.selectAll();

} catch (Exception e) {

return null;

}

}


public List<EnrollData> selectByRealname(String realname) {

try {

return enrollDataMapper.selectByRealname(realname);

} catch (Exception e) {

return null;

}

}


public List<EnrollData> selectByOnlineId(String online_id) {

try {

return enrollDataMapper.selectByOnlineId(online_id);

} catch (Exception e) {

return null;

}

}


public EnrollData selectById(int enroll_id) {

try {

return enrollDataMapper.selectById(enroll_id);

} catch (Exception e) {

return null;

}

}


public boolean insert(EnrollData ed) {

try {

int result = enrollDataMapper.insert(ed);

if (result > 0)

return true;

else 

return false;

} catch (Exception e) {

return false;

}

}


public boolean update(EnrollData ed) {

try {

int result = enrollDataMapper.update(ed);

if (result > 0)

return true;

else 

return false;

} catch (Exception e) {

return false;

}

}


public boolean delete(EnrollData ed) {

try {

int result = enrollDataMapper.delete(ed);

if (result > 0)

return true;

else 

return false;

} catch (Exception e) {

return false;

}

}

}


9: 使用log4j 写log

log在DAOImpl里面用,用在try catch的catch里面,如果发生一个error就要记录下来。

使用的是log4j 不是log4j2

在DAOImpl里面加个private 的 class variable。log4j已经在之前加入到pom的dependencies里面。


private static Logger log = Logger.getLogger(EnrollDataDAOImpl.class);


使用的时候如下

public boolean delete(EnrollData ed) {

try {

int result = enrollDataMapper.delete(ed);

if (result > 0)

return true;

else 

return false;

} catch (Exception e) {

log.error("EnrollDataDAOImpl delete error");

log.error(e.getMessage());

return false;

}

}


使用之前要配置log4j的配置文件。我选择xml格式的配置文件。

<?xml version="1.0" encoding="UTF-8" ?>

<!DOCTYPE log4j:configuration SYSTEM "log4j.dtd">

<log4j:configuration debug="true"

  xmlns:log4j='http://jakarta.apache.org/log4j/'>


    <appender name="console" class="org.apache.log4j.ConsoleAppender">

        <layout class="org.apache.log4j.PatternLayout">

        <param name="ConversionPattern"

            value="%d{yyyy-MM-dd HH:mm:ss} %-5p %c{1}:%L - %m%n" />

        </layout>

    </appender>


    <appender name="file" class="org.apache.log4j.RollingFileAppender">

        <param name="append" value="false" />

        <param name="maxFileSize" value="10MB" />

        <param name="maxBackupIndex" value="10" />

        <param name="file" value="./logs.log" /> <!-- 可以用绝对或相对路径 -->

        <layout class="org.apache.log4j.PatternLayout">

        <param name="ConversionPattern"

            value="%d{yyyy-MM-dd HH:mm:ss} %-5p %c{1}:%L - %m%n" />

        </layout>

    </appender>


    <root>

        <level value="DEBUG" />

        <appender-ref ref="console" />

        <appender-ref ref="file" />

    </root>


</log4j:configuration>

使用这个配置文件,log4j把log写到屏幕,以及log文件保存在。

10: 写test

test基本上要测试每种可能,我的test大概如下测试了DAO的7个methods。

使用的junit4.12

@Test

public void selectByNameTest(){

List<EnrollData> ed = dao.selectByRealName("王三麻子");

Assert.assertEquals(2, ed.size());

ed = dao.selectByRealName("赵四小姐");

Assert.assertEquals(1, ed.size());

ed = dao.selectByRealName("test");

Assert.assertEquals(0, ed.size());


明日计划完成

11: 打包jar文件。

12: Deploy 到网上。


问题:

目前主要问题是使用maven不会。比如说如何打包包涵dependencies,如何通过maven deploy到tomcat。今天看了好久,maven各种plugin,搞不清楚之间关系,看网上教程,有的用这个,有的用那个。。不知道用哪个好。。。

还有就是这个任务提交的时候是否需要把所有代码都放到github。


返回列表 返回列表
评论

    分享到