如何通过JDBC获取数据库连接 , 实现对单表数据增、删、改 ,实现对单表数据查询以及根据别名查询处理结果集扩展

1、获取连接

能够通过JDBC获取数据库连接

讲解

API介绍

java.sql.DriverManager类中有如下方法获取数据库连接

static Connection getConnection(String url, String user, String password) 
连接到给定数据库 URL ,并返回连接。 
参数说明
  1. String url:连接数据库的URL,用于说明连接数据库的位置
  2. String user:数据库的账号
  3. String password:数据库的密码

连接数据库的URL地址格式:协议名:子协议://服务器名或IP地址:端口号/数据库名?参数=参数值
在这里插入图片描述

MySQL写法:jdbc:mysql://localhost:3306/day04_db
如果是本地服务器,端口号是默认的3306,则可以简写:jdbc:mysql:///day04_db

在这里插入图片描述

注意事项

如果数据出现乱码需要加上参数: ?useUnicode=true&characterEncoding=utf8,表示让数据库以UTF8编码来处理数据。
如: jdbc:mysql://localhost:3306/day04_db?useUnicode=true&characterEncoding=utf8

使用步骤

1.DriverManager.getConnection(url, user, password); 传入对应参数即可

案例代码
public class Demo01 {
	public static void main(String[] args) throws Exception {
		Class.forName("com.mysql.jdbc.Driver");
         /*
            1)使用DriverManager类中的静态方法获取和数据库的连接:
                static Connection getConnection(String url, String user, String password)
                    参数:
                        url:表示建立和数据库服务器连接的地址,书写格式几乎是固定的。
                            jdbc:mysql://连接mysql服务器的ip地址:mysql服务器的端口号/连接的数据库名
                            补充:如果连接的数据库软件在本地,那么url可以简写为:jdbc:mysql:///连接的数据库名
                        user:连接mysql服务器的用户名,这里暂时书写root
                        password:接mysql服务器的密码
                    返回值:Connection,属于java.sql 包下的一个接口,表示连接接口,和数据库的连接。

         */
		// 连接到MySQL
		// url: 连接数据库的URL
		// user: 数据库的账号
		// password: 数据库的密码
		Connection conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/day04_db", "root", "1234");
		System.out.println(conn);
	}
}
案例效果

1.连接成功
在这里插入图片描述

2.连接失败
在这里插入图片描述

小结

  1. JDBC获取数据库连接使用哪个API?

    DriverManager.getConnection(数据库url, 账号, 密码)
    
  2. 通过JDBC连接mysql的URL写法?

    jdbc:mysql://服务器ip地址:3306/数据库
    

3.如果连接mysql服务器在本地,那么url可以简写:

jdbc:mysql:///数据库

2、JDBC实现对单表数据增、删、改

目标

通过JDBC实现对单表数据增、删、改、查

讲解

JDBC实现对单表数据增、删、改

我们要对数据库进行增、删、改、查,需要使用Statement对象来执行SQL语句。

API介绍

获取Statement对象

java.sql.Connection接口中有如下方法获取到Statement对象

Statement createStatement() 
创建一个 Statement 对象来将 SQL 语句发送到数据库

Statement的API介绍

  1. int executeUpdate(String sql)
    根据执行的DMLINSERTUPDATEDELETE)语句,返回受影响的行数
    
  2. ResultSet executeQuery(String sql)
    根据查询语句返回结果集,只能执行SELECT语句
    

    注意:在MySQL中,只要不是查询就是修改。
    executeUpdate:用于执行增删改
    executeQuery:用于执行查询

使用步骤
  1. 注册驱动
  2. 获取连接
  3. 获取Statement对象
  4. 使用Statement对象执行SQL语句
  5. 释放资源
