JDBC:java与数据库连接,Maven,MyBatis

JDBC

是使用Java语言操作关系型数据库的一套API

JDBC是接口,用其实现一系列不同种类关系型数据库的实现类

JDBC本质:

·官方(sun公司)定义的一套操作所有关系型数据库的规则,即接口

·各个数据库厂商去实现这套接口,提供数据库驱动jar包

·我们可以使用这套接口(JDBC)编程,真正执行的代码是驱动jar包中的实现类

JDBC好处:

·各种数据库厂商使用相同的接口,java代码不需要针对不同的数据库分别开发

·可随时替换底层数据库,访问数据库的java代码基本不变

使用:

DriverManager

·DriverManager(驱动管理类)作用:

1·注册驱动

2·获取数据库连接

Connection

·Connection(数据库连接对象)作用:

1·获取执行SQL的对象
2·管理事务

开启和关闭事物的具体实现:

Statement

执行Update语句的实例:

ResultSet

PreparedStatement

SQL注入的例子:

将pwd写成

'' or '1' = '1';

就更改了sql语句,将其变为

select * from tb_user where username = name and password = '' or '1' = '1';

先执行and语句然后再是or语句

这样无论如何where 后面的语句都会等于true就会查询所有语句,这样使用resultSet.next()时就会存在这样的用户,

使用:

使用
原理

如果开启预编译功能,预编译发生的时候就是在创建PreparedStatement对象的时候,只需要PreparedStatement只需要编译一次,后续的代码要改变SQL语句,就只要改变占位符中的内容,就不会再编译一次。提高效率。

数据库连接池

简介:

使用:

Dirud连接池的使用步骤

实例:

Maven

概况

Maven是专门用于管理和构建Java项目的工具,它的主要功能有:

·提供了一套标准化的项目结构

·提供了一套标准化的构建流程(编译,测试打包,发布.....)

·提供了一套以来管理机制

标准化的项目结构

Maven项目目录的实例:

Maven提供了一套标准化的项目结构,所有IDE使用Maven构建的项目结构完全一样,所有IDE创建的Maven项目可以通用

提供了一套标准化的构建流程(编译,测试打包,发布.....)

依赖管理机制

依赖管理其实就是管理你项目所依赖的第三方资源(jar包、插件...)

简介:

Maven模型

仓库的分类
导入jar包的过程

Maven常用命令

Maven的生命周期

Maven的坐标详解

Maven导入Maven项目

依赖管理

使用坐标导入jar包

快捷方法

依赖范围

通过设置坐标的依赖范围(scope),可以设置对应jar包的作用范围:编译环境、测试环境、运行环境

MyBatis

MyBatis是一款优秀的持久层框架,用于简化JDBC开发

MyBatis本是Apache的一个开源项目iBatis,2010年这个项目由apache software foundation迁移到了Google code,并且改名为MyBatis。

官网:https://mybatis.org/mybatis-3/zh/index.html

持久层

负责将数据到保存到数据库的那一层代码

JavaEE三层架构:表现层、业务层、持久层

框架

框架就是一个半成品软件,是一套可重用的,通用的,软件基础代码模型

在框架的基础之上构建软件编写更加高效,规范,通用,可扩展

MyBatis简化

快速入门

详细网址:

入门_MyBatis中文网

Mapper代理开发

目的:

解决原生放式中的硬编码问题

简化后期执行SQL

使用

第一步将接口和sql映射文件放在同一个包名下面:

修改名称空间名,使其与Mapper接口的权限定名相同

创建接口保证里面的返回值和方法名和参数与sql映射文件的sq返回值语句的唯一标识参数相同。

还要修改mybatis-config.xml里面的mapper映射路径

最后运行代码

sql片段,每次书写SQL语句的时候就可以掉调用这个片段的di简化

书写

引用

resultMap完美解绝字段名和Mapper类型的名称不一样的问题
参数的传入

要借助参数占位符来传入参数:

1· #{} 会将其变为?,防止sql注入

2· ${} 会使用拼接字符串,并不会防止sql注入

实例:

sql映射中

Mapper接口中

如果有多个参数就要在参数前面添加@

复制代码
@Param("")

例如

复制代码

也可以通过传入一个对应的POJO类,使其属性名和要用到的字段名一致就会自动匹配

还可以通过Map集合传入

*只需要保证sQL中的参数名和map集合的键的名称对应上,即可设置成功

动态sql
if语句

使用if判断哪个条件不需要的,诺不满足test里面的条件就会忽略if里面的语句

java 复制代码
<select id="selectUserByAll" resultMap="UserResultMap">
        select * from user where
                               <if test="ID != null">
                                   ID like #{ID}
                               </if>
                                <if test="Name != null and Name != ''">
                                    and use_Name like #{Name}
                                </if>
                                <if test="Age != null">
                                    and Age like #{Age}
                                </if>;

    </select>

