Maven和MyBatis学习总结

目录

Maven

1.Maven的概念:

2.在具体的使用中意义:

3.与传统项目引入jar包做对比:

传统方式:

在maven项目当中:

4.在创建maven项目后,想要自定义一些maven配置

5.maven项目的结构

6.maven指令的生命周期,其中红色为常用的生命周期

7.当导入的jar包有依赖关系时,会将被依赖的包全部一起导入进来,为了防止版本冲突,我们可以采用以下四种解决办法:

Mybatis

1.Mybatis的概念

2.在具体使用中的意义:

3.与传统项目进行对比:

传统项目:

mybatis的使用:

4.自动映射与手动映射

5.mapper接口中需要传入多个属性

6.Like模糊匹配

7.sql片段

8.动态sql

9.mybatisX插件的使用

10.项目结构总结


Maven

1.Maven的概念:

Maven 是一个项目管理工具 ,可以对 Java 项目进行 一键构建、依赖管理

2.在具体的使用中意义:

由于传统java项目中要想引入其他jar包,需要经过非常多的步骤才可以成功将jar包引入到当前java项目,而我们为了实现代码逻辑,需要频繁引入jar包,因此主要为了简化jar包的引入过程,我们在新建项目时,直接选择maven项目即可。

3.与传统项目引入jar包做对比:

以引入servlet包为例

传统方式:

1).在官网找到对应jar包,并下载下来
2).点击Project Structure

3).将下载好的jar包引入到 Libraries(可以实现跨模块的调用,不同模块都可以使用到的jar包可以直接存放在这里,或者直接全部都存放在这里)

4).将Libraries当中的jar文件引入具体的模块当中

在maven项目当中:

1.创建maven项目

2.在pom.xml文件进行配置即可

3.在中心仓库或私服当中找想要使用的具体jar包

maven中心仓库

将对应gav坐标复制下来粘贴在pom.xml的

复制代码
<dependencies>
复制代码
</dependencies>标签下即可

4.在创建maven项目后,想要自定义一些maven配置

1)找到自己下载的maven安装目录,并打开conf的配置文件夹


2)对settings文件进行修改,其中url放具体地址,这样就可以将服务器改为私服或者中心仓库的镜像

3)除此之外,为了将所有引入的jar包保存下来,就不用每次去中心仓库搜索,我们需要配置jar包存放目录

4)在idea当中进行应用

5.maven项目的结构

6.maven指令的生命周期,其中红色为常用的生命周期


7.当导入的jar包有依赖关系时,会将被依赖的包全部一起导入进来,为了防止版本冲突,我们可以采用以下四种解决办法:

1)

2)和 3)

4)版本锁定

Mybatis

1.Mybatis的概念

它是一个持久化框架,用于对关系型数据库操作,底层封装了 JDBC

2.在具体使用中的意义:

在传统老式项目当中,由于未使用到Mybatis,要想使用mysql需要进行复杂的JDBC操作,然而随着Mybatis的引入我们大大简化了JDBC操作,便可以对数据库进行增删改查。

3.与传统项目进行对比:

传统项目:

以Druid数据库连接线程池为例
1).首先引入Druid的jar包文件
2). 进行基本的配置以及调用
由于需要频繁的获取数据库连接,为了简化,我们单独设置一个工具类,在需要使用时进行调用即可。


此处使用到的静态代码块,原因在于静态代码块尽在编译时运行一次,而我们需要操作的数据库连接始终不变,因此不必频繁建立连接,写在静态代码块中即可。

这一部分封装的是具体给外部调用的方法,此处使用到了接口

复制代码
SelectQuery<T> query

,而接口的实现采用匿名内部类的方式由调用者实现,同时使用到了泛型类,使得内部方法都可以使用到该泛型,由于返回值类型是不确定的,所以该方法的返回值为泛型T,由调用者自行定义。

该executselect方法的主要功能为执行查找操作,首先建立连接,然后将sql语句包装为preparedstatement类,以便使用其中的方法,params传来需要补充的参数,这样做是为了防止sql注入,因为where后如果条件被更改为恒对,则所有信息将被泄露,所以传来的sql语句多为String sql="SELECT * from student where account=?";这样的形式。而...params以剩余参数的方式,接收了所有需要额外填充在?处值。并通过statement.setObject来填充到对应位置,注意:需要填充的位置的下标从1开始,而对应的元素位置为0开始。

