Javaweb学习笔记——JDBC和Mybatis

1、JDBC

首先选择模块:

选择java,给文件命名

在pom文件引入依赖:

复制代码
<dependencies>
    <!-- MySQL JDBC driver -->
    <dependency>
        <groupId>mysql</groupId>
        <artifactId>mysql-connector-java</artifactId>
        <version>8.0.30</version>
    </dependency>

    <dependency>
        <groupId>org.junit.jupiter</groupId>
        <artifactId>junit-jupiter</artifactId>
        <version>5.9.3</version>
        <scope>test</scope>
    </dependency>

    <dependency>
        <groupId>org.projectlombok</groupId>
        <artifactId>lombok</artifactId>
        <version>1.18.30</version>
    </dependency>
</dependencies>

之后创建一个user表,这里选用的是Datagrip软件中进行创建,也可以直接在mysql上创建:

数据如下:

复制代码
create table user(
    id int unsigned primary key auto_increment comment 'ID,主键',
    username varchar(20) comment '用户名',
    password varchar(32) comment '密码',
    name varchar(10) comment '姓名',
    age tinyint unsigned comment '年龄'
) comment '用户表';

insert into user(id, username, password, name, age) values (1, 'daqiao', '123456', '大乔', 22),
                                                           (2, 'xiaoqiao', '123456', '小乔', 18),
                                                           (3, 'diaochan', '123456', '貂蝉', 24),
                                                           (4, 'lvbu', '123456', '吕布', 28),
                                                           (5, 'zhaoyun', '12345678', '赵云', 27);

将数据插入之后,显示如下:

之后回到JAVa中创建一个类,在com.itheima下叫jdbcTest,

第一步是注册驱动,在寻找驱动类时,先按两下shift之后输入Driver并勾选右上角的包括非项目条目即可!

之后导入

复制代码
import com.mysql.cj.jdbc.Driver;

一定要记得在新的方法前加@Test,以下是完整代码:

复制代码
package com.itheima;

import com.mysql.cj.jdbc.Driver;
import org.junit.jupiter.api.Test;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.sql.Statement;


public class jdbcTest {
    @Test
    public void testUpdata() throws Exception {
        //注册驱动
        Class.forName("com.mysql.cj.jdbc.Driver");
        //获取数据库连接
        String url="jdbc:mysql://localhost:3306/web01";
        String user="root";
        String password="123456";
        Connection connection= DriverManager.getConnection(url,user,password);

        //获取sql语句执行对象
        Statement statement=connection.createStatement();

        //执行sql
        int i=statement.executeUpdate("update user set age=25 where id=1");
        System.out.println("sql语句执行完毕,影响的记录数为:"+i);

        //关闭连接
        connection.close();
        statement.close();
        System.out.println("数据库连接已关闭");
    }
}

结果:数据库中id=1的age已经发生改变

总结:

以下是全部代码:

复制代码
@Test
public void testSelect() throws SQLException {
    String url="jdbc:mysql://localhost:3306/web01";
    String user="root";
    String password="123456";

    Connection conn=null;
    PreparedStatement stmt=null;
    ResultSet rs=null;//封装查询返回的结果

    try{
        Class.forName("com.mysql.cj.jdbc.Driver");
    conn=DriverManager.getConnection(url,user,password);

    //预编译的sql语句
    String sql="select id,username,password,name,age from user where username=? and password=?";
    stmt=conn.prepareStatement(sql);
    stmt.setString(1,"daqiao");//第一个占位符的信息
    stmt.setString(2,"123456");

    rs=stmt.executeQuery();

    while(rs.next()){
        User user1=new User(
                rs.getInt("id"),
                rs.getString("username"),
                rs.getString("password"),
                rs.getString("name"),
                rs.getInt("age")
        );
        System.out.println(user1);
    }
    } catch (ClassNotFoundException e) {
        throw new RuntimeException(e);
    }finally{
        try{
            if(rs!=null) rs.close();
            if(stmt!=null) stmt.close();
            if(conn!=null) conn.close();
        }catch(SQLException e){
            e.printStackTrace();

        }
    }
}

通过这个方法可以得到以下结果:

总结:

如果使用上面的进行查询,可能出现SQL注入,导致用户名和密码不正确却可以正确登录,如:密码为:' or '1'='1,如果用第一种方式容易导致以下结果:

因此第二种方式更加安全!!!

总结:

2、mybatis

之后选中项目新建模块:

添加以下依赖项:

将User实体类放置在这里:

复制代码
package com.itheima.pojo;

import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;

@Data//将以下属性的get和set都设置了
@AllArgsConstructor//全参构造
@NoArgsConstructor//无参构造
public class User {
    //与数据库的属性要一一对应
    private Integer id;
    private String username;
     private String password;
     private String name;
     private Integer age;
}

之后选择resources中的

根据实际需求进行更改:

