使用mybatis连接数据库并查询

图书管理类项目

目的:展示所有图书(条件:图书名 借书人名 -->模糊查询)

(一)数据库表结构分析和建表语句所用到的sql语句

表结构

图书表:bookId bookName price store des bookType
借出表:borrowId  uid bookId borrowDate  
归还表:backId borrowId backDate delayMoney
购买记录表:bookId buyID buyDate buyNum totalPrice
用户表:userId userName grade phone userType
图书类型表:typeId typeName defaultDate delayMoneyPerDay

建表语句

#图书表
CREATE TABLE IF NOT EXISTS books(
 bookId INT(11) PRIMARY KEY AUTO_INCREMENT,
 bookName VARCHAR(10), 
 price DOUBLE(11,2), 
 store INT(11), 
 des VARCHAR(200), 
 bookType VARCHAR(20) 
 ); 
 INSERT INTO books (bookName, price, store, des, bookType) VALUES ( '我从全世界路过', 25, 100, '张嘉佳著', 'a'); 
 INSERT INTO books (bookName, price, store, des, bookType) VALUES ('西游记', 15, 200, '吴承恩著', 'b'); 
 #借出表
 CREATE TABLE borrow( 
	borrowId INT(11)PRIMARY KEY AUTO_INCREMENT,
	bookId INT(11), 
	borrowDate DATE ,
	uid INT(11)
);
#归还表
CREATE TABLE back( 
	backId INT(11)PRIMARY KEY AUTO_INCREMENT,
	borrowId INT(11),
	backDate DATE, 
	delayMoney DOUBLE(11,2) 
); 
#购买记录表
CREATE TABLE `library`.`buyRecord`( 
	buyId INT(11) PRIMARY KEY AUTO_INCREMENT,
	bookid INT(11), 
	buyDate DATE, 
	buyNu INT(11), 
	totalPrice DOUBLE(11,2) 
);

#用户表
CREATE TABLE users(
	userId INT(11) PRIMARY KEY AUTO_INCREMENT, 
	userName VARCHAR(20), 
	grade VARCHAR(20),
	phone VARCHAR(11), 
	userType INT(11),  
); 
INSERT INTO users (userName, grade, phone, userType) VALUES ('admin', 'xx', 'xx', 0); 
INSERT INTO users (userName, grade, phone, userType) VALUES ('小明', '大一', '15155689754', 1); 
#图书类型表
CREATE TABLE booksType( 
	typeId INT(11) PRIMARY KEY AUTO_INCREMENT, 
	typeName VARCHAR(20), 
	defaultDate INT(11), 
	delayMoneyPerDay DOUBLE(11,2), 
); 
INSERT INTO booksType (typeName, defaultDate, delayMoneyPerDay) VALUES ( 'a', 5, 1); 
INSERT INTO booksType (typeName, defaultDate, delayMoneyPerDay) VALUES ( 'b', 3, 0.5); 
#登录sql语句
SELECT *
FROM users u
WHERE u.userName='admin';
#图书名模糊查询语句
 SELECT *
 FROM books b
 WHERE b.bookName LIKE CONCAT('%','我','%');
 #根据借书人名查书名
 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},'%'))
        );

(二)使用mybatis连接数据库,查询

1)导入相关jar包(连接数据库 mybatis junit等)
2)将mysql数据库中的每个表建立对应的实体类(要求字段名和数据库中相同)
例子:

package exam.pojo;

/**
 * @author sunyong
 * @date 2020/06/15
 * @description
 * 图书类
 */
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 + '\'' +
                '}';
    }
    
}

3)编写相关配置文件
日志文件

### 设置###
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 = F://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

数据库配置文件

driver=com.mysql.jdbc.Driver
url=jdbc:mysql://192.168.56.101:3306/library?relaxAutoCommit=true&zeroDateTimeBehavior=convertToNull
username=kb07
password=ok 

编写mybatis的配置文件(编写接口对应的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">
<configuration>
    <properties resource="database.properties">
    </properties>
    <settings>
        <setting name="logImpl" value="LOG4J"/>
    </settings>
    <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="${username}"/>
                <property name="password" value="${password}"/>
            </dataSource>
        </environment>
    </environments>
    <mappers>
        <mapper resource="exam/dao/UserDao.xml"/>
        <mapper resource="exam/dao/BooksDao.xml"/>
    </mappers>
</configuration>

4)新建dao层包,在该包下建一个图书表的dao接口和对应的映射文件–>需要注意的是映射文件中的命名空间为该类的全类名,每个子语句的id为方法名需要一一对应,然后在mybatis文件中引入该映射文件
接口:

package exam.dao;
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>
</mapper>

5)编写一个工具类与数据库之间建立会话

package exam.utils;

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;

/**
 * @author sunyong
 * @date 2020/06/09
 * @description
 */
public class MapperConfig {
    private  static SqlSessionFactory factory ;
    //静态代码块只加载一次
    static {
        SqlSessionFactoryBuilder builder = new SqlSessionFactoryBuilder();
        InputStream is = null;
        try {
             is= Resources.getResourceAsStream("mybatis-config.xml");
            factory=builder.build(is);
        } catch (IOException e) {
            e.printStackTrace();
        }finally {
            try {
                is.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }
    //私有构造
    private MapperConfig(){}
    //得到SqlSession
    public static SqlSession getSession(){
        return factory.openSession(true);
    }
}

6)建立图书表的测试类测试程序

package exam.dao;

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);
    }
}

7)测试结果
通过书名模糊查询
通过借书的人名模糊查询

猜你喜欢

转载自blog.csdn.net/sun_0128/article/details/106770059
今日推荐