82.【LibraryManger】(一)

本文涉及的产品
云数据库 RDS MySQL,集群系列 2核4GB
推荐场景:
搭建个人博客
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
云数据库 RDS PostgreSQL,集群系列 2核4GB
简介: 82.【LibraryManger】

(一)、搭建环境

https://www.bootcss.com/

<!-- 最新版本的 Bootstrap 核心 CSS 文件 -->
    <link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/bootstrap/3.4.1/css/bootstrap.min.css" integrity="sha384-HSMxcRTRxnN+Bdg0JdbxYKrThecOKuH5zCYotlSAcp1+c8xmyTe9GYg1l9a69psu" crossorigin="anonymous">
    <!-- 可选的 Bootstrap 主题文件(一般不用引入) -->
    <link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/bootstrap/3.4.1/css/bootstrap-theme.min.css" integrity="sha384-6pzBo3FDv/PJ8r2KRkGHifhEocL+1X2rVCTTkUfGk7/0pbek5mMa1upzvWbrUbOZ" crossorigin="anonymous">
    <!-- 最新的 Bootstrap 核心 JavaScript 文件 -->
    <script src="https://stackpath.bootstrapcdn.com/bootstrap/3.4.1/js/bootstrap.min.js" integrity="sha384-aJ21OjlMXNL5UyIl/XNwTMqvzeRMZH2w8c5cRVpzpU8Y5bApTppSuUkhZXN0VxHd" crossorigin="anonymous"></script>

https://www.layoutit.com/build?

https://www.bootcss.com/p/layoutit/

1.数据库语句

CREATE DATABASE `ssmbuild`;
USE `ssmbuild`;
DROP TABLE IF EXISTS `books`;
CREATE TABLE `books` (
  `bookID` INT(10) NOT NULL AUTO_INCREMENT COMMENT '书id',
  `bookName` VARCHAR(100) NOT NULL COMMENT '书名',
  `bookCounts` INT(11) NOT NULL COMMENT '数量',
  `detail` VARCHAR(200) NOT NULL COMMENT '描述',
  KEY `bookID` (`bookID`)
) ENGINE=INNODB DEFAULT CHARSET=utf8;
INSERT  INTO `books`(`bookID`,`bookName`,`bookCounts`,`detail`)VALUES 
(1,'Java',1,'从入门到放弃'),
(2,'MySQL',10,'从删库到跑路'),
(3,'Linux',5,'从进门到进牢');

2.导入需要的依赖

在这里插入代码片    <dependencies>
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>4.12</version>
            <scope>test</scope>
        </dependency>
        <dependency>
            <groupId>org.mybatis</groupId>
            <artifactId>mybatis</artifactId>
            <version>3.5.2</version>
        </dependency>
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>5.1.6</version>
        </dependency>
        <!-- https://mvnrepository.com/artifact/com.mchange/c3p0 -->
        <dependency>
            <groupId>com.mchange</groupId>
            <artifactId>c3p0</artifactId>
            <version>0.9.5.2</version>
        </dependency>
        <!--        Spring链接数据库需要用到spring-jdbc-->
        <!-- https://mvnrepository.com/artifact/org.springframework/spring-jdbc -->
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-jdbc</artifactId>
            <version>5.2.0.RELEASE</version>
        </dependency>
        <!--   导入mybatis-spring依赖-->
        <!-- https://mvnrepository.com/artifact/org.mybatis/mybatis-spring -->
        <dependency>
            <groupId>org.mybatis</groupId>
            <artifactId>mybatis-spring</artifactId>
            <version>2.0.2</version>
        </dependency>
        <!-- https://mvnrepository.com/artifact/org.springframework/spring-webmvc -->
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-webmvc</artifactId>
            <version>5.2.0.RELEASE</version>
        </dependency>
        <!-- https://mvnrepository.com/artifact/org.projectlombok/lombok -->
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <optional>true</optional>
            <version>1.18.20</version>
            <scope>provided</scope>
        </dependency>
        <dependency>
            <groupId>javax.servlet</groupId>
            <artifactId>servlet-api</artifactId>
            <version>2.5</version>
        </dependency>
        <dependency>
            <groupId>javax.servlet.jsp</groupId>
            <artifactId>javax.servlet.jsp-api</artifactId>
            <version>2.2.1</version>
        </dependency>
        <dependency>
            <groupId>javax.servlet.jsp.jstl</groupId>
            <artifactId>jstl-api</artifactId>
            <version>1.2</version>
        </dependency>
        <dependency>
            <groupId>taglibs</groupId>
            <artifactId>standard</artifactId>
            <version>1.1.2</version>
        </dependency>
    </dependencies>
    <build>
        <resources>
            <resource>
                <directory>src/main/resources</directory>
                <includes>
                    <include>**/*.properties</include>
                    <include>**/*.xml</include>
                </includes>
                <filtering>false</filtering>
            </resource>
            <resource>
                <directory>src/main/java</directory>
                <includes>
                    <include>**/*.properties</include>
                    <include>**/*.xml</include>
                </includes>
                <filtering>false</filtering>
            </resource>
        </resources>
    </build>