执行statement.executeQuery();操作之后我们获取到的是ResultSet 对象,也就是结果集,结果集交给调用该方法者来处理。其中set是最初指向该结果集的第一行数据的指针,相当于依次将每一行数据传给调用者,由调用者来处理

javascript 复制代码
 try(
                DruidPooledConnection conn=dataSource.getConnection();
                PreparedStatement statement = conn.prepareStatement(sql);
        ) {
            for (int i=1;i<=params.length;i++){
                statement.setObject(i,params[i-1]);
            }
            ResultSet set=statement.executeQuery();
            ArrayList<T> datas = new ArrayList<>();
            while (set.next()){
                //获取一行数据,该操作需要交给外界使用该工具的开发人员实现
                T data=query.selectQuery(set);
                datas.add(data);
            }
            return datas;
        } catch (SQLException e) {
            throw new RuntimeException(e);
        }
    }

executeall封装的则是增删改操作

javascript 复制代码
 public  static Integer executeAll(String sql,Object ...parmas){
        try(
                DruidPooledConnection conn=dataSource.getConnection();
                PreparedStatement statement = conn.prepareStatement(sql)
        ) {
           for (int i=1;i<=parmas.length;i++){
               statement.setObject(i,parmas[i-1]);
           }
           Integer i=statement.executeUpdate();
           return i;
            } catch (SQLException ex) {
            throw new RuntimeException(ex);
        }
    }
}

以下是调用的实例,由前端传入的账号,来查询对应数据库中存放的密码

javascript 复制代码
 String sql="SELECT * from student where account=?";
            ArrayList<String> passwordList=DBUtils.excuteSelect(sql,(ResultSet resultset)->{
                String password1= null;
                try {
                    password1 = resultset.getString("password");
                } catch (SQLException e) {
                    throw new RuntimeException(e);
                }
                return password1;
            },account);

接下来根据passwordlist当中存放的password与用户输入的password进行比对,同时如果密码正确检查token,如果没过期,则直接登录,过期了需要重新生成token

javascript 复制代码
 if (!passwordList.isEmpty()){
              if(passwordList.get(0).equals(password)){
                  //查找对应token是否存在
                  String sql1="select * from token where account=?";
                  ArrayList<HashMap<String , Object>> results=DBUtils.excuteSelect(sql1,(ResultSet set)->{
                      HashMap<String, Object> data = new HashMap<>();
                      data.put("token", set.getString("token"));
                      //获取数据库中dateTime类型的数据
                      data.put("time", set.getTimestamp("date"));

                      return data;
                  },account);
                    if(!results.isEmpty()){
                        //有token需要检测是否过期,如果过期需要更新
                         Timestamp oldTime =(Timestamp)results.get(0).get("time");
                        Date newTime = new Date();
                        if(newTime.getTime() - oldTime.getTime() > 60000){

                            //设置有效期1分钟,过期

                            String token = TokenUtil.getToken(10);

                            sql = "update token set token=?, date=? where account=?";

                            Integer num = DBUtils.executeAll(sql, token, newTime, account);

                            if(num > 0){
                                HttpSession session = req.getSession();
                                session.setAttribute("token", token);
                                session.setAttribute("time", newTime);

                                RespUtil.success(200, "success",  resp,token);

                            }else{

                                RespUtil.success(200, "success", resp);

                            }

                        }else{

                            String token = (String) results.get(0).get("token");
                            HttpSession session = req.getSession();
                            session.setAttribute("token", token);
                            session.setAttribute("time", oldTime);
                            RespUtil.success(200, "success",  resp,token);

                        }
                    }else {
                        //没有token需要添加token
                        sql="INSERT INTO token (account,date,token) VALUES (?,?,?)";
                        String token= TokenUtil.getToken(10);
                         Date date = new Date();
                        Integer i = DBUtils.executeAll(sql, account, date, token);
                        HttpSession session = req.getSession();
                        session.setAttribute("token", token);
                        session.setAttribute("time", date);
                        if(i > 0){
                            RespUtil.success(200, "success",  resp,token);
                        }else{
                            RespUtil.success(200, "success", resp);
                        }

                    }
              }
              else {
                  RespUtil.fail(500,"密码错误",resp);
              }

mybatis的使用:

此处并没有结合springboot和spring的使用,而是单独的使用mybatis

mybatis则无需这么麻烦的自己写函数,以下是具体步骤

1)首先创建maven项目

2)引入mybatis的jar包和mysql的jar包

