图书管理类项目
目的:展示所有图书
(一)数据库表结构分析和建表语句所用到的sql语句
表结构
图书表:bookId,bookName,prices,store,des,bookType
借出表:bookId,borrowId,borrowDate,backDate,delayMoney
归还表:bookId,borrowId,backDate,delayMone
购买记录表:bookId,buyId,buyDate,buyNum,totalPrices
用户表:userId,userName,grade,phone,userType
图书类型表:typeId,typeName,defaultDate,delayMoneyPerDay
mysql语句
创建数据库
CREATE DATABASE IF NOT EXISTS bookStore;
创建图书表并插入数据
#图书表:bookId,bookName,price,store,des,bookType
CREATE TABLE IF NOT EXISTS books(
bookId INT(5) PRIMARY KEY NOT NULL AUTO_INCREMENT,
bookName VARCHAR(20),
prices DOUBLE(10,2),
store INT(5),
des VARCHAR(200),
bookType VARCHAR(20)
)
#图书表插入数据
INSERT INTO books(bookName,prices,store,des,bookType)
VALUES ('西游记',19,8,'讲述师徒四人去西天取经的故事','科幻'),
('三国演义',20,8,'讲述东汉末年三国争锋的故事','历史');
创建借出表并插入数据
#借出表:bookId,borrowId,borrowDate,backDate,delayMoney
CREATE TABLE IF NOT EXISTS borrowBooks(
borrowId INT(5) PRIMARY KEY NOT NULL AUTO_INCREMENT,
bookId INT(5) NOT NULL,
borrowDate DATE,
backDate DATE,
delayMoney DOUBLE(10,2)
)
#借出表插入数据
INSERT INTO borrowBooks(bookId,borrowDate,backDate,delayMoney)
VALUES (2,'2020-6-10','2020-6-15',5);
创建购买数据表并插入数据
#购买记录表:bookId,buyId,buyDate,buyNum,totalPrices
CREATE TABLE IF NOT EXISTS buyBooks(
buyId INT(5) PRIMARY KEY NOT NULL AUTO_INCREMENT,
bookId INT(5) NOT NULL,
buyDate DATE,
buyNum INT(5),
totalPrices DOUBLE(10,2)
)
#购买表插入数据
INSERT INTO buyBooks(bookId,buyDate,buyNum,totalPrices)
VALUES (1,'2020-6-13',1,19);
创建用户数据表并插入数据
#用户表:userId,userName,grade,phone,userType
CREATE TABLE IF NOT EXISTS users(
userId INT(5) PRIMARY KEY NOT NULL AUTO_INCREMENT,
userName VARCHAR(20),
phone VARCHAR(11),
userType VARCHAR(20)
)
#用户表表插入数据
INSERT INTO users(userName,phone,userType)
VALUES ('xiaoming','11111111111','学生'),
('admin','2222222222','管理员');
创建图书类型数据表并插入数据
#图书类型表:typeId,typeName,defaultDate,delayMoneyPerDay
CREATE TABLE IF NOT EXISTS booksType(
typeId INT(5) PRIMARY KEY NOT NULL AUTO_INCREMENT,
typeName VARCHAR(20),
defaultDate VARCHAR(20),
delayMoneyPerDay DOUBLE(10,2)
)
#图书类型表插入数据
INSERT INTO booksType(typeName,defaultDate,delayMoneyPerDay)
VALUES ('科幻','30天',1),
('历史','30天',1);
(二)mybatis连接数据库,查询
1)导入相关jar包
2)将mysql数据库中的每个表建立对应的实体类(要求字段名和数据库中相同)
3)配置Tomcat
例子:
public class Books {
private int bookId;//书编号
private String bookName;//书名
private double price;//售出单价
private int store;//库存量
private String des;//描述
private String bookType;//图书类型
public int getBookId() {
return bookId;
}
public void setBookId(int bookId) {
this.bookId = bookId;
}
public String getBookName() {
return bookName;
}
public void setBookName(String bookName) {
this.bookName = bookName;
}
public double getPrice() {
return price;
}
public void setPrice(double price) {
this.price = price;
}
public int getStore() {
return store;
}
public void setStore(int store) {
this.store = store;
}
public String getDes() {
return des;
}
public void setDes(String des) {
this.des = des;
}
public String getBookType() {
return bookType;
}
public void setBookType(String bookType) {
this.bookType = bookType;
}
//重写tostring方便打印
@Override
public String toString() {
return "Books{" +
"bookId=" + bookId +
", bookName='" + bookName + '\'' +
", price=" + price +
", store=" + store +
", des='" + des + '\'' +
", bookType='" + bookType + '\'' +
'}';
}
}
4)编写相关配置文件(log4j.properties)
日志文件
### 设置###
log4j.rootLogger = debug,stdout,D,E
### 输出信息到控制抬 ###
log4j.appender.stdout = org.apache.log4j.ConsoleAppender
log4j.appender.stdout.Target = System.out
log4j.appender.stdout.layout = org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern = [%-5p] %d{yyyy-MM-dd HH:mm:ss,SSS} method:%l%n%m%n
### 输出DEBUG 级别以上的日志到=E://logs/error.log ###
log4j.appender.D = org.apache.log4j.DailyRollingFileAppender
log4j.appender.D.File = E://logs/log.log
log4j.appender.D.Append = true
log4j.appender.D.Threshold = DEBUG
log4j.appender.D.layout = org.apache.log4j.PatternLayout
log4j.appender.D.layout.ConversionPattern = %-d{yyyy-MM-dd HH:mm:ss} [ %t:%r ] - [ %p ] %m%n
### 输出ERROR 级别以上的日志到=E://logs/error.log ###
log4j.appender.E = org.apache.log4j.DailyRollingFileAppender
log4j.appender.E.File =E://logs/error.log
log4j.appender.E.Append = true
log4j.appender.E.Threshold = ERROR
log4j.appender.E.layout = org.apache.log4j.PatternLayout
log4j.appender.E.layout.ConversionPattern = %-d{yyyy-MM-dd HH:mm:ss} [ %t:%r ] - [ %p ] %m%n
5)编写一个工具类与数据库之间建立会话
package cn.util;
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 java.io.IOException;
import java.io.InputStream;
/**
* @date 2020/6/15 12:06
*/
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() {
}
}
编写mybatis的配置文件和mysql的路径(编写接口对应的xml文件,将该xml文件引入mybatis配置文件的映射中)
<?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 resource="db.properties"/>-->
<properties>
<property name="driver" value="com.mysql.jdbc.Driver"/>
<property name="url" value="jdbc:mysql://192.168.56.101/bookStore"/>
<property name="user" value="kb07-kb07"/>
<property name="pwd" value="root"/>
</properties>
<settings>
<setting name="logImpl" value="LOG4J"/>
</settings>
<!-- 取别名-->
<typeAliases>
<!-- <typeAlias type="cn.kgc.entity.User" alias="user"/>-->
<typeAlias type="cn.pojo.User" alias="user"></typeAlias>
</typeAliases>
<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>
<mappers>
<mapper resource="cn/dao/user/UserDao.xml"></mapper>
</mappers>
</configuration>
6)新建dao层包,在该包下建一个图书表的dao接口和对应的映射文件–>需要注意的是映射文件中的命名空间为该类的全类名,每个子语句的id为方法名需要一一对应,然后在mybatis文件中引入该映射文件
接口:
import exam.pojo.Books;
import org.apache.ibatis.annotations.Param;
import java.util.List;
public interface BooksDao {
List<Books> getBookByName(@Param("name") String name);
List<Books> getBookByBorrowName(@Param("userName") String userName);
}
映射文件:
<?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="exam.dao.BooksDao">
<select id="getBookByName" parameterType="STRING" resultType="exam.pojo.Books">
select *
from books b
where b.bookName like concat('%',#{name},'%');
</select>
<select id="getBookByBorrowName" parameterType="string" resultType="exam.pojo.Books">
select *
from books b
where b.bookId in (
select br.bookId
from borrow br
where br.uid in
(select u.userId
from users u
where u.userName like concat('%',#{userName},'%'))
);
</select>
</mappe>
7)建立图书表的测试类测试程序
import exam.pojo.Books;
import exam.pojo.Users;
import exam.utils.MapperConfig;
import org.apache.ibatis.session.SqlSession;
import org.junit.Test;
import java.util.List;
import static org.junit.Assert.*;
public class BooksDaoTest {
//测试书名模糊查询
@Test
public void test(){
SqlSession session = MapperConfig.getSession();
List<Books> booksList = session.getMapper(BooksDao.class).getBookByName("我");
System.out.println(booksList);
}
//测试借书人名模糊查询
@Test
public void test1(){
SqlSession session = MapperConfig.getSession();
List<Books> booksList = session.getMapper(BooksDao.class).getBookByBorrowName("小");
System.out.println(booksList);
}
}