Java+MySQL综合运用笔记

一.Java连接使用mysql的5个思路过程

首先导入JDBC驱动jar包放到lib文件夹里面。

1.加载驱动方法

①注册驱动:DriverManager.registerDriver(new com.mysql.jdbc.Driver());

②反射静态代码段驱动:Class.forName(“com.mysql.jdbc.Driver”);

2.建立连接

①数据库路径:String url=“jdbc:mysql://localhost:3306/mydb1”;其中3306是数据库端口号,mysql1是数据库名。

②用户名:String user=“root”;

③用户密码:String pwd=“hry110”;

Connection conn = DriverManager.getConnection(url,user,pwd);

技巧1:可以把驱动的数据库,数据库路径,用户名和密码放在source文件中的db.properties文本中

driverName = "com.mysql.jdbc.Driver";
url = "jdbc:mysql://localhost:3306/mydb1";
user = "root";
password = "hry110";

技巧:2:1和2可以封装成一个返回值类型为Connection的getConnection()方法专门用于连接。

优化方法:

​ ①在source文件夹下db.properties文本中配置数据库信息

driverName = "com.mysql.jdbc.Driver";
databasePath = "jdbc:mysql://localhost:3306/mydb1";
user = "root";
password = "hry110";

​ ②封装类

/*** 工具类:负责连接数据库、获取Statement对象、资源释放* @author luds*/
public class JDBCUtil {private JDBCUtil() {}private static Properties pro = new Properties();/*** 驱动的注册只需要注册一次即可,所以可以将注册驱动代码写到静态代码段中。*/static {// pro.load(new BufferedReader(new FileReader("db.properties")));// 使用ClassLoader来加载一个Properties里面的数据// 1. 创建ClassLoader对象ClassLoader loader = Thread.currentThread().getContextClassLoader();// 2. 获取用于操作某个文件的字节流对象InputStream in = loader.getResourceAsStream("db.properties");// 3. 加载数据try {pro.load(in);} catch (IOException e1) {e1.printStackTrace();}try {Class.forName(pro.getProperty("driverName"));} catch (ClassNotFoundException e) {e.printStackTrace();}}/*** 注册驱动、建立与数据库的连接* @return*/public static Connection getConnection() {try {// 2. 获取连接Connection conn = DriverManager.getConnection(pro.getProperty("databasePath"), pro.getProperty("user"), pro.getProperty("password"));return conn;} catch (Exception e) {e.printStackTrace();}throw new RuntimeException("数据库连接失败");}/*** 资源释放* @param conn* @param st* @param set*/public static void release(Connection conn, Statement st, ResultSet set) {if (set != null) {try {set.close();} catch (SQLException e) {e.printStackTrace();}}if (st != null) {try {st.close();} catch (SQLException e) {e.printStackTrace();}}if (conn != null) {try {conn.close();} catch (SQLException e) {e.printStackTrace();}}}}

3.Statement执行语句

⑴Statement st=conn.createStatement();

4.执行SQL语句

PreparedStatement 预编译:通过PreparedStatement 预编译类语句实现增删改查
Batch批处理:通过Batch实现增删改查。 batch进行创建表待续

❶增:

①基本版增

⑴sql插入语句:String sql = “insert into t_teacher values (6, ‘张无忌’,‘男‘)”;

String sql = String.format(“insert into t_teacher values(%d, %s, %s)”, st.getAge(),st.getName(), , st.getGender());用于自定义数据模型类。

⑵执行插入:int rows=st.executeUpdate(sql);//返回值为int

⑶输出结果:sout(rows);

②PreparedStatement增

⑴sql插入语句:String sql = “insert into t_teacher values (?,?,?)”;其中?是占位符。

⑵执行插入:PreparedStatement ps = conn.prepareStatement(sql);

ps.setInt(1, 10);
ps.setString(2, "张无忌");
ps.setString(3, "男");

⑶输出结果:int rows = ps.executeUpdate(); sout(rows);

③Batch增

⑴关闭自动提交:conn.setAutoCommit(false);

⑵批量添加:

st.addBatch("insert into t_teacher values (3, '郭靖', '男')");
st.addBatch("insert into t_teacher values (4, '黄蓉', '女')");
st.addBatch("insert into t_teacher values (5, '郭襄', '女')");
st.addBatch("insert into t_teacher values (6, '小龙女', '女')");
st.addBatch("insert into t_teacher values (7, '韦小宝', '男')");

⑶批量执行:int[] rows = st.executeBatch();

⑷批量输出for(int r : rows) {System.out.println®;}

⑸任务提交:conn.commit();

❷删

①基本版删除

⑴sql删除语句:String sql = “delete from t_teacher where sid=1;”;

​ String sql = "delete from t_teacher where sid =+id+; " ;用于自定义数据模型类。

⑵执行删除:int rows=st.executeUpdate(sql);//返回值为int

⑶输出结果:sout(rows);

③Batch删除:

⑴关闭自动提交:conn.setAutoCommit(false);

⑵批量删除:

st.addBatch("delete from t_teacher where tname = '小龙女'");

⑶批量执行:int[] rows = st.executeBatch();

⑷批量输出for(int r : rows) {System.out.println®;}

⑸任务提交:conn.commit();

❸改

①基本版改:

①基本版删除

⑴sql修改语句: String sql = String.format(“update t_student set sname = %s, sage = %d, sgender = %s, score_java = %d, score_mysql = %d, score_hadoop = %d, score_spark = %d, groupid = %d, cid = %d where sid = %s”, st.getName(), st.getAge(), st.getGender(), st.getScoreJava(), st.getScoreMysql(), st.getScoreHadoop(), st.getScoreSpark(), st.getGroupID(), st.getClassID(), id);用于自定义数据模型类。

⑵执行修改:int rows=st.executeUpdate(sql);//返回值为int

⑶输出结果:sout(rows);

③Batch修改:

⑴关闭自动提交:conn.setAutoCommit(false);

⑵批量修改:

st.addBatch("update t_teacher set tname = '杨康' where id = 7");

⑶批量执行:int[] rows = st.executeBatch();

⑷批量输出for(int r : rows) {System.out.println®;}

⑸任务提交:conn.commit();

❹查

①基本版查:

⑴String sql=“select * from t_student”;

⑵ResultSet set=st.executeQuery(sql);

⑶循环一行一行获取数据:

while (set.next()) {int id = set.getInt(1);String name = set.getString("sname");String gender = set.getString(3);int age = set.getInt("sage");int score = set.getInt("score");sout(String.format("|%d|%s|%s|%d|%d|", id, name, gender, age, score));}

③Batch查:

⑴关闭自动提交:conn.setAutoCommit(false);

⑵批量修改:

st.addBatch("select * from t_teacher");

⑶批量执行:int[] rows = st.executeBatch();

⑷批量输出for(int r : rows) {System.out.println®;}

⑸任务提交:conn.commit();

5.释放资源

conn.close() st.close() set.close()

技巧:可以用方法封装好Connection,Statement和ResultSet ,前两个用于增删改查,后一个仅仅用于查。

二.连接池

