发表于: 2017-05-22 14:32:38
2 1254
今日完成(这是昨天和今天两天做的,昨天做的太晚还没解决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 连接用的。如下:
<!-- 这个是mysql 的 jdbc 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。
评论