首先,加载驱动类(妈了个鸡蛋糕,对初学者而言,很可能连反射都不知道,就在那学习加载什么驱动类了,天知道学了些什么,越听越糊涂)。

我有很多去培训机构的朋友便是如此,培训都结束了,也不知道为什么要学jdbc,只会教室上那几个干巴巴的案例。
去企业口试都只有被嘲笑的份。

然后,加载好了驱动类,须要用一个什么 DriverManager 来获取链接。
再接着,就写预处理语句,实行一下,拿到结果集 ResultSet 。
(妈了个鸡蛋糕,对初学者而言,都不知道基本的迭代器,循环,就在那写什么 while(rs.next()){ ... } 了,终极的结果可想而知。

jsp泛型传递手把手JavaWeb 入门级项目实战  文章宣布体系 第五节 GraphQL

我个人是不太主见去那些不太出名的,或者口碑很差的培训机构,如果一定要去培训,那么最少找个靠谱的吧,毕竟花这么多钱呢!
如果花了钱,大部分知识竟然还是要去企业里面从0学起,到那时候你真的是要多忧郁有多忧郁。

不过也没办法,由于就算是再差的培训机构,教的也总是要比学校实用一些。
每年都有那么多毕业生毕业后不知道干嘛,提及来真是挺忧郁的。

去找事情吧,屡屡碰钉子,好不容易找到了一个口试的,过去一问,原来是培训的。

然后想想自己确实没有什么技能,以是只好咬咬牙花一万多块钱去培训了。

这样的例子太多了,博主的很多朋友和同学便是这样走上了Java程序开拓的道路。

我不反对去培训机构学习,只是我想说,如果低廉甜头力好的话,还是只管即便自学比较划算。

如果实在没有自控力,去培训机构也是一个不错的选择。

总之,视你的详细情形而定吧。

OK,回到正题。

末了,在jdbc操作的末端,总归少不了关闭链接,否则会导致资源的摧残浪费蹂躏。

当然,这些东西的确很主要,jdbc是Java代码访问和操作数据库的办法。
这些基本的API方法也形成了所有JDBC框架的根,比如Spring-jdbc便是对这些相对底层的代码的封装。

这便是所谓的jdbc1.0规范,但这样有一个缺陷,便是我每次进行数据库操作都要去获取一个连接,然后再自己关掉。
这样很麻烦,人总是聪明的,所以为了改进,就有了jdbc2.0规范。

那些数据源,连接池的观点就属于jdbc2.0规范,便是说,我先创建好一大堆连接,谁要用谁就去拿。
这样就办理了jdbc1.0的弊端,不须要用户每次都去创建连接,末了再关闭链接了。

由于这个小项目毕竟因此根本优先的,以是我还是先容一下jdbc1.0的利用方法吧。
我会逐步封装出一个JDBC工具类出来,我以前也没写过,都是直接用框架的,这是我的第一次考试测验,难免会有不恰当的地方,还希望各位多多包涵。

如有疑问或者不同的见地,可以在评论区指出,我会客气改正的,感激。

02 预备知识

最好对以下知识有一个初步的理解后,再来看本篇文章,当然,不看也没紧要啦。


1、反射

2、泛型

3、JDBC API大略利用

4、properties 文件的读取

5、 IO流

03 准备好mysql

好了,正式开始吧。
我在本地已经安装好了mysql。
mysql安装的话,随便百度一下就可以了。

在上一节中,我们新建了一个数据库Article,用户名便是root,密码没有。
root用户享有本地mysql的最高权限。

win + R,输入cmd

输入 mysql -uroot (密码不须要填写)

输入 use Article

好了,数据库方面的事情就做好了。

如果无法进入mysql,可能是没有启动。
在命令行输入:net start mysql即可。

04 编写jdbc.properties

我们要连接数据库,最基本的信息有用户名,密码,还有数据库名。

于是,我们在src目录上新建一个config源文件夹(把稳,是源文件夹,不是普通的文件夹,所有的源文件夹不会真的产生一个文件夹,它里面的文件默认在 CLASSPATH 根目录下),再创建一个jdbc.properties文件:

内容

db.username=rootdb.password=db.dataBaseName=article

OK,这一步也完成了,接下来便是如何读取这个文件里的信息。

05 读取properties文件

在test包下新建一个测试类,来试着读取properties文件。

package test;/ 读取Properties文件的测试类 @author 慓悍一小兔 /public class TestProperties { public static void main(String[] args) { }}

properties文件(配置文件)便是一个类似于Map的东西,为什么要把连接信息放在文件里呢?那是由于,如果你写在Java类中,这固然是可以的。
但是,不利于掩护啊。

比如,项目一旦上线,基本上便是专门的掩护职员在跟进了,一旦要改个什么配置信息,作为开拓职员,你只须要和对方讲,找到一个什么什么properties文件,然后将某一行改掉就好了。
如果你不用配置文件,直接将信息写在Java类中,那么你就很难描述清楚了,改起来也特殊麻烦。

这便是缘故原由。

以下是读取的代码,流程便是我先把这个文件变成一个输入流InputStream,然后new一个Properties ,再去加载之前得到的输入流。

jdbc.properties是一个实实在在的文件。
而且,它还是一个分外的文件,由于它里面的内容都是 key=value 的形式。
现在的问题就在于怎么用Java代码来读取里面的信息呢?

InputStream inputStream = TestProperties.class.getClassLoader().getResourceAsStream(\"大众jdbc.properties\"大众);Properties p = new Properties();try { p.load(inputStream); System.out.println(p);} catch (IOException e) { e.printStackTrace();}

你可以把InputStream想象成一根吸管

InputStream inputStream = TestProperties.class.getClassLoader().getResourceAsStream(\"大众jdbc.properties\公众);

这行代码就相称于插了一根吸管在 jdbc.properties 文件上面,准备抽取里面的信息。

p.load(inputStream);

这行代码表示将吸管和 Properties 工具接通。

额,如果实在没有Java IO的根本,就暂时这么想象一下吧。


System.out.println(p);

输出:

{db.password=, db.dataBaseName=article, db.username=root}

分开来打印:

System.out.println(p.getProperty(\"大众db.username\"大众));System.out.println(p.getProperty(\公众db.password\公众));System.out.println(p.getProperty(\"大众db.dataBaseName\"大众));

输出:

root

article

(由于密码为空,以是没显示出来)

这样的话,加载资源文件也没有问题了。

06 开始封装自己的DataBaseUtils

DataBaseUtils的意思便是数据库工具类,你可以把这个算作是一个自己的小框架。

我们已经知道要访问数据库的话,须要有username,password,还有dataBaseName。
以是,这三个数据就作为工具类的属性吧。

private static String username; //用户名private static String password; //密码private static String dataBaseName; //数据库名

接下来,专门定义一个方法来加载properties。

/ 配置数据库的基本信息 @return void /public static void config(String path){ InputStream inputStream = DataBaseUtils.class.getClassLoader().getResourceAsStream(path); Properties p = new Properties(); try { p.load(inputStream); username = p.getProperty(\公众db.username\"大众); password = p.getProperty(\公众db.password\公众); dataBaseName = p.getProperty(\"大众db.dataBaseName\"大众); } catch (IOException e) { e.printStackTrace(); }}

一旦调用了这个方法,那么就会给私有属性赋值。

为了方便起见,我们让DataBaseUtils类被加载的时候就自动配置 jdbc.properties,比较随意马虎想到的一个方法便是定义一个static块,然后在里面调用一下 config 方法:

static { config(\公众jdbc.properties\公众);}

这样一来,只要你调用了这个DataBaseUtils中的方法,就会自动配置连接信息了。

获取连接的方法:

/ 获取数据库链接 @return Connection /public static Connection getConnection(){ Connection connection = null; try { Class.forName(\"大众com.mysql.jdbc.Driver\"大众); connection = DriverManager.getConnection(\公众jdbc:mysql://localhost:3306/\"大众+dataBaseName+\"大众?useUnicode=true&characterEncoding=utf8\"大众,username,password); } catch (ClassNotFoundException e) { e.printStackTrace(); } catch (SQLException e) { e.printStackTrace(); } return connection;}

测试:

DataBaseUtils.config(\"大众jdbc.properties\"大众);Connection conn = DataBaseUtils.getConnection();System.out.println(conn);

结果:

com.mysql.jdbc.Connection@661532

这就解释成功获取连接了。

关闭连接和其他资源的方法

/ 关闭资源 @param connection @param statement @param rs /public static void closeConnection(Connection connection,PreparedStatement statement,ResultSet rs){ try { if(rs!=null)rs.close(); if(statement!=null)statement.close(); if(connection!=null)connection.close(); } catch (Exception e) { e.fillInStackTrace(); }}

07 DML操作的实现

DML表示—数据操纵措辞,也便是SELECT,DELETE,UPDATE,INSERT。

现在我们开始封装DML的操作。

上代码:

/ DML操作 @param sql @param objects /public static void update(String sql,Object...objects){ Connection connection = getConnection(); PreparedStatement statement = null; try { statement = (PreparedStatement) connection.prepareStatement(sql); for (int i = 0; i < objects.length; i++) { statement.setObject(i+1, objects[i]); } statement.executeUpdate(); } catch (SQLException e) { e.printStackTrace(); }finally{ closeConnection(connection, statement, null); }}

Object...objects是变长参数,你可以把它理解成一个Object数组。

测试:

String id = UUID.randomUUID() + \公众\公众;String createTime = new SimpleDateFormat(\公众yyyy-MM-dd\"大众).format(new Date());update(\"大众INSERT INTO t_user(id,username,password,sex,create_time,is_delete,address,telephone) \"大众 + \公众VALUES (?, ?, ?, ?, ?, ?, ?, ?)\公众, id,\"大众张三\"大众,123456,0,createTime,0,\公众保密\"大众,\公众保密\"大众);

运行结果:

com.mysql.jdbc.MysqlDataTruncation: Data truncation: Data too long for column 'id' at row 1 at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:2983) at com.mysql.jdbc.MysqlIO.sendCommand(MysqlIO.java:1631) at com.mysql.jdbc.MysqlIO.sqlQueryDirect(MysqlIO.java:1723) at com.mysql.jdbc.Connection.execSQL(Connection.java:3283) at com.mysql.jdbc.PreparedStatement.executeInternal(PreparedStatement.java:1332) at com.mysql.jdbc.PreparedStatement.executeUpdate(PreparedStatement.java:1604) at com.mysql.jdbc.PreparedStatement.executeUpdate(PreparedStatement.java:1519) at com.mysql.jdbc.PreparedStatement.executeUpdate(PreparedStatement.java:1504) at util.DataBaseUtils.update(DataBaseUtils.java:147) at util.DataBaseUtils.main(DataBaseUtils.java:165)

创造报错了,不慌,看看它说什么。

由于是直播,以是如果我的代码报错了,也会把缺点放上来,然后纠正。
我也是普通人,很难担保代码一次性就写对。

我知道,初学的时候看到报错就害怕,这是很正常的。
没事,逐步来。

好的,让我们看看它说什么。

Data truncation: Data too long for column 'id' at row 1

哦,这解释id的字段长度太短了,而我们天生的UUID太长。

找到User类

我们把id的长度调大一点,换成varchar(100)吧。

接着,修正一下TableUtils,将建表语句加一个删除旧表的判断。

public static String getCreateTableSQl(Class<?> clazz){ StringBuilder sb = new StringBuilder(); //获取表名 Table table = (Table) clazz.getAnnotation(Table.class); String tableName = table.tableName(); sb.append(\公众DROP TABLE IF EXISTS \"大众).append(tableName).append(\"大众;\n\"大众); sb.append(\"大众create table \"大众); sb.append(tableName).append(\"大众(\n\"大众); Field[] fields = clazz.getDeclaredFields(); String primaryKey = \"大众\"大众; //遍历所有字段 for (int i = 0; i < fields.length; i++) { Column column = (Column) fields[i].getAnnotations()[0]; String field = column.field(); String type = column.type(); boolean defaultNull = column.defaultNull(); sb.append(\"大众\t\"大众 + field).append(\公众 \"大众).append(type); if(defaultNull){ if(type.toUpperCase().equals(\"大众TIMESTAMP\公众)){ sb.append(\"大众,\n\"大众); }else{ sb.append(\公众 DEFAULT NULL,\n\"大众); } }else{ sb.append(\公众 NOT NULL,\n\"大众); if(column.primaryKey()){ primaryKey = \公众PRIMARY KEY (\公众+field+\公众)\"大众; } } } if(!StringUtils.isEmpty(primaryKey)){ sb.append(\"大众\t\公众).append(primaryKey); } sb.append(\"大众\n) DEFAULT CHARSET=utf8\"大众); return sb.toString();}

然后,重新天生一下sql语句。

String sql = TableUtils.getCreateTableSQl(User.class);System.out.println(sql);

加分号,回车。

查看表构造

成功改变了。

好的,回到DataBaseUtils,实行新增操作

String id = UUID.randomUUID() + \"大众\公众;String createTime = new SimpleDateFormat(\"大众yyyy-MM-dd\"大众).format(new Date());update(\"大众INSERT INTO t_user(id,username,password,sex,create_time,is_delete,address,telephone) \"大众 + \"大众VALUES (?, ?, ?, ?, ?, ?, ?, ?)\"大众, id,\"大众张三\"大众,123456,0,createTime,0,\公众保密\"大众,\"大众保密\公众);

让我们查询一下现在表里有几条数据。

嗯,该当是成功了呢。