   对自定义的JDBCUti类进行再次封装。

注意啊。这里为什么不配置数据库文件,是因为线程池实现是JDBCUtil自定义的类,在db.properties已经配置好了

1.作用:实现一个Connection对象的复用,减少性能损耗和时间损耗,其实就是对JDbc中的JDBCUtil类再进行封装数据库连接数据库资源释放

2.思路:设计pool类实现连接的获取和连接的归还的两个方法。

①属性:集合,用来存放Connection对象

(1)连接池容量:private static int capcity = 10;

(2)复用池:private static LinkedList list = new LinkedList<>();作用是获取连接和归还连接。

(3)使用静态代码段默认填充复用池连接

static {// 默认填充复用池中的连接,手动定义一个连接池的容量for (int i = 0; i < capcity; i++) {// 存放Connection对象Connection conn = JDBCUtil.getConnection();list.add(conn);}}

②方法:获取连接、归还连接

(1)获取连接

public static Connection getConnection() {// 1. 判断复用池中有没有Connection对象if (list.size() > 0) {// 2. 说明此时连接池中是有Connection对象// 3. 从池子中取出一个对象返回即可return list.removeFirst();}// 如果此时池子中没有连接对象// 理论上需要做一个等待时间:在等待时间内,如果有Connection归还,可以直接获取。如果等待超时,则直接创建一个新的Connection对象返回// 不去模拟等待时长,直接返回一个新的return JDBCUtil.getConnection();}

(2)归还连接

public static void close(Connection conn) {// 1. 判断池子的容量是不是达到了最大值if (list.size() >= capcity) {// 说明池子已经存满了,这个conn直接释放即可,不用添加到池子中try {conn.close();} catch (SQLException e) {e.printStackTrace();}}else {// 说明复用池还不满,此时将归还的conn添加到集合中即可list.add(conn);}}

三.DBCP

1.作用:实现一个Connection对象的复用,减少性能损耗和时间损耗,其实就是对JDbc中的JDBCUtil类再进行封装数据库连接数据库资源释放与连接池不同的是,连接池是用集合存Connection对象,而DBCP是用DataSource 来存取Connection对象。

2.实现思路:设计类DBCPUtil 实现连接的获取和连接的归还的两个方法,必须先导入jdbc,dbcp和pool三个jar包。

(1)在source文件夹配置数据库dbcp.properties文件:

driverClass=com.mysql.jdbc.Driver
url=jdbc:mysql://localhost:3306/mydb1
username=root
password=hry110
maxActive=20

(2)DataSource接口属性:private static DataSource ds:存连接对象容量。

(3)使用静态代码段默认填充连接工厂

static {Properties p = new Properties();try {// 1. 读取properties里面的资源    p.load(Thread.currentThread().getContextClassLoader().getResourceAsStream("dbcp.properties"));//特别注意需要配置数据库文本信息,这里我配置在后面。// 2. 获取连接池对象// BasicDataSourceFactory:用来获取一个DataSource对象的工厂ds = BasicDataSourceFactory.createDataSource(p);} catch (Exception e) {e.printStackTrace();}}

4.方法:获取连接和释放资源 注意哦:可以有五个释放资源方法,一到三形参五个

(1)获取连接方法

public static Connection getConnection() {try {return ds.getConnection();} catch (SQLException e) {e.printStackTrace();}throw new RuntimeException("获取连接失败");}

(2)释放连接方法三个

1.Connection连接的释放。

public static void close(Connection conn) {if (conn != null) {try {conn.close();} catch (SQLException e) {e.printStackTrace();}}}

2.释放Statement 资源

public static void close(Statement st) {if (st != null) {try {st.close();} catch (SQLException e) {e.printStackTrace();}}}

3.释放ResultSet 资源

public static void close(ResultSet set) {if (set != null) {try {set.close();} catch (SQLException e) {e.printStackTrace();}}}

注意啊Apache:BasicDataSource 实例化对象ds,需要导入jdbc,DBCP和pool的jar包,需对Connection,Statement,ResultSet资源释放。

①实例化BasicDataSource ds = new BasicDataSource();

②设置驱动:ds.setDriverClassName(“com.mysql.jdbc.Driver”);

③设置数据库的路径:ds.setUrl(“jdbc:mysql://localhost:3306/mydb1”);

④设置用户名:ds.setUsername(“root”);

⑤设置密码:ds.setPassword(“hry110”);

⑥设置最大连接数:ds.setMaxActive(20);

⑦获取连接:ds.getConnection();

四.C3P0

比较特殊不需要手动配置驱动,所有数据库配置信息都放在c3p0-config,xml中。

​ 注意:是一个xml文件:c3p0-config.xml ,而且这个文件需要放到source下面

1.作用:对数据库连接对象Connection和资源释放进行封装。

2.使用思路:设计类C3P0Utils实现连接的获取和连接的释放。

①首先导入jar包:jdbc.jar和c3p0.jar。

②在source文件夹配置数据库c3p0-config,xml文件:

<c3p0-config><default-config><property name="driverClass">com.mysql.jdbc.Driver</property><property name="jdbcUrl">jdbc:mysql://localhost:3306/mydb1</property><property name="user">root</property><property name="password">hry110</property><property name="initialPoolSize">10</property></default-config>
</c3p0-config>

注意数据库的配置还可以使用 ComboPooledDataSource cpds=new ComboPooledDataSource();

​ cpsd.setDriveClass(“com.mysql.jdbc.Driver”) ; 加载驱动。

​ cpsd.setJdbcUrl(”jdbc:mysql://localhost:3306/mydb1“) ; 获取数据库路径

​ cpsd.setUser(“root”); 设置用户名

​ cpsd.setPassword(“hry110”); 设置用户密码

​ cpsd.setInitialPoolSize(10); 设置初始化的连接数量====》接下来就是获取连接,statement语句了。

②实例化对象:ComboPooledDataSource ds = new ComboPooledDataSource();

②实例化对象:ComboPooledDataSource ds = new ComboPooledDataSource();

③获取连接:Connection conn = ds.getConnection();

④statement语句:Statement st = conn.createStatement();

⑤接下来就是sql语句,执行statement增删改查语句,最后资源释放。

五.Druid

1.作用:对connection对象连接和释放。

2.使用思路: 实现连接的获取和资源的释放。

①导jar包:jdbc.jar和druid.jar包。

②实例化对象:DruidDataSource ds = new DruidDataSource();

③设置驱动:ds.setDriverClassName(“com.mysql.jdbc.Driver”);

④设置数据库路径:ds.setUrl(“jdbc:mysql://localhost:3306/mydb1”);

⑤设置用户名:ds.setUsername(“root”);

⑥设置密码:ds.setPassword(“hry110”);

⑦获取连接:ds.setPassword(“123456”);

六.DBUtils

 比较特殊不需要手动配置驱动,所有数据库配置信息都放在c3p0-config,xml中。

1.作用:对connection对象连接和释放。

2.使用思路: 实现连接的获取和资源的释放。

①导入jar包:jdbc.jar,dbutils.jar和c3p0.jar包。

②在source文件夹配置数据库c3p0-config.xml文件:

<c3p0-config><default-config><property name="driverClass">com.mysql.jdbc.Driver</property><property name="jdbcUrl">jdbc:mysql://localhost:3306/mydb1</property><property name="user">root</property><property name="password">123456</property><property name="initialPoolSize">10</property></default-config>
</c3p0-config>

③C3P0获取数据库资源:

class C3P0Utils {private static ComboPooledDataSource ds = new ComboPooledDataSource();/*** 获取一个DataSource连接池* @return*/public static DataSource getDataSource() {return ds;}
}

④实例化QueryRunner runner = new QueryRunner(C3P0Utils.getDataSource());

⑤执行增删改:

​ (1)增:

int rows = runner.update("insert into t_test values(1001, 'Uncle Wang')");
System.out.println(rows);

​ (2)删:

​ (3)改:

rows = runner.update("insert into t_test values(?,?)", 1002, "Uncle Li");
System.out.println(rows);

⑥执行查询:

​ (1)建立一个User类实现对数据库中数据进行getter和setter,重写toSTring()和有参构造方法。

​ (2)查一行:BeanHandler,ArrayHandler,MapHandler

User user = runner.query("select * from t_users", new BeanHandler<>(User.class));
System.out.println(user);

​ (3)查多行:BeanListHandler,ArrayListHandler,MapListHandler

List<User> result = runner.query("select * from t_users", new BeanListHandler<>(User.class));
for (User u : result) {System.out.println(u);}

JAVA+MySQL综合笔记相关推荐

  1. JAVA MySQL数据库 笔记

    MySQL数据库 1. 初始MySQL 1.1 为什么学习数据库 岗位技能需求 现在的世界,得数据者得天下 网站中数据存储的地方 数据库是几乎软件体系中最核心的一个存在. 1.2 什么是数据库 数据库 ...

  2. 狂神说java~MYSQL学习笔记

    1.数据库 1.1.lue 1.2.什么是数据库 数据库 ( DataBase , 简称DB ) 概念 : 长期存放在计算机内,有组织,可共享的大量数据的集合,是一个数据 "仓库" ...

  3. MySQL学习笔记-基础篇2

    MySQL学习笔记-基础篇2 目录 MySQL学习笔记-基础篇2 8.子查询 8.1 需求分析与问题解决 8.1.1 实际问题 8.1.2 子查询的基本使用 8.1.3 子查询的分类 8.2 单行子查 ...

  4. Mysql学习笔记(基础)基础sql语句详细记录

    数据库学习(基础) // 个人网课学习记录,如果有违规等问题,请联系我删除~ mysql下载安装( 解压版安装配置 下载版安装配置 ) 需求分析:使用cmd命令来创建一个数据库,并对数据库中得一张分类 ...

  5. 可能是最全面的 Java G1学习笔记

    转载自 可能是最全面的 Java G1学习笔记 引子 最近遇到很多朋友过来咨询G1调优的问题,我自己去年有专门学过一次G1,但是当时只是看了个皮毛,因此自己也有不少问题.总体来讲,对于G1我有几个疑惑 ...

  6. MySQL学习笔记8:权限管理、数据库备份与设计

    1.前言 学习视频源自:[狂神说Java]MySQL最新教程通俗易懂 B站视频链接:https://www.bilibili.com/video/BV1NJ411J79W [狂神说Java]MySQL ...

  7. 基于JAVA幼儿园综合管理系统计算机毕业设计源码+系统+数据库+lw文档+部署

    基于JAVA幼儿园综合管理系统计算机毕业设计源码+系统+数据库+lw文档+部署 基于JAVA幼儿园综合管理系统计算机毕业设计源码+系统+数据库+lw文档+部署 本源码技术栈: 项目架构:B/S架构 开 ...

  8. 尚学堂JAVA基础学习笔记_2/2

    尚学堂JAVA基础学习笔记_2/2 文章目录 尚学堂JAVA基础学习笔记_2/2 写在前面 第10章 IO技术 1. IO入门 2. IO的API 3. 装饰流 4. IO实战 5. CommonsI ...

  9. Alibaba内部Java技术成长笔记,业界良心,程序员最爱

    前言 根据数据表明,阿里巴巴已经连续3年获评最受欢迎的中国互联网公司,实际上阿里巴巴无论在科技创新力还是社会创造价值这几个方面,都是具有一定代表里的.在行业内,很多互联网企业也将阿里作为自己的标杆,越 ...

最新文章

  1. 进阶:秒杀系统是如何设计的?
  2. PWA(Progressive Web App)入门系列:(三)PWA关键技术Manifest
  3. 一封写给2009年自己的信
  4. ubuntu chrome下载地址
  5. 学生选课管理系统(上)
  6. 2022 年“泰迪杯”数据分析技能赛——竞赛作品的自动评判(Python代码实现)
  7. matlab——度分秒与度的转换
  8. 非360手柄玩游戏视角颠倒的解决方案
  9. 直通串口线与交叉串口线的区分
  10. php doctrine datetime,关于php:Doctrine 2.1 – datetime列的默认值
  11. 中国自由软件推广先锋的自述,心潮澎湃的一往无前,一定要看!作者:洪峰...
  12. 联想拯救者wif开不了_联想拯救者 + ubuntu16.04 + WIFI设置
  13. VS2019+OpenCV4.5.1 环境配置+一劳永逸法(附下载地址)
  14. Scrapy 规则化爬虫(1)——CrawlSpider及link_extractor
  15. 京东网站顶部导航条 (练习) HTML+CSS
  16. Android7以上的手机通过fiddler抓包
  17. pandas 实例操作:美国人口案例分析
  18. m3u8 视频的解密,合并处理 通过java代码
  19. 国外知名乐队都在用的社交媒体二维码
  20. 计算机在线答疑系统,在线答疑系统的设计与实现(JSP,SQLServer)(含录像)

热门文章

  1. 华为VPLS配置案例S6720
  2. 一些投资理财渠道(仅供参考)
  3. python计算时间
  4. 7.Numpy array 分割(纵向分割/横向分割/错误分割/不等量分割/其他分割)
  5. 坐标沿着原点旋转/坐标轴旋转变换公式
  6. 《浪潮之巅》读者热评
  7. GUNS框架图片上传详解
  8. ICC Profile
  9. Java重修之路(十)面向对象之多态详解,Object类,内部类,匿名内部类详解
  10. 一比二购增加您指定商品降价时,给您发送邮件通知的功能