JDBC基础
JDBC基础
3. JDBC
3.1. JDBC基本概念
3.1.1. 概念
- Java DataBase Connectivity:Java数据库连接,Java语言操作数据库
3.1.2. JDBC的本质
- 其实是官方(SUN公司)定义的一套操作所有关系型数据库的规则,即接口。各个数据库厂商去实现这套接口,提供数据库驱动jar包。我们可以使用这套接口(JDBC)编程,真正执行的代码是驱动jar包中的实现类
3.2. 快速入门
3.2.1. 步骤
-
导入驱动jar包
1.复制mysql-connector-java-5.1.48-bin.jar到项目的libs目录下 2.右键-->Add as Library
-
注册驱动
Class.forName("com.mysql.jdbc.Driver");
-
获取数据库连接对象:Connection
Connection connection = DriverManager.getConnection("jdbc:mysql://localhost:3306/数据库名称", "用户名称", "用户密码");
-
定义sql
String sql = "UPDATE account SET balance = 500 WHERE id = 1";
-
获取执行sql语句的对象:Statement
Statement statement = connection.createStatement();
-
执行sql,接收返回的结果
int count = statement.executeUpdate(sql);
-
处理结果
System.out.println(count);
-
释放资源
statement.close(); connection.close();
3.3. 对JDBC中各个接口和类详解
3.3.1. DriverManager
-
驱动管理对象
-
功能:
-
注册驱动:告诉我们的程序该使用哪一个数据库驱动jar
// Registers the given driver with the DriverManager. static void registerDriver(Driver driver); // 写代码使用:Class.forName("com.mysql.jdbc.Driver"); // 通过查看源码发现:在com.mysql.jdbc.Driver类中存在静态代码块: static { try { DriverManager.registerDriver(new Driver()); } catch (SQLException var1) { throw new RuntimeException("Can't register driver!"); } } // 注意:MySQL5之后的驱动jar包可以省略注册驱动的步骤
-
获取数据库连接:
// Attempts to establish a connection to the given database URL. static Connection getConnection(String url, String user, String password); // 参数 /* url:指定连接的路径(语法:jdbc:mysql://ip地址(域名):端口号/数据库名称) 例子:jdbc:mysql://localhost:3306/db1 细节:如果连接的是本机mysql服务器,并且mysql服务默认端口是3306,则url可以简写为:jdbc:mysql:///数据库名称 user:用户名 password:密码 */
-
3.3.2. Connection
-
数据库连接对象
-
功能:
-
获取执行sql的对象:
// Creates a Statement object for sending SQL statements to the database. Statement createStatement(); // Creates a PreparedStatement object for sending parameterized SQL statements to the database. PreparedStatement prepareStatement(String sql);
-
管理事务:
// 开启事务 // Sets this connection's auto-commit mode to the given state. // 调用该方法,设置参数为false,即开启事务 void setAutoCommit(boolean autoCommit); // 提交事务 // Makes all changes made since the previous commit/rollback permanent and releases any database locks currently held by this Connection object. void commit(); // 回滚事务 // Undoes all changes made in the current transaction and releases any database locks currently held by this Connection object. void rollback();
-
3.3.3. Statement
-
执行sql的对象
-
功能:
-
执行sql
// Executes the given SQL statement, which may return multiple results. // 可以执行任意的sql语句【了解】 boolean execute(String sql); // Executes the given SQL statement, which may be an INSERT, UPDATE, or DELETE statement or an SQL statement that returns nothing, such as an SQL DDL statement. // 执行DML(insert、update、delete)语句、DDL(create、drop、alter)语句 // 返回值:影响的行数,可以通过这个影响的行数判断DML是否执行成功:返回值>0的则执行成功,反之则失败 int executeUpdate(String sql); // Executes the given SQL statement, which returns a single ResultSet object. // 执行DQL(select)语句 ResultSet executeQuery(String sql);
-
练习
-
添加一条记录
public class JDBCInsert { public static void main(String[] args) { Statement statement = null; Connection connection = null; try { // 1.注册驱动 Class.forName("com.mysql.jdbc.Driver"); // 2.定义sql String sql = "INSERT INTO account VALUES(null, '王五', 3000)"; // 3.获取Connection对象 connection = DriverManager.getConnection("jdbc:mysql://localhost:3306/db1", "root", "xiaoer"); // 4.获取执行sql的对象:Statement statement = connection.createStatement(); // 5.执行sql // 返回结果为影响的行数 int count = statement.executeUpdate(sql); // 6.处理结果 System.out.println(count); if (count > 0) { System.out.println("添加成功!"); } else { System.out.println("添加失败!"); } } catch (ClassNotFoundException e) { e.printStackTrace(); } catch (SQLException e) { e.printStackTrace(); } finally { // statement.close(); // 7.释放资源 // 避免空指针异常 if (statement != null) { try { statement.close(); } catch (SQLException e) { e.printStackTrace(); } } if (connection != null) { try { connection.close(); } catch (SQLException e) { e.printStackTrace(); } } } } }
-
修改记录
public class JDBCUpdate { public static void main(String[] args) { Statement statement = null; Connection connection = null; try { // 1.注册驱动 Class.forName("com.mysql.jdbc.Driver"); // 2.获取连接对象 connection = DriverManager.getConnection("jdbc:mysql://localhost:3306/db1", "root", "xiaoer"); // 3.定义sql String sql = "UPDATE account SET balance = 1500 WHERE id = 3"; // 4.获取执行sql的对象 statement = connection.createStatement(); // 5.执行sql int count = statement.executeUpdate(sql); // 6.处理结果 System.out.println(count); if (count > 0) { System.out.println("修改成功!"); } else { System.out.println("修改失败!"); } } catch (ClassNotFoundException e) { e.printStackTrace(); } catch (SQLException e) { e.printStackTrace(); } finally { // 7.释放资源 if (statement != null) { try { statement.close(); } catch (SQLException e) { e.printStackTrace(); } } if (connection != null) { try { connection.close(); } catch (SQLException e) { e.printStackTrace(); } } } } }
-
删除一条记录
public class JDBCDelete { public static void main(String[] args) { Statement statement = null; Connection connection = null; try { // 1.注册驱动 Class.forName("com.mysql.jdbc.Driver"); // 2.获取连接对象 connection = DriverManager.getConnection("jdbc:mysql:///db1", "root", "xiaoer"); // 3.定义sql String sql = "DELETE FROM account WHERE id = 3"; // 4.获取执行sql对象:Statement statement = connection.createStatement(); // 5.执行sql int count = statement.executeUpdate(sql); // 6.结果处理 System.out.println(count); if (count > 0) { System.out.println("删除成功!"); } else { System.out.println("删除失败!"); } } catch (ClassNotFoundException e) { e.printStackTrace(); } catch (SQLException e) { e.printStackTrace(); } finally { // 7.释放资源 if (statement != null) { try { statement.close(); } catch (SQLException e) { e.printStackTrace(); } } if (connection != null) { try { connection.close(); } catch (SQLException e) { e.printStackTrace(); } } } } }
-
-
3.3.4. ResultSet
-
结果集对象,封装查询结果
// Moves the cursor forward one row from its current position. // 游标向下移动一行,判断当前行是否是最后一行末尾(是否有数据),如果是则返回false,如果不是则返回true boolean next(); // 获取数据 // Xxx代表数据类型 // 参数: // int:代表列的编号,从1开始 如:getString(1); // String:代表列的名称 如:getString("balance"); Xxx getXxx(参数); int getInt(参数); String getString(参数);
使用步骤: 1.游标向下移动一行 2.判断是否有数据 3.获取数据 while (resultSet.next()) { // 获取数据 int id = resultSet.getInt(1); String name = resultSet.getString("name"); double balance = resultSet.getDouble(3); System.out.println(id + "---" + name + "---" + balance); }
-
练习:
-
定义一个方法,查询emp表的数据将其封装成对象,然后装载集合,返回。
- 定义一个实体类:Emp
- 定义一个方法:
public Lish<类名> findAll(){}
- 实现方法:
SELECT * FROM 表名;
import java.util.Date; /** * 封装emp表数据的JavaBean * * @author xiao儿 * @date 2019/10/9 13:01 */ public class Emp { private int id; private String name; private String gender; private double salary; private Date join_date; private int dept_id; public int getId() { return id; } public void setId(int id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } public String getGender() { return gender; } public void setGender(String gender) { this.gender = gender; } public double getSalary() { return salary; } public void setSalary(double salary) { this.salary = salary; } public Date getJoin_date() { return join_date; } public void setJoin_date(Date join_date) { this.join_date = join_date; } public int getDept_id() { return dept_id; } public void setDept_id(int dept_id) { this.dept_id = dept_id; } @Override public String toString() { return "Emp{" + "id=" + id + ", name='" + name + '\'' + ", gender=" + gender + ", salary=" + salary + ", join_date=" + join_date + ", dept_id=" + dept_id + '}'; } }
import java.sql.*; import java.util.ArrayList; import java.util.List; /** * 定义一个方法,查询emp表的数据将其封装为对象,然后装载集合,返回。 * * @author xiao儿 * @date 2019/10/9 13:21 */ public class JDBCDemo1 { public static void main(String[] args) { List<Emp> list = new JDBCDemo1().findAll(); System.out.println(list); System.out.println(list.size()); } /** * 查询所有Emp对象 * * @return */ public List<Emp> findAll() { Connection connection = null; Statement statement = null; ResultSet resultSet = null; List<Emp> list = null; try { // 1.注册驱动 Class.forName("com.mysql.jdbc.Driver"); // 2.获取连接 connection = DriverManager.getConnection("jdbc:mysql://localhost:3306/db1", "root", "xiaoer"); // 3.定义sql String sql = "SELECT * FROM emp"; // 4.获取执行sql的对象 statement = connection.createStatement(); // 5.执行sql resultSet = statement.executeQuery(sql); // 6.遍历结果集,封装对象,装载集合 Emp emp = null; list = new ArrayList(); while (resultSet.next()) { // 获取数据 int id = resultSet.getInt(1); String name = resultSet.getString(2); String gender = resultSet.getString(3); double salary = resultSet.getDouble("salary"); Date join_date = resultSet.getDate(5); int dept_id = resultSet.getInt("dept_id"); // 创建emp对象,并赋值 emp = new Emp(); emp.setId(id); emp.setName(name); emp.setGender(gender); emp.setSalary(salary); emp.setJoin_date(join_date); emp.setDept_id(dept_id); // 装载集合 list.add(emp); } } catch (ClassNotFoundException e) { e.printStackTrace(); } catch (SQLException e) { e.printStackTrace(); } finally { // 7.释放资源 // if (resultSet != null) { // try { // resultSet.close(); // } catch (SQLException e) { // e.printStackTrace(); // } // } // if (statement != null) { // try { // statement.close(); // } catch (SQLException e) { // e.printStackTrace(); // } // } // if (connection != null) { // try { // connection.close(); // } catch (SQLException e) { // e.printStackTrace(); // } // } try { if (resultSet != null) { resultSet.close(); } if (statement != null) { statement.close(); } if (connection != null) { connection.close(); } } catch (SQLException e) { e.printStackTrace(); } } return list; } }
-
3.3.5. PreparedStatement
-
执行sql的对象
-
SQL注入问题:在拼接sql时,有一些sql的特殊关键字参与字符串的拼接。会造成安全问题。
- 输入用户名随便,输入密码:
a' or 'a' = 'a
- sql:
SELECT * FROM user WHERE username = '随便的用户名' and password = 'a' or 'a' = 'a'
- 输入用户名随便,输入密码:
-
解决SQL注入问题:使用
PreparedStatement
对象来解决 -
预编译的SQL:参数使用
?
作为占位符 -
步骤:
-
导入驱动jar包
1.复制mysql-connector-java-5.1.48-bin.jar到项目的libs目录下 2.右键-->Add as Library
-
注册驱动
Class.forName("com.mysql.jdbc.Driver");
-
获取数据库连接对象:Connection
Connection connection = DriverManager.getConnection("jdbc:mysql://localhost:3306/数据库名称", "用户名称", "用户密码");
-
定义sql:sql的参数的使用?作为占位符
String sql = "UPDATE account SET balance = 500 WHERE id = ?";
-
获取执行sql语句的对象:PreparedStatement
PreparedStatement preparedStatement = connection.prepareStatement(sql);
-
给?赋值
preparedStatement.setXxx(参数1, 参数2); // 参数1:?的位置编号,从1开始 // 餐宿2:?的值
-
执行sql,接收返回的结果
int count = preparedStatement.executeUpdate();
-
处理结果
System.out.println(count);
-
释放资源
statement.close(); connection.close();
-
-
注意:后期都会采用PreparedStatement来完成增删改查的所有操作
- 可以防止SQL注入
- 效率更高
3.4. 抽取JDBC工具类(JDBCUtils)
-
目的:简化书写
-
分析:
- 注册驱动
- 抽取一个方法获取连接对象
- 需求:不想传递参数(麻烦),还需要保证工具类的通用性。
- 解决:配置文件
- 抽取一个方法释放资源
import java.io.FileReader; import java.io.IOException; import java.net.URL; import java.sql.*; import java.util.Properties; /** * JDBC工具类 * * @author xiao儿 * @date 2019/10/9 16:22 */ public class JDBCUtils { private static String url; private static String user; private static String password; private static String driver; /** * 文件的读取,只需要读取一次即可拿到这些值。使用静态代码块 */ static { // 读取资源文件,获取值 try { // 1.Properties集合类 Properties properties = new Properties(); // 获取src路径下的文件的方式-->ClassLoader:类加载器 ClassLoader classLoader = JDBCUtils.class.getClassLoader(); URL resource = classLoader.getResource("jdbc.properties"); String path = resource.getPath(); // 2.加载文件 properties.load(new FileReader(path)); // 3.获取数据,赋值 url = properties.getProperty("url"); user = properties.getProperty("user"); password = properties.getProperty("password"); driver = properties.getProperty("driver"); // 4.注册驱动 Class.forName(driver); } catch (IOException e) { e.printStackTrace(); } catch (ClassNotFoundException e) { e.printStackTrace(); } } /** * 获取连接 * * @return 连接对象 */ public static Connection getConnection() throws SQLException { return DriverManager.getConnection(url, user, password); } /** * 释放资源 * * @param statement * @param connection */ public static void close(Statement statement, Connection connection) { if (statement != null) { try { statement.close(); } catch (SQLException e) { e.printStackTrace(); } } if (connection != null) { try { connection.close(); } catch (SQLException e) { e.printStackTrace(); } } } /** * 释放资源 * * @param resultSet * @param statement * @param connection */ public static void close(ResultSet resultSet, Statement statement, Connection connection) { if (resultSet != null) { try { resultSet.close(); } catch (SQLException e) { e.printStackTrace(); } } if (statement != null) { try { statement.close(); } catch (SQLException e) { e.printStackTrace(); } } if (connection != null) { try { connection.close(); } catch (SQLException e) { e.printStackTrace(); } } } }
-
练习:
-
需求:
-
通过键盘录入用户名和密码
-
判断用户是否登录成功
-- 如果这个sql有查询结果则成功,反之则失败 SELECT * FROM user WHERE username = "" and password = "";
-
-
步骤:
-
创建数据库表:user
CREATE TABLE user ( id INT PRIMARY KEY AUTO_INCREMENT, username VARCHAR(32), password VARCHAR(32) ); INSERT INTO user VALUES(NULL,'zhangsan','123'); INSERT INTO user VALUES(NULL,'lisi','234'); SELECT * FROM user;
-
Java测试类
public class JDBCDemo { public static void main(String[] args) { // 1.键盘录入,接收用户名和密码 Scanner sc = new Scanner(System.in); System.out.println("请输入用户名:"); String username = sc.nextLine(); System.out.println("请输入密码:"); String password = sc.nextLine(); // 2.调用方法 boolean flag = new JDBCDemo().login(username, password); // 3.判断结果,输出不同语句 if (flag) { System.out.println("登录成功!"); } else { System.out.println("用户名或密码错误!"); } } /** * 登录方法 * * @param username 用户名 * @param password 密码 * @return 登录的结果 */ public boolean login(String username, String password) { if (username == null || password == null) { return false; } Connection connection = null; PreparedStatement preparedStatement = null; ResultSet resultSet = null; // 连接数据库来判断是否登录成功 try { // 1.获取连接 connection = JDBCUtils.getConnection(); // 2.定义sql String sql = "SELECT * FROM user WHERE username = ? and password = ?"; // 3.获取执行sql的对象:PreparedStatement preparedStatement = connection.prepareStatement(sql); // 4.给?赋值 preparedStatement.setString(1, username); preparedStatement.setString(2, password); // 5.执行sql语句,不需要传递sql resultSet = preparedStatement.executeQuery(); // 6.判断 /*if (resultSet.next()) {// 如果有下一行,则返回true return true; } else { return false; }*/ return resultSet.next();// 如果有下一行,则返回true } catch (SQLException e) { e.printStackTrace(); } finally { JDBCUtils.close(resultSet, preparedStatement, connection); } return false; } }
-
-
3.5. JDBC控制事务
3.5.1. 事务
- 一个包含多个步骤的业务操作。如果这个业务操作被事务管理,则这多个步骤要么同时成功,要么同时失败。
3.5.2. 操作
- 开启事务
- 提交事务
- 回滚事务
3.5.3. 使用Connection对象来管理实务
- 开启事务:setAutoCommit(boolean autoCommit):调用该方法设置参数为false,即开启事务。
- 在执行sql之前开启事务
- 提交事务:commit();
- 当所有sql都执行完提交事务
- 回滚事务:rollback();
- 在catch中回滚事务
3.6. 数据库连接池
3.6.1. 概念
- 其实就是一个容器(集合),存放数据库连接的容器。
- 当系统初始化好之后,容器被创建,容器中会申请一些连接对象,当用户来访问数据库时,从容器中获取连接对象,用户访问完之后,会将连接对象归还给容器。
3.6.2. 好处
- 节约资源
- 用户访问高效
3.6.3. 实现
-
标准接口:DataSource–>javax.sql包下的
-
方法:
// 获取连接 getConnection(); // 归还连接,如果连接对象Connection是从连接池中获取的,那么调用Connection.close()方法,则不会再关闭连接了。而是归还连接。 conn.close();
-
-
一般我们不去实现它,有数据库厂商来实现
- C3P0:数据库连接池技术
- Druid:数据库连接池实现技术,由阿里巴巴提供的
3.6.4. C3P0
-
步骤:
- 导入jar包(两个):c3p0-0.9.5.2.jar;mchange-commons-java-0.2.11.jar
- 不要忘记导入数据库驱动jar包
- 定义配置文件:
- 名称
c3p0.properties
或者c3p0-config.xml
- 路径:直接将文件放在src目录下即可
- 名称
- 创建核心对象:数据库连接池对象:
ComboPooledDataSource
- 获取连接:
getConnection()
// 1.创建数据库连接池对象 DataSource ds = new ComboPooledDataSource(); // 2.获取连接对象 Connection conn = ds.getConnection(); // 3.打印 System.out.println(conn);
- 导入jar包(两个):c3p0-0.9.5.2.jar;mchange-commons-java-0.2.11.jar
3.6.5. Druid
-
步骤:
-
导入jar包:druid-1.0.15.jar
- 不要忘记导入数据库驱动jar包
-
定义配置文件:
- 是properties形式的
- 可以叫任意名称,可以放在任意目录下
-
加载配置文件:
Properties pro = new Properties(); InputStream is = DruidDemo.class.getClassLoader().getResourceAsStream("druid.properties"); pro.load(is);
-
获取数据库连接池对象:通过工厂类来获取:
DruidDataSourceFactory
-
获取连接:
getConnection()
// 1.导入jar包 // 2.定义配置文件 // 3.加载配置文件 Properties pro = new Properties(); InputStream is = DruidDemo.class.getClassLoader().getResourceAsStream("druid.properties"); pro.load(is); // 4.获取连接池对象 DataSource ds = DruidDataSourceFactory.createDataSource(pro); // 5.获取连接 Connection conn = ds.getConnection(); System.out.println(conn);
-
-
定义工具类
-
定义一个类:JDBCUtils
-
提供静态代码块加载配置文件,初始化连接池对象
-
提供方法:
- 获取连接方法:通过数据库连接池来获取连接
- 释放资源
- 获取连接池的方法
/** * Druid连接池的工具类 * * @author xiao儿 * @date 2019/10/10 20:14 */ public class JDBCUtils { // 1.定义一个成员变量 private static DataSource ds; static { try { // 1.加载配置文件 Properties pro = new Properties(); pro.load(JDBCUtils.class.getClassLoader().getResourceAsStream("druid.properties")); // 2.获取DataSource ds = DruidDataSourceFactory.createDataSource(pro); } catch (IOException e) { e.printStackTrace(); } catch (Exception e) { e.printStackTrace(); } } /** * 获取连接 * * @return Connection对象 * @throws SQLException */ public static Connection getConnection() throws SQLException { return ds.getConnection(); } /** * 释放资源 * * @param stmt Statement对象 * @param conn Connection对象 */ public static void close(Statement stmt, Connection conn) { if (stmt != null) { try { stmt.close(); } catch (SQLException e) { e.printStackTrace(); } } if (conn != null) { try { conn.close();// 归还连接 } catch (SQLException e) { e.printStackTrace(); } } } /** * 释放资源 * * @param rs ResultSet对象 * @param stmt Statement对象 * @param conn Connection对象 */ public static void close(ResultSet rs, Statement stmt, Connection conn) { if (rs != null) { try { rs.close(); } catch (SQLException e) { e.printStackTrace(); } } // // if (stmt != null) { // try { // stmt.close(); // } catch (SQLException e) { // e.printStackTrace(); // } // } // // if (conn != null) { // try { // conn.close();// 归还连接 // } catch (SQLException e) { // e.printStackTrace(); // } // } close(stmt, conn); } /** * 获取连接池方法 * * @return DataSource对象 */ public static DataSource getDataSource() { return ds; } }
-
3.7. Spring JDBC(JDBC Template)
-
Spring框架对JDBC的简单封装。提供了一个JDBCTemplate对象简化了JDBC的开发
-
步骤:
-
导入jar包
-
创建JDBCTemplate对象。依赖于数据源DataSource
JDBCTemplate template = new JDBCTemplate(dataSource);
-
调用JDBCTemplate方法来完成CRUD的操作
// 指定DML语句,执行增、删、改语句 update(); // 查询结果将结果封装为map集合 // 将列名作为key,将作为value,将这条记录封装成一个map集合,而且这个方法查询的结果集长度只能是1 queryForMap(); // 查询结果将结果封装为list集合 // 将每一条记录封装为一个Map集合,再将Map集合装载到List集合中 queryForList(); // 查询结果,将结果封装为JavaBean对象 // query的参数:RowMapper // 一般使用BeanPropertyRowMapper实现类。可以完成数据到JavaBean的自动封装 // new BeanPropertyRowMapper<类型>(类型.class) query(); // 查询结果,将结果封装为对象 // 一般用于聚合函数的查询 queryForObject();
// 1.导入jar包 // 2.创建JDBCTemplate对象 JdbcTemplate template = new JdbcTemplate(JDBCUtils.getDataSource()); // 3.调用方法 String sql = "UPDATE account SET balance = 5000 WHERE id = ?"; int count = template.update(sql, 3); System.out.println(count);
-
-
练习:
-
需求:
// 1.获取JDBCTemplate对象 private JdbcTemplate template = new JdbcTemplate(JDBCUtils.getDataSource());
-
修改1号数据的salary为10000
/** * 1.修改1号数据的salary为10000 */ @Test public void test1() { // 2.定义sql String sql = "UPDATE emp SET salary = 10000 WHERE id = 1"; // 3.执行sql int count = template.update(sql); System.out.println(count); }
-
添加一条记录
/** * 2.添加一条记录 */ @Test public void test2() { // 2.定义sql String sql = "INSERT INTO emp(id, name, dept_id) VALUES(?, ?, ?)"; // 3.执行sql int count = template.update(sql, 1010, "郭靖", 3); System.out.println(count); }
-
删除一条记录
/** * 3.删除一条记录 */ @Test public void test3() { // 2.定义sql String sql = "DELETE FROM emp WHERE id = ?"; // 3.执行sql int count = template.update(sql, 1010); System.out.println(count); }
-
查询id为1记录,将其封装为Map集合
/** * 4.查询id为1的记录,将其封装为Map集合 * 注意:这个方法查询的结果集长度只能是1 */ @Test public void test4() { // 2.定义sql String sql = "SELECT * FROM emp WHERE id = ?"; // 3.执行sql Map<String, Object> map = template.queryForMap(sql, 1); System.out.println(map); // {id=1, name=孙悟空, gender=男, salary=10000.0, join_date=2013-02-24, dept_id=1} }
-
查询所有的记录,将其封装为List集合
/** * 5.查询所有的记录,将其封装为List集合 */ @Test public void test5() { // 2.定义sql String sql = "SELECT * FROM emp"; // 3.执行sql List<Map<String, Object>> list = template.queryForList(sql); for (Map<String, Object> stringObjectMap : list) { System.out.println(stringObjectMap); } }
-
查询所有的记录,将其封装为Emp对象的List集合
/** * 6.查询所有的记录,将其封装为Emp对象的List集合 */ @Test public void test6() { // 2.定义sql String sql = "SELECT * FROM emp"; // 3.执行sql List<Emp> list = template.query(sql, new RowMapper<Emp>() { @Override public Emp mapRow(ResultSet rs, int rowNum) throws SQLException { Emp emp = new Emp(); int id = rs.getInt("id"); String name = rs.getString("name"); String gender = rs.getString("gender"); double salary = rs.getDouble("salary"); Date join_date = rs.getDate(5); int dept_id = rs.getInt(6); emp.setId(id); emp.setName(name); emp.setGender(gender); emp.setSalary(salary); emp.setJoin_date(join_date); emp.setDept_id(dept_id); return emp; } }); // 遍历list集合 for (Emp emp : list) { System.out.println(emp); } }
/** * 6.查询所有的记录,将其封装为Emp对象的List集合 */ @Test public void test6() { // 2.定义sql String sql = "SELECT * FROM emp"; // 3.执行sql List<Emp> list = template.query(sql, new BeanPropertyRowMapper<Emp>(Emp.class)); for (Emp emp : list) { System.out.println(emp); } }
-
查询中的记录数
/** * 7.查询总记录数 */ @Test public void test7() { // 2.定义sql String sql = "SELECT COUNT(id) FROM emp"; // 3.执行sql Long total = template.queryForObject(sql, Long.class); System.out.println(total); }
-
-