技术标签: java mybatis mysql Javaweb学习
创建springboot工程,并导入mybatis起步依赖和mysql驱动包
创建数据库中的表,并创建对应的实体类
使用图形化客户端工具,连接MySQL数据库是的配置:
在springboot项目中,可以编写application.properties文件,配置数据库连接信息。
#驱动类名称
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
#数据库连接的url
spring.datasource.url=jdbc:mysql://localhost:3306/mybatis
#连接数据库的用户名
spring.datasource.username=root
#连接数据库的密码
spring.datasource.password=1234
在创建的springboot工程中,在引导类所在包下,在创建一个包mapper。
@Mapper注解:表示是mybatis中的Mapper接口
@Select注解:代表的就是select查询,用于书写select查询语句
Mybatis框架,就是对原始的JDBC程序的封装。
import com.itheima.pojo.User;
import org.junit.jupiter.api.Test;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.Statement;
import java.util.ArrayList;
import java.util.List;
public class JdbcTest {
@Test
public void testJdbc() throws Exception {
//1. 注册驱动
Class.forName("com.mysql.cj.jdbc.Driver");
//2. 获取数据库连接
String url="jdbc:mysql://127.0.0.1:3306/mybatis";
String username = "root";
String password = "1234";
Connection connection = DriverManager.getConnection(url, username, password);
//3. 执行SQL
Statement statement = connection.createStatement(); //操作SQL的对象
String sql="select id,name,age,gender,phone from user";
ResultSet rs = statement.executeQuery(sql);//SQL查询结果会封装在ResultSet对象中
List<User> userList = new ArrayList<>();//集合对象(用于存储User对象)
//4. 处理SQL执行结果
while (rs.next()){
//取出一行记录中id、name、age、gender、phone下的数据
int id = rs.getInt("id");
String name = rs.getString("name");
short age = rs.getShort("age");
short gender = rs.getShort("gender");
String phone = rs.getString("phone");
//把一行记录中的数据,封装到User对象中
User user = new User(id,name,age,gender,phone);
userList.add(user);//User对象添加到集合
}
//5. 释放资源
statement.close();
connection.close();
rs.close();
//遍历集合
for (User user : userList) {
System.out.println(user);
}
}
}
数据库连接池是个容器,负责分配、管理数据库连接(Connection)
允许应用程序重复使用一个现有的数据库连接,而不是再重新建立一个
Lombok是一个实用的Java类库。
常用的注解:
注解 | 作用 |
---|---|
@Getter/@Setter | 为所有的属性提供get/set方法 |
@ToString | 会给类自动生成易阅读的 toString 方法 |
@EqualsAndHashCode | 根据类所拥有的非静态字段自动重写 equals 方法和 hashCode 方法 |
@Data | 提供了更综合的生成代码功能(@Getter + @Setter + @ToString + @EqualsAndHashCode) |
@NoArgsConstructor | 为实体类生成无参的构造器方法 |
@AllArgsConstructor | 为实体类生成除了static修饰的字段之外带有各参数的构造器方法。 |
创建工程项目,导入配置,除此之外,配置日志输出位置
#指定mybatis输出日志的位置, 输出控制台
mybatis.configuration.log-impl=org.apache.ibatis.logging.stdout.StdOutImpl
SQL注入:是通过操作输入的数据来修改事先定义好的SQL语句,以达到执行代码对服务器进行攻击的方法。
@Delete注解:用于编写delete操作的SQL语句,一般放在mapper接口方法上
如果mapper接口方法形参只有一个普通类型的参数,#{…} 里面的属性名可以随便写,如:#{id}、#{value}。但是建议保持名字一致。
@insert注解:用于在mapper接口方法上来新增数据,方法接收传入的对象,然后sql语句取对象的属性与数据表中的属性一 一对应进行赋值,来实现新增数据。
很多业务内容,再添加内容成功后,需要获取插入数据库数据的主键。
默认情况下,执行插入操作时,是不会主键值返回的。如果我们想要拿到主键值,需要在Mapper接口中的方法上添加一个Options注解,并在注解中指定属性useGeneratedKeys=true和keyProperty=“实体类属性名”。
@update注解:用于在mapper接口方法上来更新数据,通过要更新的数据的id来找到数据,然后通过sql语句对其中的内容进行更新。
@select注解:在mapper接口方法上来查询数据。通过传入的参数进行数据查询,并肩查询到的数据添加到一个集合中,并将集合返回。
问题:
解决方案:
实际业务中,查询会有多个条件,然后通过传入的条件进行查询。
例如:模糊查询,此时@select注解中的sql语句就会出现问题,容易发生sql注入的问题,此时需要借用concat方法对模糊查询的内容进行拼接。
Mybatis的开发方式有两种:
在Mybatis中使用XML映射文件方式开发,需要符合一定的规范:
注意点:
<select>标签:就是用于编写select查询语句的。
resultType属性,指的是查询返回的单条记录所封装的类型。
映射文件的编写:
<?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">
<mapper namespace="">
<select id="list" resultType="com.itheima.pojo.Emp">
</select>
</mapper>
结论:使用Mybatis的注解,主要是来完成一些简单的增删改查功能。如果需要实现复杂的SQL功能,建议使用XML来配置映射语句,例如:动态SQL。
SQL语句会随着用户的输入或外部条件的变化而变化,我们称为:动态SQL。
<if>:用于判断条件是否成立。
<where>:只会在子元素有内容的情况下才插入where子句,而且会自动去除子句的开头的and或or
<set>:动态的在SQL语句中插入set关键字,并会删掉额外的逗号。(用于update语句中)
<foreach>:遍历传入的参数集合,一般是对数据进行批量操作时使用。
<foreach collection="集合名称" item="集合遍历出来的元素/项" separator="每一次遍历使用的分隔符"
open="遍历开始前拼接的片段" close="遍历结束后拼接的片段">
<sql>:定义可重用的SQL片段
<include>`:通过属性refid,指定包含的SQL片段
文章浏览阅读738次,点赞13次,收藏16次。本文记录了 Yukiii 学习 Vue 期间的心得和相关功能的具体实现及 Vue 的基本使用方法,方便后续开发时的查阅~
文章浏览阅读6.4k次,点赞3次,收藏25次。报错各种问题,真的很烦java.net.SocketException: socket failed: EPERM (Operation not permitted)java.net.SocketException:socket failed:EACCES (Permission denied)java.io.IOException: Cleartext HTTP traffic to 10.0.2.2 not permittedD/Netw at java.net.Socket.creat_android eperm (operation not permitted)
文章浏览阅读826次,点赞2次,收藏9次。SRC挖掘-拿下CNVD证书开源&闭源&售卖系统_ihsdus.cn
文章浏览阅读9.9k次,点赞4次,收藏44次。1.评论框及评论内容展示模板如下: div id="comment"> h3>strong>发表评论:strong>h3> p>span>标题:span> input type="text" name="" id="comm_title" class="text">p> p>span>内容:span>textarea rows="10"_在页面中输入你的评论,单击“评论”按钮,如果留言区没有评论,则直接添加评论,如果
文章浏览阅读1.2k次。一 什么是mitmproxy 抓包工具2 mitmproxy抓包工具介绍pip install mitmproxy检测是否安装成功mitmproxy --version默认监听 8080端口,使用 -p 指定端口3 下载证书linux 中操作mitmproxytab 切换显..._mitm框架
文章浏览阅读1.7k次。一般情况使用c:out和el表达式的效果是一样的,如: hello(使用标签):hello(使用el表达式):${hello}那一般什么时候会使用c:out标签呢?有两种情况: (1)使用缺省值。有的时候某个东西没设值,但要输出缺省值,如果用el表达式什么都不输出,但可以使用c:out输出想要输出的缺省值;如下: hello(default="123"):这样就输出了想要输出的_jstl c:out输出有小数点
文章浏览阅读2.5k次。raw_input() 与 input()均是python 的内建函数,通过读取控制台的输入与用户实现交互。但他们的功能不尽相同。举两个小例子>>> raw_input_A = raw_input("raw_input: ")raw_input: abc >>> input_A = input("Input: ")Input: abcTraceback (most recent ca_pycharm没有raw input
文章浏览阅读1k次。只需修改ARcamera上的Max Simutaneous Tracked Images 的值就好了。初始是1,默认只能识别一张图。 扩展跟踪是一个更简单的事情,高通把这个功能封装成了ImageTarget的一个属性 Extended Tracking,只要将其勾上就可以了._imagetarget扩展追踪
文章浏览阅读172次。现在很多一键化的root工具,但是仍然有不少的三星手机是无法用全自动方式进行root的,这时候,我们可以选择使用手工的方式进行root,本文章对手工root的一些方法进行一些介绍。 常规方法:..._三星手机用面具root
文章浏览阅读1.7k次。原标题:2021年高三佛山一模,看佛山高中排名2021年1月11日佛山进行了新高考改革后第一次佛山一模考试,作为高考风向标,各高中的成绩具有很大参考意义。结合2018年中考录取分数、2021年佛山一模、2020年佛山一模对佛山56所高中进行简要分析,从而展望2021年高考。 1-10名石门中学稳居第一,佛山一中重夺第二,南海中学增长强劲,顺德一中略显颓势,李兆基中学增长强劲,郑裕彤中学加工能..._佛山国华纪念中学2021年高考成绩
文章浏览阅读1k次。---------查询公司pkselect pk_corp from bd_corp where unitcode='公司编码' 进行删除应收应付模块启用功能 删除2008与2006的行即可(删除行前,要删除期初录入的数据。) select * from sm_createcorp where pk_corp='1025' for update 解锁,删除行,点对勾,然后提前端f10_应付管理系统怎么清除数据
文章浏览阅读669次,点赞13次,收藏8次。嵌入式固件加密的几种方式_固件加密