3)创建并开始配置mybatis-config.xml文件(该文件为mybatis总配置文件,后续引入的映射也均需要在该文件当中声明)

3.配置数据源

以下是2,3步后对应的mybatis-config.xml文件中具体内容

javascript 复制代码
<?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="mapUnderscoreToCamelCase" value="true"/>
    </settings>
<!--  给类和包起别名-->
    <typeAliases>
        <typeAlias type="com.mybatis.entity.Pinpai" alias="pinpai"/>
        <package name="com.mybatis.entity"/>
    </typeAliases>
    <plugins>
        <!-- 配置 PageHelper 分页插件 -->
        <plugin interceptor="com.github.pagehelper.PageInterceptor">
            <!-- 参数配置(可选) -->
            <property name="helperDialect" value="mysql"/>  <!-- 指定数据库类型 -->
            <property name="reasonable" value="true"/>      <!-- 分页合理化(页码越界时自动调整) -->
            <property name="supportMethodsArguments" value="true"/> <!-- 支持接口参数传递分页 -->
            <property name="params" value="count=countSql"/> <!-- 优化 COUNT 查询 -->
        </plugin>
    </plugins>
<!--环境:指定要连接的数据库-->
    <environments default="mysql8">
        <environment id="mysql8">
<!--            事务管理器-->
            <transactionManager type="JDBC"/>
<!--            datasource的type有三种取值:POOLED,UNPOOLED,JNDI-->
<!--            mybatis提供数据库链接池技术,type=pooled代表使用数据库链接池-->
            <dataSource type="POOLED">
<!--   数据源:数据库的连接信息,配置好以下四个信息-->
            <!--配置驱动方式-->    <property name="driver" value="com.mysql.cj.jdbc.Driver"/>
                <property name="url" value="jdbc:mysql://localhost:3306/yoyoshop?serverTimezone=GMT%2B8"/>
                <property name="username" value="root"/>
                <property name="password" value="123456"/>
            </dataSource>
        </environment>
        <environment id="mysql9">
            <!--            事务管理器-->
            <transactionManager type="JDBC"/>
            <!--            datasource的type有三种取值:POOLED,UNPOOLED,JNDI-->
            <!--            mybatis提供数据库链接池技术,type=pooled代表使用数据库链接池-->
            <dataSource type="POOLED">
                <!--   数据源:数据库的连接信息,配置好以下四个信息-->
                <!--配置驱动方式-->    <property name="driver" value="com.mysql.cj.jdbc.Driver"/>
                <property name="url" value="jdbc:mysql://localhost:3306/yoyoshop?serverTimezone=GMT%2B8"/>
                <property name="username" value="root"/>
                <property name="password" value="123456"/>
            </dataSource>
        </environment>
    </environments>
    <!--映射器:指定要操作的映射文件-->
    <mappers>
        <mapper resource="mapper/PinpaiMapper.xml"/>
        <mapper resource="mapper/BookMapper.xml"/>
    </mappers>

</configuration>

以上就完成了数据库连接操作

接着是执行具体sql语句:

1.根据数据库表生成对应的实体类文件

2.创建该类所对应的mapper接口,一定要主意好返回值类型和参数名和类型,否则报错不好找

3.创建映射文件
编写接口方法对应的 sql 语句,其中头部内容是固定的,namespace为对应被映射接口的详细地址信息

javascript 复制代码
<?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="com.mybatis.mapper.PinpaiMapper">
</mapper>

插入操作为insert,查询select,更新为update,删除为delete,id绑定具体的实现方法,比如insert当中id绑定为被映射接口的add方法,select其中一个绑定对应被映射接口的selectById方法。parametertype为输入参数类型,resulttype为输出参数类型,为完整的实体类地址。sql语句当中通过#{}即可实现对应形参对sql语句的绑定,当输入的类型为一个类时,同样可以通过#{类中属性名}对应属性的绑定。

4.在总配置文件文件mybatis-config.xml中进行声明

javascript 复制代码
  <mappers>
        <mapper resource="mapper/PinpaiMapper.xml"/>
        <mapper resource="mapper/BookMapper.xml"/>
    </mappers>

接着便可被调用,调用时分为以下几步:

javascript 复制代码
//        1、读取mybatis的主配置文件mybatis-config.xml
        Reader reader= null;
        try {
            reader = Resources.getResourceAsReader("mybatis-config.xml");
        } catch (IOException e) {
            throw new RuntimeException(e);
        }