上述语句还有问题,如果只有中间有,则会让其变为where and use_Name like #{Name}这样会报错。解决方法,使用where语句包裹,会去掉前面多余的and

java 复制代码
<select id="selectUserByAll" resultMap="UserResultMap">
        select * from user <where>
                               <if test="ID != null">
                                   and ID like #{ID}
                               </if>
                                <if test="Name != null and Name != ''">
                                    and use_Name like #{Name}
                                </if>
                                <if test="Age != null">
                                    and Age like #{Age}
                                </if>;
                            </where>
    </select>
choose语句.

多条件中选择一个

choose(when,otherwise):选择,类似于Java中的switch语句

java 复制代码
<select id="selectUserByAll_choose" resultMap="UserResultMap">
        select * from user where
        <choose>
            <when test="ID != null">
            and ID like #{ID}
            </when>
            <when test="Name != null and Name != ''">
                and use_Name like #{Name}
            </when>
            <when test="Age != null">
                and Age like #{Age}
            </when>
            <otherwise>
                and 1 != 1
            </otherwise>
        </choose>
    </select>

insert语句

基本使用

要用insert语句来进行对其数据的添加,

复制代码
<insert id="insertUser">
        insert into user(ID,use_Name,Age)
        values (#{ID},#{useName},#{Age});
    </insert>

要注意的是,这里mapper代理不会自动提交事务,要调用sqlSession.commit().才会提交添加后的结果

java 复制代码
 String resource = "mybatis-config.xml";
        InputStream inputStream = Resources.getResourceAsStream(resource);
        SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
        SqlSession sqlSession = sqlSessionFactory.openSession();
        userMapper mapper = sqlSession.getMapper(userMapper.class);
        User user = new User();
        user.setUse_Name("大强");
        user.setAge(88);
        user.setID(5);
        mapper.insertUser(user);
        sqlSession.commit();

也可以设置自动提交事务

java 复制代码
SqlSession sqlSession = sqlSessionFactory.openSession(true);
主键返回

对sql映射文件进行设置,使其自动将主键的值返回到对象对应的属性去,设置useGeneratedKeys="true" keyProperty="ID";就会将主键的值返回到user对象的对应ID属性中。

java 复制代码
<insert id="insertUser" useGeneratedKeys="true" keyProperty="ID">
        insert into user(ID,use_Name,Age)
        values (#{ID},#{useName},#{Age});
    </insert>

update语句

可以直接传入对象封装的属性,也可手动一个字段一个字段的添加

java 复制代码
<update id="updateByID">
        update user set use_Name=#{Name},Age=#{Age} where ID = #{ID};
    </update>

delete语句

单个删除

java 复制代码
<delete id="deleteByID">
        delete from user where id = #{ID};
    </delete>

动态删除:需要使用数组来传入参数,foreach会自动将传入进来的数组转为Map集合,并进行拆解,可以指定分隔符

collection:键名称 item:对应的sql字段 separator:分隔字符 open:以什么开始 close:以什么结束

java 复制代码
<delete id="deleteByID">
        delete from user where id in <foreach collection ="array" item ="ID" separator="," open="(" close=")">
        #{ID}
    </foreach>
    </delete>

这段相当于把array数组在下面#{ID}有多少次:

delete from user where id in(#{ID},#{ID} .......)

并用,分隔。

collection 细节:如果是数组则="array"是可以的,也可以自己用@Param指定

Mybaties封装参数的原理

相关推荐
学习编程的gas21 分钟前
C++面向对象编程入门:从类与对象说起(一)
开发语言·c++
冼紫菜22 分钟前
【Spring Boot 多模块项目】@MapperScan失效、MapperScannerConfigurer 报错终极解决方案
java·开发语言·mybatis
还听珊瑚海吗1 小时前
基于SpringBoot的抽奖系统测试报告
java·spring boot·后端
Bear on Toilet1 小时前
Bug日记——实现“日期类”
开发语言·c++·bug
练习本1 小时前
Android系统架构模式分析
android·java·架构·系统架构
apcipot_rain1 小时前
《面向对象程序设计-C++》实验五 虚函数的使用及抽象类
开发语言·c++
程序员拂雨2 小时前
MongoDB知识框架
数据库·mongodb
明月看潮生3 小时前
青少年编程与数学 02-019 Rust 编程基础 05课题、复合数据类型
开发语言·青少年编程·rust·编程与数学
心灵宝贝3 小时前
IDEA 安装 SpotBugs 插件超简单教程
java·macos·intellij-idea
幼稚诠释青春3 小时前
Java学习笔记(对象)
java·开发语言