复制代码
#下面这些内容是为了让MyBatis映射
#指定Mybatis的Mapper文件
mybatis.mapper-locations=classpath:mappers/*xml
#指定Mybatis的实体目录
mybatis.type-aliases-package=com.itheima.mybatis.entity

#配置数据库的连接信息
spring.datasource.url=jdbc:mysql://localhost:3306/web01
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
spring.datasource.username=root
spring.datasource.password=123456

如果以上文件在打开时,中文是乱码,需要点击文件------设置------文件编码进行更改为UTF-8

之后在com.itheima下新建一个软件包叫:Mapper,之后在这里新建一个接口

之后在新建的类名上添加:@Mapper

输入以下代码:

复制代码
package com.itheima.Mapper;

import com.itheima.pojo.User;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Select;

import java.util.List;

@Mapper
public interface UserMapper {
    @Select("select * from user")//执行查询使用Select,删除Delete,修改Update,新增是Insert
    public List<User> findAll();
}

之后到测试类下的启动类:

复制代码
package com.itheima;

import com.itheima.Mapper.UserMapper;
import com.itheima.pojo.User;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;

import java.util.List;

@SpringBootTest
class SpringbootMybatisQuickerApplicationTests {

    @Autowired
    private UserMapper userMapper;

    @Test
    public void testAll(){
        List<User> list=userMapper.findAll();
        list.forEach(user -> System.out.println(user));
    }

}

将数据遍历输出:

总结:

之后点击右侧的数据库的标识,点击到MySQL页面:

根据实际输入用户、密码和数据库名称:

先测试连接,成功之后就可以应用并确定

之后就可以看到数据表:

在application.properties中添加以下内容实现日志输出:

复制代码
#mybatis日志输出
mybatis.configuration.log-impl=org.apache.ibatis.logging.stdout.StdOutImpl

如果要将Hikari换成Druid的数据池:先在pom文件中引入依赖------之后在application文件中添加一行,datasource.type的类型,如下所示:

总结:

删除用户:

首先打到UserMapper中:

复制代码
@Delete("delete from user where id=#{id}")
public void deleteById(int id);

加入以上代码

之后在test的测试类中添加以下代码:

复制代码
@Test
public void testDeleteID(){
    userMapper.deleteById(5);
}

运行后有这样的结果:

最终数据发生变化

新增用户:

首先在UserMapper中添加以下代码:

复制代码
@Insert("insert into user(username,password,name,age) values (#{username},#{password},#{name},#{age})")
public void insert(User user);

之后在测试类中添加如下内容:

复制代码
@Test
public void testInsert(){
    User user=new User(null,"admin","123456","登录",18);
    userMapper.insert(user);
}

结果显示,成功插入数据:

首先在Mapper:

复制代码
@Update("update user set username=#{username},password=#{password},name=#{name},age=#{age} where id=#{id}")
    public void update(User user);
}

之后在测试类中,此时的id要给值,不然无法确定要更改的是哪一行参数:

复制代码
@Test
public void testUpdate(){
    User user=new User(6,"add","123456","添加",25);
    userMapper.update(user);
}

结果如下所示:

首先在mapper中添加如下代码:

复制代码
@Select ("select * from user where username=#{username} and password=#{password}")
public User finduserpass(@Param("username") String username,@Param ("password")String password);

之后在测试中添加:

复制代码
@Test
public void testFindUserPass(){
    User user=userMapper.finduserpass("add","123456");
    System.out.println(user);
}

最终查询结果如下所示:

首先在建立新目录:com/itheima/Mapper,之后在这个目录下新建一个类,名字为:UserMapper.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">
<mapper namespace="com.itheima.Mapper.UserMapper">

</mapper>

其中mapper namespace的内容需要在主程序文件中的UserMapper中给出,右键类名选择复制引用即可!!!

之后在xml的mapper语句中添加如下内容:

复制代码
<mapper namespace="com.itheima.Mapper.UserMapper">
    <select id="findAll" resultType="com.itheima.pojo.User">
        select * from user
    </select>
</mapper>

id与UserMapper中的方法名保持一致,resulttype则是要存储对象的返回值,这里是User类,下面的语句就是UserMapper中注解后边的sql语句,之后将UserMapper中的注解进行注释,返回测试类中进行测试,结果正常输出!!!

如果你创建的新的UserMapper.xml并不是放在与主程序Mapper的同名同类包下,就会导致出错,还有一种解决方法就是在application.properties中进行定义

添加如下代码:

复制代码
#指定Mybatis的Mapper文件
mybatis.mapper-locations=classpath:mappers/*.xml

添加一个插件:主要用于快速跳转到对应的接口

如果加上插件之后出现如下错误:

将同一个项目下的其他重名的模块下的类移除之后即可消失

相关推荐
臭东西的学习笔记12 小时前
论文学习——机器学习引导的蛋白质工程
人工智能·学习·机器学习
夜流冰12 小时前
Motor - 电机扭矩和电机大小的关系
笔记
AI视觉网奇13 小时前
LiveTalking 部署笔记
笔记
倘若猫爱上鱼13 小时前
关于系统能检测到固态可移动硬盘(或U盘),系统资源管理器却始终无法扫描到固态可移动硬盘(或U盘)的解决办法
笔记
ghgxm52013 小时前
Fastapi_00_学习方向 ——无编程基础如何用AI实现APP生成
人工智能·学习·fastapi
求真求知的糖葫芦13 小时前
巴伦学习(一)一种新型补偿传输线巴伦论文学习笔记(自用)
笔记·学习·射频工程
沉默-_-13 小时前
力扣hot100滑动窗口(C++)
数据结构·c++·学习·算法·滑动窗口
freepopo14 小时前
书房设计|3㎡书桌角,治愈学习时光 [特殊字符]
学习
鑫—萍14 小时前
嵌入式开发学习——STM32单片机入门教程
c语言·驱动开发·stm32·单片机·嵌入式硬件·学习·硬件工程
while(1){yan}14 小时前
Spring事务
java·数据库·spring boot·后端·java-ee·mybatis