//        2、创建SqlSessionFactoryBuilder对象
        SqlSessionFactoryBuilder factoryBuilder = new SqlSessionFactoryBuilder();
//        3、创建SqlSessionFactory对象
        factory = factoryBuilder.build(reader);
//        4、创建SqlSession会话对象(获取链接)
        SqlSession sqlSession = factory.openSession();
//5.获取对应接口实现类
 PinpaiMapper mapper=sqlSession.getMapper(PinpaiMapper.class);
        //6.调用方法
        int result=mapper.add(pinpai);
        System.out.println(result);
//        7、提交事务
        sqlSession.commit();

//        8、关闭资源
        sqlSession.close();

由于1,2,3,4,6,7,8步骤为固定的,因此我们还可以封装为一个工具类来调用。

4.自动映射与手动映射

传统使用自动映射,在实体类的属性名和数据库当中的列名一致时可以使用。当实体类定义的属性名和数据库不一致时,我们需要引入手动映射

右侧column为数据库中的名称,左侧为实体类属性名

javascript 复制代码
<!--    自动映射-->
    <select id="selectAll" resultType="com.mybatis.entity.Book">
        select * from book
    </select>
    <!--    手动映射-->
   <select id="selectAll" resultMap="bookMap">
        select * from book
   </select>
   <resultMap id="bookMap" type="com.mybatis.entity.Book">
        <id property="bookid" column="book_id"/>
        <result property="bookname" column="book_name"/>
        <result property="price" column="price"/>
       <result property="deleted" column="deleted"/>
    </resultMap>

5.mapper接口中需要传入多个属性

mapper接口默认只能传入一个属性值,当需要传入多个属性值时,由以下几种方法

1.转为单属性值

javascript 复制代码
        HashMap<String,Object> map = new HashMap<>();
        map.put("bookName","红楼梦");
        map.put("pageNum",1);
        map.put("pageSize",2);
        final SqlSession sqlSession = MybatisUtil.getSqlSession();
        BookMapper mapper = sqlSession.getMapper(BookMapper.class);

      List<Book> books2 = mapper.selectBookByNameAndPage2(map);
javascript 复制代码
List<Book> selectBookByNameAndPage2(Map<String,Object> map);
javascript 复制代码
 <select id="selectBookByNameAndPage2" parameterType="Map" resultType="Book">
        select * from book where book_name=#{bookName} limit #{pageNum},#{pageSize}
    </select>

2.使用param1,param2等来访问对应位置

javascript 复制代码
List<Book> selectBookByNameAndPage(String bookName, int pageNum, int pageSize);
javascript 复制代码
     List<Book> books = mapper.selectBookByNameAndPage("红楼梦", 1, 2);
javascript 复制代码
<select id="selectBookByNameAndPage" resultType="com.mybatis.entity.Book">
        select * from book where book_name=#{param1} limit #{param2},#{param3}
    </select>

6.Like模糊匹配

7.sql片段

8.动态sql

where标签的主要作用是去除掉对应位置的and关键字,搭配if来使用,而if判断的是如果前端没有传入对应属性值,则对应属性值没有被赋值,为初始值,所以判断是否为初始值即可实现对应是否动态增加判断条件。

set标签也搭配if标签使用,去除后面多余的","逗号。

9.mybatisX插件的使用

一键完成所有的配置。

10.项目结构总结

相关推荐
Hanson Huang1 小时前
【数据结构】堆排序详细图解
java·数据结构·排序算法·堆排序
路在脚下@2 小时前
Redis实现分布式定时任务
java·redis
xrkhy2 小时前
idea的快捷键使用以及相关设置
java·ide·intellij-idea
巨龙之路2 小时前
Lua中的元表
java·开发语言·lua
花花鱼3 小时前
itext7 html2pdf 将html文本转为pdf
java·pdf
小丁爱养花3 小时前
驾驭 Linux 云: JavaWeb 项目安全部署
java·linux·运维·服务器·spring boot·后端·spring
我爱拉臭臭3 小时前
kotlin音乐app之自定义点击缩放组件Shrink Layout
android·java·kotlin
一个小白14 小时前
C++ 用红黑树封装map/set
java·数据库·c++
嘵奇4 小时前
Java单例模式:实现全局唯一对象的艺术
java·开发语言·单例模式
eternal__day4 小时前
第二期:[特殊字符] 深入理解MyBatis[特殊字符]MyBatis基础CRUD操作详解[特殊字符]
java·spring·java-ee·maven·mybatis