案例代码
public class Demo03 {
	public static void main(String[] args) throws Exception {
		Class.forName("com.mysql.jdbc.Driver");

		Connection conn = DriverManager.getConnection("jdbc:mysql:///day04_db", "root", "1234");
		System.out.println(conn);

        /*
            1)获取发送sql语句对象使用Connection连接接口对象调用Connection接口的方法:
                 Statement createStatement() 创建一个 Statement 对象来将 SQL 语句发送到数据库。
                 PreparedStatement prepareStatement(String sql) 创建一个 PreparedStatement 对象来将参数化的 SQL 语句发送到数据库。
             2)Statement和PreparedStatement都可以用来向数据库发送sql语句,Statement是PreparedStatement的父接口。

             3)PreparedStatement 是安全的,Statement不安全的。并且Statement效率低,PreparedStatement效率高

             4)Connection还可以手动控制mysql事务:
                开启事务  void setAutoCommit(boolean autoCommit) 将此连接的自动提交模式设置为给定状态。
                            autoCommit - 为 true 表示启用自动提交模式;为 false 表示禁用自动提交模式

               1. conn.setAutoCommit(false);

                一切正常提交事务  void commit()

               2. conn.commit()

                出现异常,回滚事务  void rollback()

               3. conn.rollback()

         */
		// 从连接中拿到一个Statement对象
		Statement stmt = conn.createStatement();

        /*
            Statement向数据库发送sql语句,使用Statement中的不同的方法可以向数据库发送不同的sql语句:
                1)DQL查询语句:  ResultSet executeQuery(String sql) 执行给定的 SQL 语句,该语句返回单个 ResultSet 对象。
                                                参数:sql - 要发送给数据库的 SQL 语句,通常为静态 SQL SELECT 语句
                                                 返回值:ResultSet用来存放查询的结果,表示结果集
                2)DML增删改和DDL语句(创建表和数据库)使用的方法:
                     int executeUpdate(String sql)
                            执行给定 SQL 语句,该语句可能为 INSERT、UPDATE 或 DELETE 语句(DML),
                            或者不返回任何内容的 SQL 语句(如 SQL DDL 语句)。
                          返回值:
                                    1) 对于 SQL 数据操作语言 (DML) 语句,返回行记录数,影响的行数
                                    2) 对于什么都不返回的 SQL 语句,返回 0 ,执行DDL返回的是0 了解

         */
		// 1.插入记录
		String sql = "insert into user values(null, 'zhaoliu', 'abc')";
		int i = stmt.executeUpdate(sql);
		System.out.println("影响的行数:" + i);

		// 2.修改记录
		sql = "update user set username='tianqi' where username='zhaoliu'";
		i = stmt.executeUpdate(sql);
		System.out.println("影响的行数:" + i);

		// 3.删除记录
		sql = "delete from user where id=4";
		i = stmt.executeUpdate(sql);
		System.out.println("影响的行数:" + i);
		
		// 释放资源
		stmt.close();
		conn.close();
	}
}

3、JDBC实现对单表数据查询

目标

能够掌握JDBC实现对单表数据查询

讲解

ResultSet用于保存执行查询SQL语句的结果。
我们不能一次性取出所有的数据,需要一行一行的取出。

ResultSet的原理
  1. ResultSet内部有一个指针,刚开始记录开始位置
  2. 调用next方法, ResultSet内部指针会移动到下一行数据
  3. 我们可以通过ResultSet得到一行数据 getXxx得到某列数据
    在这里插入图片描述
ResultSet获取数据的API

其实ResultSet获取数据的API是有规律的get后面加数据类型。我们统称getXXX()
在这里插入图片描述

​ 例如:

在这里插入图片描述

对于上图中的一行数据,我要获取username为zhangsan这列的值,有如下2种写法:

  1. rs.getString(“username”); 通过列名获取该列的值。

  2. rs.getString(2); 通过username列所在的第二个位置获取该列的值。

使用JDBC查询数据库中的数据的步骤
  1. 注册驱动
  2. 获取连接
  3. 获取到Statement
  4. 使用Statement执行SQL
  5. ResultSet处理结果
  6. 关闭资源
案例代码
public class Demo04 {
	public static void main(String[] args) throws Exception {
		Class.forName("com.mysql.jdbc.Driver");
		
		Connection conn = DriverManager.getConnection("jdbc:mysql:///day04_db", "root", "1234");
		Statement stmt = conn.createStatement();
		
		String sql = "select * from user";
		ResultSet rs = stmt.executeQuery(sql);
		
		// 内部有一个指针,只能取指针指向的那条记录
        while(rs.next()){// 指针移动一行,有数据才返回true
				int id = rs.getInt("id");
				String name = rs.getString(2);
				String pwd= rs.getString(3);
				System.out.println(id+"+++"+name+"++++"+pwd);
			}
		
		// 关闭资源
		rs.close();
		stmt.close();
		conn.close();
	}
}

