如何用mybatis简单实现图书管理

mybatis
Mybatis是一个数据持久层框架(dao层),数据持久化,将数据从内存中存储到硬盘中。

1.功能实现

展示图书,通过书名模糊搜索,查询相关书列表
买书功能,买书信息插入购买记录表,total_price(总价)=price(书籍价格)*buy_num(购买数量),图书表中库存对应减少
借书功能,借出信息插入借出表,borrow_date(借出时间)插入为现在的时间,相应图书库存减少1
还书功能,还书信息插入归还表,borrow_date为借出时间,back_date插入为现在的时间,delay_money(滞纳金)=((back_date-borrow_date)default_date(此类书默认借出期限))*delay_per_day(超期每日应缴滞纳金)

2.建表

例表,整理表与表之间的关系。

2.1建表:

CREATE DATABASE IF NOT EXISTS Book ;
USE Book;

#图书表:
CREATE TABLE `Book` (
  `book_id` INT(11) NOT NULL AUTO_INCREMENT,
  `book_name` VARCHAR(20) NOT NULL,
  `price` INT(5) NOT NULL,
  `store` INT(100) NOT NULL,
  `des` VARCHAR(50) NOT NULL,
  `book_type` VARCHAR(50) NOT NULL,
  PRIMARY KEY (`book_id`)
) ENGINE=INNODB DEFAULT CHARSET=utf8

#借出表:
CREATE TABLE `Borrow` (
  `book_id` INT(180) NOT NULL AUTO_INCREMENT,
  `borrow_id` INT(180) NOT NULL,
  `borrow_date` DATE DEFAULT NULL,
  `delay_money` INT(180) NOT NULL,
  PRIMARY KEY (`book_id`),
  CONSTRAINT `Borrow_ibfk_1` FOREIGN KEY (`book_id`) REFERENCES `Book` (`book_id`)
) ENGINE=INNODB DEFAULT CHARSET=utf8

#归还表:
CREATE TABLE `Back` (
  `book_id` INT(180) NOT NULL AUTO_INCREMENT,
  `borrow_id` INT(180) NOT NULL,
  `back_date` DATE DEFAULT NULL,
  `delay_money` INT(180) DEFAULT NULL,
  PRIMARY KEY (`book_id`),
  CONSTRAINT `Back_ibfk_1` FOREIGN KEY (`book_id`) REFERENCES `Book` (`book_id`)
) ENGINE=INNODB DEFAULT CHARSET=utf8

#购买记录表:
CREATE TABLE `Buy_record` (
  `book_id` INT(180) NOT NULL AUTO_INCREMENT,
  `buy_id` INT(180) NOT NULL,
  `buy_date` DATE DEFAULT NULL,
  `buy_num` INT(100) DEFAULT NULL,
  `total_price` INT(255) DEFAULT NULL,
  PRIMARY KEY (`book_id`),
  CONSTRAINT `Buy_record_ibfk_1` FOREIGN KEY (`book_id`) REFERENCES `Book` (`book_id`)
) ENGINE=INNODB DEFAULT CHARSET=utf8

#用户表:
CREATE TABLE `User` (
  `user_id` INT(180) NOT NULL AUTO_INCREMENT,
  `user_name` VARCHAR(50) DEFAULT NULL,
  `grade` INT(255) DEFAULT NULL,
  `phone` INT(11) DEFAULT NULL,
  `user_type` INT(10) DEFAULT NULL,
  PRIMARY KEY (`user_id`)
) ENGINE=INNODB DEFAULT CHARSET=utf8

#图书类型表:
CREATE TABLE `User` (
  `user_id` INT(180) NOT NULL AUTO_INCREMENT,
  `user_name` VARCHAR(50) DEFAULT NULL,
  `grade` INT(255) DEFAULT NULL,
  `phone` INT(11) DEFAULT NULL,
  `user_type` INT(10) DEFAULT NULL,
  PRIMARY KEY (`user_id`)
) ENGINE=INNODB DEFAULT CHARSET=utf8

(表数据自己随便填一填)

3.数据库的连接

3.1配置文件(mybatis-cfg.xml、MapperConfig)

mybatis-cfg.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">
<!--是mybatis的标准根目录-->
<configuration>
    <properties>
    <!--连接数据的驱动,url,用户名,用户密码字段-->
        <property name="driver" value="com.mysql.jdbc.Driver"/>
        <property name="url" value="jdbc:mysql://192.168.56.123/Book"/>
        <property name="user" value="kb07"/>
        <property name="pwd" value="ok"/>
    </properties>
     <!--jdbc连接数据库环境配置,调用字段-->
    <environments default="dev">
        <environment id="dev">
            <transactionManager type="JDBC"></transactionManager>
            <dataSource type="POOLED">
                <property name="driver" value="${driver}"/>
                <property name="url" value="${url}"/>
                <property name="username" value="${user}"/>
                <property name="password" value="${pwd}"/>
            </dataSource>
        </environment>
    </environments>
      <!--mapper代理-->
    <mappers>
        <mapper resource="Dao/Impl/Book/BookDao.xml"></mapper>
        <mapper resource="Dao/Impl/User/UserDao.xml"></mapper>
    </mappers>