(二)、配置文件

3.创建MyBatis的xml文件 mybais-config.xml

在MyBatis的核心配置文件中,我们主要进行的操作就是:添加实体类的别名,以及mappers的映射扫描(扫向dao层),并创建dao层的mapper.xml;

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configuration
        PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
        "https://mybatis.org/dtd/mybatis-3-config.dtd">
<!--configuration核心配置文件-->
<configuration>
    <mappers>
        <package name="com.Jsxs"/>
    </mappers>
</configuration>

4.创建dao层接口以及dao层的 mapper.xml

在dao层设置dao层同名的xxxmapper.xml文件,在mapper.xml文件里面并设置工作空间namespace指向dao的接口类,在里面进行SQL语句的操作

BookMapper.java

package com.Jsxs.dao;
import com.Jsxs.pojo.Books;
import org.apache.ibatis.annotations.Param;
import java.util.List;
public interface BookMapper {
//    增加业务
    int addBook(Books book);
//    删除
    int deleteBook(@Param("bookID") int id);
//    更新一本书
    int updateBook(Books book);
//    查询一本书
    Books selectBookById(@Param("bookID") int id);
//    查询全部书
    List<Books> selectBook();
}

BookMapper.xml

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
        PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
        "https://mybatis.org/dtd/mybatis-3-mapper.dtd">
