2022年05月08日我们讲到了多表查询 同学们
目录
1.Mysql视图
创建一个视图,可以把查询结果保存起来
# 找到所有工作与艾本相同的人 create view xq_view1 as select * from emp where job=(select job from emp where ename='艾本');
然后你就会发现多了一个 view文件夹 里面是你刚创建的视图
如果视图中的数据来自一个表 改变视图中的数据原表也会跟着改变
如果来自多个表就没有影响
2.JDBC
JDBC可以将mysql和JAVA连接起来
我们要先写一个class
然后在给class所在的项目导包
package com.langsin.jdbc; import java.sql.Connection; import java.sql.DriverManager; import java.sql.ResultSet; import java.sql.Statement; public class jdbc { // 这是我们创建的类 public static void main(String[] args) throws Exception { // 1.加载驱动 新版本不需要添加了 Class.forName("com.mysql.cj.jdbc.Driver"); // 2.获取数据库连接对象 需要三个参数 username password url String username = "root"; String password = ""; // 这个是自己MYSQL的密码 String url = "jdbc:mysql://localhost:3306/e82?useUnicode=true&characterEncoding=UTF8&serverTimezone=Hongkong"; Connection connection = DriverManager.getConnection(url, username, password); // System.out.println(connection); // 如果出现java.lang.ClassNotFoundException: com.mysql.cj.jdbc.Driver // 说明没有驱动导包 // 下面就可以写SQL语句了 Statement statement = connection.createStatement(); // 建议把SQL语句写在一个字符串里 // 这样有提示 // 这样我们往数据库里加了一条数据 // String sql= "insert into products values (null ,'食物7',current_timestamp )"; // int count = statement.executeUpdate(sql); // System.out.println(count); // 这样可以读到表里的数据 String sql="select * from products;"; ResultSet resultSet = statement.executeQuery(sql); while (resultSet.next()){ System.out.println(resultSet.getInt(1)+"\t-\t"+resultSet.getString("pro_name")+"-"+resultSet.getTimestamp(3)); } } }
这样就可以在JAVA里操作MYSQL了
3.数据库连接池
据说我们频繁地连接数据库消耗的资源太多了
所以我们可以使用连接池
一次建立很多连接,连接用完了就还给连接池
首先我们要在文件的src下面建一个配置文件 名字叫druid.properties
// 然后把自己的用户名 密码 url 写进去 driverClassName=com.mysql.cj.jdbc.Driver url=jdbc:mysql://localhost:3306/e82?useSSL=false&serverTimezone=Hongkong username=XXXXXXXXXX password=XXXXXXXXXX
然后写一个类叫DruidUtils
把这些代码粘贴进去
//1.定义成员变量 DataSource private static DataSource ds; static { try { //1.加载配置文件 Properties pro = new Properties(); pro.load(DruidUtils.class.getClassLoader().getResourceAsStream("druid.properties")); //2.获取DataSource ds = DruidDataSourceFactory.createDataSource(pro); } catch (IOException e) { e.printStackTrace(); } catch (Exception e) { e.printStackTrace(); } } /** * 获取连接 */ public static Connection getConnection() throws SQLException { return ds.getConnection(); } /** * 释放资源 */ 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(); } }*/ close(null, stmt, conn); } 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(); } } } /** * 获取连接池方法 */ public static DataSource getDataSource() { return ds; }
再给当前目录导包 druid-1.1.12
把所有系统提示的需要导包的地方都导完以后 小编发现这里还报错
ds = DruidDataSourceFactory.createDataSource(pro);
导包加上这一句貌似就可以了
import com.alibaba.druid.pool.DruidDataSourceFactory;
然后在我们的测试类中 就可以这样获取连接了
public class Demo { public static void main(String[] args) throws Exception { Connection connection = DruidUtils.getConnection(); System.out.println(connection); JdbcUtils.close(null, null, connection); } }
如果获取连接成功 可以输出这个
com.mysql.cj.jdbc.ConnectionImpl@6e20b53a
4.JDBCTemplate
它是Spring框架对JDBC的封装
据说可以简化把查询结果放到对象里的过程
首先我们要导包
然后就可以用了
在用的时候我们需要之前那个连接池对象
public class JdbcTemplateDemo { public static void main(String[] args) { // 这样可以完成一个插入操作 JdbcTemplate jdbcTemplate = new JdbcTemplate(DruidUtils.getDataSource()); // 表里的参数用?代替就可以 String sql="insert into products values (null ,?,?)"; // 在sql后面给参数赋值 jdbcTemplate.update(sql,"食物10","2022-04-03 13:32:25"); } }
// 这样我们可以把1-4的产品名字全改成"食物"
String sql1="update products set pro_name=? where id<?"; jdbcTemplate.update(sql1,"食物",5);
// 这样我们可以查询到id为1 的产品信息 // 查询结果被放到一个Map集合里了 // 这个queryForMap()只能查一个产品 String sql="select * from products where id=1 "; Map<String, Object> stringObjectMap = jdbcTemplate.queryForMap(sql); System.out.println(stringObjectMap);
// 用queryForList()可以查所有的产品
String sql="select * from products;"; List<Map<String, Object>> maps = jdbcTemplate.queryForList(sql); maps.forEach(System.out::println);
JDBCTemplat还可以把查询出来的结果放到对象里去
再把对象放到List集合里去
先把对象的类写好 里面加上属性和get set方法
// 然后在测试类里这样写 String sql="select * from products"; List<Product> query = jdbcTemplate.query(sql, new BeanPropertyRowMapper<>(Product.class)); query.forEach(System.out::println);
// 这样写可以从表里拿出来一个结果 把它变成对象 String sql="select * from products where id=1"; Product product = jdbcTemplate.queryForObject(sql, new BeanPropertyRowMapper<>(Product.class)); System.out.println(product);
THE END ψ(*`ー´)ψ