基于Day6--零钱通(记账)小项目测试项目本次主要的修改是数据持久化,只修改了数据访问层的代码,和表现层的调用,采用的是mybaitis的框架技术,具体代码如下:
数据库查询使用的是第三种接口扫描的方式:
数据访问层代码
接口mapper
package Day11.ChangeCard.Dao;
import Day11.ChangeCard.Model.money;
import java.util.List;
public interface cardMapper {
int insert(money money);
List<money> selectMoney();
Double selectBalance();
}
DAO类用于获取sqlSession和mapper(存放接口的类)资源
package Day11.ChangeCard.Dao;
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.apache.log4j.PropertyConfigurator;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.util.Properties;
public class DAO {
public static SqlSession session;
public static cardMapper mapper;
static {
try {
session = getSession();
mapper = session.getMapper(cardMapper.class);
} catch (IOException e) {
throw new RuntimeException(e);
}
}
public static SqlSession getSession() throws IOException {
InputStream in = Resources.getResourceAsStream("mybatis/config/ChangeCard.xml");
SqlSessionFactory fac = new SqlSessionFactoryBuilder().build(in);
SqlSession sqlSession = fac.openSession();
return sqlSession;
}
public static void logOut() throws IOException {
Properties properties = new Properties();
FileInputStream in = new FileInputStream("src/resources/log4j.properties");
properties.load(in);
PropertyConfigurator.configure(properties);
}
}
模型层
package Day11.ChangeCard.Model;
public class money {
private Integer id;
private String typein;
private Double amount;
private String timein;
private Double balance;
//setter、getter方法
}
业务逻辑层
存放的是业务具体逻辑的实现方法,便于在表现层调用。
package Day11.ChangeCard.Service;
import Day11.ChangeCard.Dao.DAO;
import Day11.ChangeCard.Dao.cardMapper;
import Day11.ChangeCard.Model.money;
import org.apache.ibatis.session.SqlSession;
import org.junit.Test;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.List;
import java.util.Scanner;
public class method {
DAO d = new DAO();
public SqlSession session = d.session;
public cardMapper mapper = d.mapper;
public void select() {
System.out.println("-----------------零钱通明细-----------------");
List<money> rs = mapper.selectMoney();
for (int j = 0; j < rs.size(); j++) {
//支出收入金额
String amount = "";
if (rs.get(j).getAmount() >= 0) {
amount = "+" + String.valueOf(rs.get(j).getAmount());
} else amount = String.valueOf(rs.get(j).getAmount());
//日期
String time = rs.get(j).getTimein();
System.out.println(rs.get(j).getTypein() + "\t" + amount + "\t" + time + "\t" + "余额:" + rs.get(j).getBalance());
}
}
@Test
public void insert() {
Scanner scanner = new Scanner(System.in);
System.out.print("请输入收益来源:");
String type = scanner.next();
System.out.print("请输入收入金额:");
Double mount = scanner.nextDouble();
Date data = new Date();
SimpleDateFormat now = new SimpleDateFormat("yyyy-MM-dd HH:mm");
String time = now.format(data);
double balance = mapper.selectBalance() + mount;
money money = new money(type, mount, time, balance);
int insert = mapper.insert(money);
session.commit();
System.out.println(insert);
}
public void give() {
Scanner scanner = new Scanner(System.in);
Date data = new Date();
SimpleDateFormat now = new SimpleDateFormat("yyyy-MM-dd HH:mm");
String time = now.format(data);
Double balance = d.mapper.selectBalance();
System.out.println("余额:" + balance);
System.out.print("请输入消费项目:");
String type = scanner.next();
System.out.print("请输入消费金额:");
Double mount = scanner.nextDouble();
if (balance - mount >= 0) {
money money = new money(type, -mount, time, balance - mount);
d.mapper.insert(money);
session.commit();
} else System.out.println("余额不足");
}
}
表现层
package Day11.ChangeCard.UserUi;
import Day11.ChangeCard.Service.method;
import java.util.InputMismatchException;
import java.util.Scanner;
public class Ui {
public static void main(String[] args) throws Exception {
method im = new method();
try {
Scanner scanner = new Scanner(System.in);
Boolean flag = true;
while (flag) {
System.out.println("-----------------零钱通菜单-----------------");
System.out.println(" 1 零钱通明细");
System.out.println(" 2 收益入账");
System.out.println(" 3 消费");
System.out.println(" 4 退 出");
System.out.print("请选择(1-4):");
int i = scanner.nextInt();
switch (i) {
case 1:im.select();
break;
case 2:im.insert();
break;
case 3:im.give();
break;
case 4:
flag = false;
break;
default:
System.out.println("请正确选择业务!");
break;
}
}
}catch (InputMismatchException e){
System.out.println("类型输入错误");
}
}
}
mybatis配置及其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接口-->
<mapper namespace="Day11.ChangeCard.Dao.cardMapper">
<select id="selectMoney" resultMap="select">
select *
from money
</select>
<resultMap id="select" type="Day11.ChangeCard.Model.money">
<id column="id" property="id"></id>
<result column="typein" property="typein"></result>
<result column="amount" property="amount"></result>
<result column="timein" property="timein"></result>
<result column="balance" property="balance"></result>
</resultMap>
<select id="selectBalance" resultType="Double">
-- select balance from money where id=(select MAX(id) from money)
SELECT balance FROM money ORDER BY id DESC LIMIT 1;
</select>
<update id="insert">
insert into money(typein,amount,timein,balance) values (#{typein},#{amount},#{timein},#{balance})
</update>
</mapper>
下面的配置只需要连好数据库然后添加mapper映射文件就好了。
<?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>-->
<!-- <setting name="logImpl" value="LOG4J"/>-->
<!-- </settings>-->
<!-- 处理日期转换-->
<typeHandlers>
<typeHandler handler="Day10.DateTypeHandler"></typeHandler>
</typeHandlers>
<environments default="development">
<environment id="development">
<transactionManager type="JDBC"/>
<dataSource type="POOLED">
<property name="driver" value="com.mysql.cj.jdbc.Driver"/>
<property name="url" value="jdbc:mysql://localhost:3306/mybatis?serverTimezone=UTC"/>
<property name="username" value="root"/>
<property name="password" value="123456"/>
</dataSource>
</environment>
</environments>
<mappers>
<!-- 这里的写的是mapper映射文件-->
<mapper resource="mybatis/mappers/ChangeCard/changecardMapper.xml"/>
</mappers>
</configuration>