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

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

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

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

相关推荐
敬往事一杯酒哈7 小时前
海康 AGV 导航读码器学习
学习
qq_284274059 小时前
机械原理笔记:平面机构自由度计算(复合铰链、局部自由度、虚约束)与四杆机构入门(含考点)
笔记·学习·平面·自动化·制造
qq_2842740510 小时前
数控铣床与加工中心笔记:铣刀与刀柄系统、G54试切对刀、镜像加工指令、孔加工工艺(钻扩铰镗)与固定循环G73/G83/G81/G76/G87/G84
笔记·学习·自动化·制造
Titan202411 小时前
MySQL访问个人学习笔记
笔记·学习·mysql
小雪崩12 小时前
嵌入式学习 day64:字符设备驱动
学习
深圳老胡12 小时前
STM32CubeMX 生成 CMake 工程,用 VSCode 编译与调试的完整流程
笔记·stm32·单片机·代码规范
个 人 练 习 生12 小时前
C++ string 类模拟实现:从底层理解字符串(上)
开发语言·c++·经验分享·学习·程序人生
坤坤子吖12 小时前
C++智能指针:RAII、shared_ptr与内存泄漏
开发语言·c++·笔记·学习
乐橙开放平台13 小时前
智慧连锁客流检测和离岗检测怎么对接
大数据·人工智能·笔记·物联网·自动化·音视频·智能家居
零基础12313 小时前
FinalShell 使用教程:从安装到高效运维
运维·经验分享·笔记·finalshell