欢迎来到尧图网

客户服务 关于我们

您的位置:首页 > 财经 > 创投人物 > Maven和MyBatis学习总结

Maven和MyBatis学习总结

2025/4/18 20:26:04 来源:https://blog.csdn.net/weixin_56606482/article/details/147093229  浏览:    关键词: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是最初指向该结果集的第一行数据的指针,相当于依次将每一行数据传给调用者,由调用者来处理

 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封装的则是增删改操作

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

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

 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

 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需要添加tokensql="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文件中具体内容

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE configurationPUBLIC "-//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为对应被映射接口的详细地址信息
<?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中进行声明

  <mappers><mapper resource="mapper/PinpaiMapper.xml"/><mapper resource="mapper/BookMapper.xml"/></mappers>

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

//        1、读取mybatis的主配置文件mybatis-config.xmlReader 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为数据库中的名称,左侧为实体类属性名

<!--    自动映射--><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.转为单属性值

        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);
List<Book> selectBookByNameAndPage2(Map<String,Object> map);
 <select id="selectBookByNameAndPage2" parameterType="Map" resultType="Book">select * from book where book_name=#{bookName} limit #{pageNum},#{pageSize}</select>

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

List<Book> selectBookByNameAndPage(String bookName, int pageNum, int pageSize);
     List<Book> books = mapper.selectBookByNameAndPage("红楼梦", 1, 2);
<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.项目结构总结

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com

热搜词