<!--configuration核心配置文件-->
<mapper namespace="com.Jsxs.dao.BookMapper">
<!-- 增加-->
    <insert id="addBook" parameterType="com.Jsxs.pojo.Books">
        insert into books values(#{bookID},#{bookName},#{bookCounts},#{detail})
    </insert>
    <delete id="deleteBook" parameterType="int">
        delete from books where bookID=#{bookID}
    </delete>
    <update id="updateBook" parameterType="com.Jsxs.pojo.Books">
        update books set
        bookName=#{bookName},bookCounts=#{bookCounts},detail=#{detail}
        where
        bookID=#{bookID}
    </update>
    <select id="selectBookById" parameterType="int" resultType="com.Jsxs.pojo.Books">
        select *from books where bookID=#{bookID}
    </select>
    <select id="selectBook" resultType="com.Jsxs.pojo.Books">
        select *from books
    </select>
</mapper>

5.创建数据库的资源 database.properties

这里一定要在属性名的前面加上 jdbc.xxx;因为我们在用spring配置factory的时候,驱动要求的就是这样。

jdbc.driver=com.mysql.jdbc.Driver
jdbc.url=jdbc:mysql://localhost:3306/ssmbuild?useSSL=false&amp;useUnicode=true&amp;charEncoding=UTF8"
jdbc.username=root
jdbc.password=121788

6.创建spring的配置文件 spring-dao.xml【】

<!-- https://mvnrepository.com/artifact/com.mchange/c3p0 -->
        <dependency>
            <groupId>com.mchange</groupId>
            <artifactId>c3p0</artifactId>
            <version>0.9.5.2</version>
        </dependency>

这里我们主要负责四份工作: ①关联数据库配置文件(database.properties);②创建数据库连接池(主要工作就是链接驱动、用户名、URL、密码以及一些其他的私有属性);③创建SqlSessionFactory工厂主要工作就是(映射数据源databaseSource,以及绑定MyBatis的核心配置文件Mybatis.xml);④配置dao接口扫描包,然后创建各自接口的动态代理类(dao层实现类)。这样,Service就可以注入dao的实例了。

1.MyBatis的一大亮点就是可以不用dao层的实现类,而我们知道在开发中service 
 层需要调用dao层,如果没有dao的实现类,Spring如何为Service注入dao的实例呢?
 2.在我们以前的操作中,我们创建完sqlSessionFactory之后,我们需要借助
 sqlSessionFactory来生成sqlSession.然后创建Service接口的bean,如果我们
 借助MapperScannerConfigurer 这段配置会扫描xxx包下的所有接口,然后创建
 各自接口的动态代理类。这样,Service就可以注入dao的实例了。
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:context="http://www.springframework.org/schema/context"
       xsi:schemaLocation="
        http://www.springframework.org/schema/beans
        http://www.springframework.org/schema/beans/spring-beans.xsd
                http://www.springframework.org/schema/context
        http://www.springframework.org/schema/context/spring-context.xsd
">
<!--  1.关联数据库配置文件-->
    <context:property-placeholder location="classpath:database.properties"/>
<!--  2.数据库连接池
        dbcp :半自动化操作,不能自动链接
        c3p0 :自动化操作(自动化的加载配置文件,并且可以自动设置到对象中)
        这里用c3p0
  -->
    <bean class="com.mchange.v2.c3p0.ComboPooledDataSource" id="dataSource">
       <property name="driverClass" value="${jdbc.driver}"/>
        <property name="password" value="${jdbc.password}"/>
        <property name="user" value="${jdbc.username}"/>
        <property name="jdbcUrl" value="${jdbc.url}"/>
<!--    c3p0连接池的私有属性    -->
        <property name="maxPoolSize" value="30"/>
        <property name="minPoolSize" value="10"/>
<!--     关闭链接后不自动commit   -->
        <property name="autoCommitOnClose" value="false"/>
<!--     获取链接超时时间   -->
        <property name="checkoutTimeout" value="10000"/>
<!--        获取链接失败尝试次数-->
        <property name="acquireRetryAttempts" value="2"/>
    </bean>
<!--  3. sqlSessionFactory  -->
    <bean class="org.mybatis.spring.SqlSessionFactoryBean" id="sqlSessionFactory">
        <property name="dataSource" ref="dataSource"/>
<!--        绑定MyBatis的配置文件-->
        <property name="configLocation" value="classpath:mybatis-config.xml"/>
    </bean>
<!-- 4.   配置dao接口扫描包,动态实现了Dao接口可以注入到Spring容器中-->
    <bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
<!--      注入sqlSessionFactory  -->
        <property name="sqlSessionFactoryBeanName" value="sqlSessionFactory"/>
<!--       要扫描的dao包 -->
        <property name="basePackage" value="com.Jsxs.dao"/>
    </bean>
</beans>

7.创建service层的接口以及servcie的实现类

在这里我们主要创建XXXservice的接口(基于dao层的),然后我们并创建XXXServiceImpl的实现类。②切记在XXXServiceImpl的实现类中我们要以dao层的接口作为一个私有属性,目的是我们service层要实现dao层。①为什么属性我们要设置dao层的接口而不是dao层的具体实现类呢?因为接口的范围大与实现类或则说接口只能有一个然而实现类确是有很多,所以我们动态代理必须要用接口而不是实现类。③我们要对属性创建有参无参和set方法,目的是我们要使用DI注入。④在service创建@service的注解实现动态创建bean

BookService.java

package com.Jsxs.service;
import com.Jsxs.pojo.Books;
import org.apache.ibatis.annotations.Param;
import java.util.List;
public interface BookService {
    //    增加业务
    int addBook(Books book);
    //    删除
    int deleteBook(int id);
    //    更新一本书
    int updateBook(Books book);
    //    查询一本书
    Books selectBookById(int id);
    //    查询全部书
    List<Books> selectBook();
}

BookServiceImpl.java

package com.Jsxs.service;
import com.Jsxs.dao.BookMapper;
import com.Jsxs.pojo.Books;
import org.springframework.stereotype.Service;
import java.util.List;
@Service
public class BookServiceImpl implements BookService{
    private BookMapper bookMapper;
    public BookServiceImpl(BookMapper bookMapper) {
        this.bookMapper = bookMapper;
    }
    public BookServiceImpl() {
    }
    public void setBookMapper(BookMapper bookMapper) {
        this.bookMapper = bookMapper;
    }
    @Override
    public int addBook(Books book) {
//        这个语句就是业务层调用
        return bookMapper.addBook(book);
    }
    @Override
    public int deleteBook(int id) {
        return bookMapper.deleteBook(id);
    }
    @Override
    public int updateBook(Books book) {
        return bookMapper.updateBook(book);
    }
    @Override
    public Books selectBookById(int id) {
        return bookMapper.selectBookById(id);
    }
    @Override
    public List<Books> selectBook() {
        return bookMapper.selectBook();
    }
}


相关实践学习
如何在云端创建MySQL数据库
开始实验后,系统会自动创建一台自建MySQL的 源数据库 ECS 实例和一台 目标数据库 RDS。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助 &nbsp; &nbsp; 相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
相关文章
|
3天前
|
SQL 人工智能 安全
【灵码助力安全1】——利用通义灵码辅助快速代码审计的最佳实践
本文介绍了作者在数据安全比赛中遇到的一个开源框架的代码审计过程。作者使用了多种工具,特别是“通义灵码”,帮助发现了多个高危漏洞,包括路径遍历、文件上传、目录删除、SQL注入和XSS漏洞。文章详细描述了如何利用这些工具进行漏洞定位和验证,并分享了使用“通义灵码”的心得和体验。最后,作者总结了AI在代码审计中的优势和不足,并展望了未来的发展方向。
|
11天前
|
编解码 Java 程序员
写代码还有专业的编程显示器?
写代码已经十个年头了, 一直都是习惯直接用一台Mac电脑写代码 偶尔接一个显示器, 但是可能因为公司配的显示器不怎么样, 还要接转接头 搞得桌面杂乱无章,分辨率也低,感觉屏幕还是Mac自带的看着舒服
|
18天前
|
存储 人工智能 缓存
AI助理直击要害,从繁复中提炼精华——使用CDN加速访问OSS存储的图片
本案例介绍如何利用AI助理快速实现OSS存储的图片接入CDN,以加速图片访问。通过AI助理提炼关键操作步骤,避免在复杂文档中寻找解决方案。主要步骤包括开通CDN、添加加速域名、配置CNAME等。实测显示,接入CDN后图片加载时间显著缩短,验证了加速效果。此方法大幅提高了操作效率,降低了学习成本。
2765 8
|
13天前
|
存储 缓存 关系型数据库
MySQL事务日志-Redo Log工作原理分析
事务的隔离性和原子性分别通过锁和事务日志实现,而持久性则依赖于事务日志中的`Redo Log`。在MySQL中,`Redo Log`确保已提交事务的数据能持久保存,即使系统崩溃也能通过重做日志恢复数据。其工作原理是记录数据在内存中的更改,待事务提交时写入磁盘。此外,`Redo Log`采用简单的物理日志格式和高效的顺序IO,确保快速提交。通过不同的落盘策略,可在性能和安全性之间做出权衡。
1576 12
|
5天前
|
人工智能 关系型数据库 Serverless
1024,致开发者们——希望和你一起用技术人独有的方式,庆祝你的主场
阿里云开发者社区推出“1024·云上见”程序员节专题活动,包括云上实操、开发者测评和征文三个分会场,提供14个实操活动、3个解决方案、3 个产品方案的测评及征文比赛,旨在帮助开发者提升技能、分享经验,共筑技术梦想。
711 94
|
1月前
|
弹性计算 人工智能 架构师
阿里云携手Altair共拓云上工业仿真新机遇
2024年9月12日,「2024 Altair 技术大会杭州站」成功召开,阿里云弹性计算产品运营与生态负责人何川,与Altair中国技术总监赵阳在会上联合发布了最新的“云上CAE一体机”。
阿里云携手Altair共拓云上工业仿真新机遇
|
18天前
|
人工智能 Serverless API
AI助理精准匹配,为您推荐方案——如何快速在网站上增加一个AI助手
通过向AI助理提问的方式,生成一个技术方案:在网站上增加一个AI助手,提供7*24的全天候服务,即时回答用户的问题和解决他们可能遇到的问题,无需等待人工客服上班,显著提升用户体验。
1467 9
|
6天前
|
SQL 存储 人工智能
【产品升级】Dataphin V4.3重大升级:AI“弄潮儿”,数据资产智能化
DataAgent如何助理业务和研发成为业务参谋?如何快速低成本的创建行业数据分类标准?如何管控数据源表的访问权限?如何满足企业安全审计需求?
355 0
【产品升级】Dataphin V4.3重大升级:AI“弄潮儿”,数据资产智能化
|
2天前
|
人工智能 自然语言处理 程序员
提交通义灵码创新实践文章,重磅好礼只等你来!
通义灵码创新实践征集赛正式开启,发布征文有机会获得重磅好礼+流量福利,快来参加吧!
196 7
|
16天前
|
人工智能 Rust Java
10月更文挑战赛火热启动,坚持热爱坚持创作!
开发者社区10月更文挑战,寻找热爱技术内容创作的你,欢迎来创作!
877 29