</configuration>

MapperConfig:

public class MapperConfig {
    private static SqlSessionFactory factory;
    static {
        SqlSessionFactoryBuilder builder=new SqlSessionFactoryBuilder();
        try {
            InputStream is= Resources.getResourceAsStream("mybatis-cfg.xml");
            factory=builder.build(is);
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
    public static SqlSession getSession(){
        //在非事务的情况下,自动提交开启
        return factory.openSession(true);
    }
    public static void closeSession(SqlSession session){
        if (session!=null){
            session.close();
        }
    }

    private MapperConfig() {
    }
}

3.2实体类编辑
entity目录下创建book,borrow,buy,user,type实例
添加getter和setter方法
添加toString()方法
(这里就不做赘述了。)

4.功能测试

public class BookDaoTest {

    //获取书列表
    @Test
    public void getBookByName() {
        SqlSession session= MapperConfig.getSession();
        List<TbBook> books=session.getMapper(BookDao.class).getBookByName("第");
        System.out.println(books);
        session.close();
    }

    //借书,还书
    /*
    增加借书表一条数据,库存对应减少
    book_id, borrow_date, back_date, delay_money
    id直接获取 第二本书
    borrow_date默认现在时间前十天
    back_date为现在时间
    delay_money  1.通过书本信息,获取书本类型,获得归还期限
                 2.((back_date-borrow_date)-default_date)*delay_per_day
    * */
    @Test
    public void borrow(){
        SqlSession session=MapperConfig.getSession();
        List<TbBook> books=session.getMapper(BookDao.class).getBookByName("第二");
        TbBook book1=books.get(0);
        int id=book1.getBook_Id();
        TbBook book=session.getMapper(BookDao.class).getTypeById(id);
        int store=book.getStore();
        int day=book.getDefault_Date();
        double perday=book.getDelay_Money_Per_Day();
        java.sql.Date borrow_date = new java.sql.Date(System.currentTimeMillis()-10*24*60*60*1000);
        long currentTimeMillis = System.currentTimeMillis();
        Date back_date = new Date(currentTimeMillis);
        double delay_money=(10-day)*perday;
        Map map=new HashMap();//改变库存的map
        map.put("b",id);
        map.put("a",store);
        int tmp=session.getMapper(BookDao.class).updateStoreById(map);
        System.out.println(tmp>0?"改变成功":"改变失败");
        Map map2=new HashMap();//增加购买记录的map
        //book_id, borrow_date, back_date, delay_money
        //a            b             c              d
        map2.put("a",id);
        map2.put("b",borrow_date);
        map2.put("c",back_date);
        map2.put("d",delay_money);
        int tem=session.getMapper(BookDao.class).addBorrowRecord(map2);
        System.out.println(tem>0?"购买成功":"购买失败");
    }

    //用户登录
    @Test
    public void login(){
        SqlSession session= MapperConfig.getSession();
        List<TbUser> userList=session.getMapper(UserDao.class).getUserByGrade(1);
        TbUser user=userList.get(0);
        if (user.getUser_Name().equals("李四")){
            System.out.println("登录成功");
        }else {
            System.out.println("登录失败");
        }
        session.close();
    }
    //买书
    //购买第一本书,名字搜索获得第一本书库存,单价,
    // 图书表库存减去购买数量,测试购买两本
    //购买表获取总价
    @Test
    public void buyBook(){
        SqlSession session= MapperConfig.getSession();
        List<TbBook> books=session.getMapper(BookDao.class).getBookByName("第一");
        TbBook book=books.get(0);
        //book_id, buy_date, buy_num, total_price
        // a    b   c   d
        int store=book.getStore();
        double price=book.getPrice();
        int id=book.getBook_Id();
        Map map=new HashMap();//购买的map
        price=price*=2;
        store-=2;
        long currentTimeMillis = System.currentTimeMillis();
        Date date = new Date(currentTimeMillis);
        map.put("a",id);
        map.put("b",date);
        map.put("c",2);
        map.put("d",price);
        Map map2=new HashMap();//改变库存的map
        map2.put("b",id);
        map2.put("a",store);
        int tmp=session.getMapper(BookDao.class).updateStoreById(map2);
        System.out.println(tmp>0?"改变成功":"改变失败");
        int tem=session.getMapper(BookDao.class).addBuyRecord(map);
        System.out.println(tem>0?"购买成功":"购买失败");
        session.close();
    }
}


版权声明:本文为Jimmy_izz原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。