小结

其实我们使用JDBC操作数据库的步骤都是固定的。不同的地方是在编写SQL语句

  1. 注册驱动
  2. 获取连接
  3. 获取到Statement
  4. 使用Statement执行SQL
  5. ResultSet处理结果
  6. 关闭资源

ResultSet如何获取数据?

  1. 调用next方法, ResultSet内部指针会移动到下一行数据
  2. 我们可以通过ResultSet得到一行数据 getXxx得到某列数据

在这里插入图片描述

4. 根据别名查询处理结果集扩展

package com.itheima.sh.a_jdbc_01;

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

public class JDBC03Test {
    public static void main(String[] args) throws Exception {
        /*
            需求:查询数据表user2所有数据输出到控制台
         */
        //2.获取连接
        String url = "jdbc:mysql://localhost:3306/day03_heima138";//连接mysql服务器地址
        String username = "root";//连接mysql服务器用户名
        String password = "1234";//连接mysql服务器密码,这里输入你的密码
        Connection conn = DriverManager.getConnection(url, username, password);

        //3.定义sql
        String sql = "select id,username,password pwd from user2";

        //4.获取发送sql语句对象
        Statement st = conn.createStatement();

        //5.发送sql语句
        /*
            1.ResultSet 表示结果集,用来存放查询的结果,因为查询有可能是多行数据,所以使用集合存储
         */
        ResultSet rs = st.executeQuery(sql);

        //6.处理结果
        while(rs.next()){
            //获取数据
            int id = rs.getInt("id");
            String userName = rs.getString("username");
            /*
                对应处理结果集ResultSet中的getXxx(xxx 变量名):
                    1)根据第几列来获取字段值:例如password属于第三列,那么这里获取password值是:rs.getString(3);
                    2)根据字段名或者别名来获取字段值:如果sql语句某个字段有别名,那么只能书写别名,不能书写字段
                        sql语句:select id,username,password pwd from user2
                        获取密码值:rs.getString("pwd");
             */
            String pwd = rs.getString("pwd");

            //输出
            System.out.println(id+"---"+userName+"---"+pwd);
        }

        //7.释放资源
        rs.close();
        st.close();
        conn.close();
    }
}

  • 24
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
好的,下面我将详细介绍一下如何基于SpringMVC框架开发学生信息查询系统,实现分页查询显示学生选课信息表中的记录。为了方便演示,我将使用MySQL数据库和MyBatis框架。 1. 创建SpringMVC项目 首先,我们需要创建一个Maven项目,并在pom.xml文件中添加SpringMVC和MyBatis的依赖。 2. 配置数据源和MyBatis 在src/main/resources目录下创建一个jdbc.properties文件,用于配置数据源信息,例如: ``` jdbc.driverClassName=com.mysql.jdbc.Driver jdbc.url=jdbc:mysql://localhost:3306/students?useUnicode=true&characterEncoding=UTF-8 jdbc.username=root jdbc.password= ``` 然后,在src/main/resources目录下创建一个mybatis-config.xml文件,用于配置MyBatis的全局属性和类型别名。例如: ``` <configuration> <typeAliases> <package name="com.example.demo.entity"/> </typeAliases> <mapperScan basePackage="com.example.demo.mapper"/> </configuration> ``` 3. 创建数据库和表 在MySQL数据库中创建一个名为students的数据库,并在该数据库中创建一个名为student_course的表,用于存储学生选课信息。表结构如下: ``` CREATE TABLE `student_course` ( `id` int(11) NOT NULL AUTO_INCREMENT COMMENT '编号', `student_id` int(11) NOT NULL COMMENT '学生编号', `course_id` int(11) NOT NULL COMMENT '课程编号', PRIMARY KEY (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='学生选课信息表'; ``` 4. 编写实体类和Mapper接口 在com.example.demo.entity包下创建一个StudentCourse实体类,用于映射student_course表的记录。例如: ``` public class StudentCourse { private Integer id; private Integer studentId; private Integer courseId; // 省略getter和setter方法 } ``` 然后,在com.example.demo.mapper包下创建一个StudentCourseMapper接口,用于定义查询学生选课信息的方法。例如: ``` public interface StudentCourseMapper { List<StudentCourse> selectByPage(@Param("start") int start, @Param("pageSize") int pageSize); int count(); } ``` 5. 编写Service和Controller 在com.example.demo.service包下创建一个StudentCourseService接口和一个StudentCourseServiceImpl实现类,用于封装查询学生选课信息的方法。例如: ``` public interface StudentCourseService { PageResult<StudentCourse> selectByPage(int pageNum, int pageSize); } @Service public class StudentCourseServiceImpl implements StudentCourseService { @Autowired private StudentCourseMapper studentCourseMapper; @Override public PageResult<StudentCourse> selectByPage(int pageNum, int pageSize) { PageHelper.startPage(pageNum, pageSize); List<StudentCourse> list = studentCourseMapper.selectByPage(pageNum, pageSize); PageInfo<StudentCourse> pageInfo = new PageInfo<>(list); PageResult<StudentCourse> pageResult = new PageResult<>(); pageResult.setList(list); pageResult.setTotalCount(pageInfo.getTotal()); pageResult.setTotalPage(pageInfo.getPages()); pageResult.setPageSize(pageSize); pageResult.setPageNum(pageNum); return pageResult; } } ``` 然后,在com.example.demo.controller包下创建一个StudentCourseController类,用于处理分页查询的请求。例如: ``` @Controller @RequestMapping("/studentCourse") public class StudentCourseController { @Autowired private StudentCourseService studentCourseService; @RequestMapping("/list") public String list(@RequestParam(defaultValue = "1") int pageNum, Model model) { PageResult<StudentCourse> pageResult = studentCourseService.selectByPage(pageNum, 6); model.addAttribute("pageResult", pageResult); return "list"; } } ``` 6. 编写JSP页面 在src/main/webapp/WEB-INF/views目录下创建一个list.jsp页面,用于显示学生选课信息的列表。例如: ``` <%@ page contentType="text/html;charset=UTF-8" language="java" %> <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %> <!DOCTYPE html> <html> <head> <title>学生选课信息列表</title> </head> <body> <table border="1"> <tr> <th>编号</th> <th>学生编号</th> <th>课程编号</th> </tr> <c:forEach items="${pageResult.list}" var="studentCourse"> <tr> <td>${studentCourse.id}</td> <td>${studentCourse.studentId}</td> <td>${studentCourse.courseId}</td> </tr> </c:forEach> </table> <br> <c:if test="${pageResult.pageNum > 1}"> <a href="${pageContext.request.contextPath}/studentCourse/list?pageNum=${pageResult.pageNum - 1}">上一页</a> </c:if> <c:if test="${pageResult.pageNum < pageResult.totalPage}"> <a href="${pageContext.request.contextPath}/studentCourse/list?pageNum=${pageResult.pageNum + 1}">下一页</a> </c:if> </body> </html> ``` 7. 配置DispatcherServlet 在web.xml文件中配置DispatcherServlet,用于处理所有的请求。例如: ``` <servlet> <servlet-name>dispatcherServlet</servlet-name> <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class> <init-param> <param-name>contextConfigLocation</param-name> <param-value>classpath:spring-mvc.xml</param-value> </init-param> <load-on-startup>1</load-on-startup> </servlet> <servlet-mapping> <servlet-name>dispatcherServlet</servlet-name> <url-pattern>/</url-pattern> </servlet-mapping> ``` 8. 配置SpringMVC 在src/main/resources目录下创建一个spring-mvc.xml文件,用于配置SpringMVC的相关属性和组件。例如: ``` <mvc:annotation-driven/> <context:component-scan base-package="com.example.demo.controller"/> <bean id="dataSource" class="org.apache.commons.dbcp2.BasicDataSource"> <property name="driverClassName" value="${jdbc.driverClassName}"/> <property name="url" value="${jdbc.url}"/> <property name="username" value="${jdbc.username}"/> <property name="password" value="${jdbc.password}"/> </bean> <bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean"> <property name="dataSource" ref="dataSource"/> <property name="configLocation" value="classpath:mybatis-config.xml"/> </bean> <bean id="sqlSession" class="org.mybatis.spring.SqlSessionTemplate"> <constructor-arg ref="sqlSessionFactory"/> </bean> ``` 最后,启动项目,访问http://localhost:8080/studentCourse/list即可查看学生选课信息的列表,可以通过上一页和下一页链接进行分页浏览。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

攒了一袋星辰

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值