jar文件
首先创建一个module提供jar文件,在module下写一个类:
public class Dept {
private Integer deptNo;
private String name;
private String loc;
public Dept() {
}
public Dept(Integer deptNo, String name, String loc) {
this.deptNo = deptNo;
this.name = name;
this.loc = loc;
}
public Integer getDeptNo() {
return deptNo;
}
public void setDeptNo(Integer deptNo) {
this.deptNo = deptNo;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getLoc() {
return loc;
}
public void setLoc(String loc) {
this.loc = loc;
}
}
然后打包成jar包,为第二个工程做帮助,如何打包:
左上角File => Project Structure => Artifacts =>Jar
先建一个empty的jar,然后把右边想打成jar包的文件拖到左边jar01.jar的位置:
apply后点上面的build,build artifacts:
成功后会出现out目录。
然后通过idea将jar包移动到需要类文件的工程中,复制粘贴即可。然后还需要add as lib,这样该工程就能用jar包里的java类了:
写个类测试:
public class demo01 {
//测试能否使用jar包里的dept类
public static void main(String[] args) {
Dept dept = new Dept(1,"bo","四川");
System.out.println(dept.getDeptNo()+dept.getLoc()+dept.getName());
}
JDBC规范
- javaee中的一种规范
- 指定Java类与数据库服务器的沟通规则
- JDBC提供接口存在JDKJAR包中(java.sql包)
- JDBC的规范接口实现类由不同数据库服务器产商以JAR包形式提供
- 想访问哪个数据库(mysql,oracle)就由哪种实现类的jar包与之沟通
JDBC使用规则
比如我们现在想访问mysql服务器,就需要从mysql取得提供的特殊实现类jar包,并且把jar包呢加入我们的工程中(maven中可以导入依赖)。
JDBC规范调用流程
1.将mysql服务器厂商提供的Driver接口实现类注册到JVM
2.通过JDBC规范中的DriverManager在Java工程与MySQL服务器之间建立一个“连接通道”
3.通过mysql服务器厂商提供的connection接口实现类建立一个交通工具 【PreparedStatement】
4.通过交通工具 【PreparedStatement】将sql命令从java工程推送到mysql服务器执行并带回执行结果。
5.销毁本次交易过程中涉及到的所有资源对象。
JDBC规范下接口介绍
1.位置
JDBC规范下接口存在于JDK_1.8.jar下java.sql包
2.分类
1) java.sql.DriveManager类:这个类负责将数据库产商提供的Driver接口实现进行注册,在Java工程与MySQL服务器之间建立一个“连接通道”(io流) 2) java.sql.connection接口:负责管理Java工程与数据库服务器之间的连接通道 3) java.sql.PreparedStatement:负责在连接通道上建立交通工具 4) java.sql.ResultSet:负责管理数据库服务器返回的临时表
JDBC开发事例
先导入mysql提供的jar包:
按使用流程进行开发:
public static void main(String[] args) throws Exception{
//1.将mysql服务器所提供的的jar包中的Driver接口实现类注册到jvm
Driver driver = new com.mysql.jdbc.Driver();
DriverManager.registerDriver(driver);
String sql = "insert into t_departments(DEPARTMENT_ID,DEPARTMENT_NAME,MANAGER_ID,LOCATION_ID) values('300','300','300','300')";
String url = "jdbc:mysql//localhost:3306/companydb";
//2.通过DriverManager在Java工程和mysql服务器间建立连接通道,相当于Java工程登录mysql
//参数分别为url,user,password,url: "jdbc:mysql//服务器所在计算机IP地址:服务器端口号/某个数据库
Connection connection = DriverManager.getConnection(url, "root", "123456");
//3.通道有了,需要交通工具,把sql命令装进去
PreparedStatement preparedStatement = connection.prepareStatement("");
//4.通过交通工具把sql推送到mysql服务器上,并带回执行结果
int result = preparedStatement.executeUpdate(sql);
//5.销毁相关资源
if (preparedStatement!=null){
preparedStatement.close();
}
if (connection!=null){
connection.close();
}
System.out.println("本次交易中添加了"+result+"行数据");
}
}
报错集
启动测试后报错:
`com.mysql.jdbc.Driver'. This is deprecated. The new driver class is `com.mysql.cj.jdbc.Driver'. The driver is automatically registered via the SPI and manual loading of the driver class is generally unnecessary.
根据错误提示修改代码,把驱动换成新的(加上cj):
Driver driver = new com.mysql.cj.jdbc.Driver();
下一行代码出现了新的错误:
No suitable driver found for jdbc:mysql//localhost:3306/companydb
发现是url格式错误jdbc:mysql//localhost:3306/companydb
mysql后面少了一个冒号,所以应该是:jdbc:mysql://服务器所在计算机IP地址:服务器端口号/某个数据库
更改好后又有一个新的错误:SQL String cannot be empty
字面意思,preparedStatement后面的sql语句不能为空,把写好的sql语句填上去即可:
PreparedStatement preparedStatement = connection.prepareStatement("sql");
修改完成后,打开表,发现多了一行全是300的数据,成功:
优化和注意
第二种加载驱动的方式(最好用这个):
Class.forName("com.mysql.cj.jdbc.Driver");
excute
preparedStatement.executeUpdate(sql)
update是对表进行更新操作时调用的方法,如果是查询操作就是excuteQuery返回ResultSet结果集
示例2,推送更新命令
public static void main(String[] args) throws Exception{
Class.forName("com.mysql.cj.jdbc.Driver");
String url = "jdbc:mysql://localhost:3306/companydb";
Connection connection = DriverManager.getConnection(url, "root", "123456");
String sql = "update t_departments set DEPARTMENT_NAME='ikun' where DEPARTMENT_ID>='300'";
PreparedStatement preparedStatement = connection.prepareStatement(sql);
System.out.println(preparedStatement.executeUpdate(sql));
if (preparedStatement!=null){
preparedStatement.close();
}
if (connection!=null){
connection.close();
}
}
查看表的更新:
ResultSet接口(推送查询命令)
preparedStatement.excuteQuery:
- 负责推送查询命令
- 返回结果是查询命令得到临时表,在JDBC规范中,临时表交给ResultSet接口实现类管理
获取临时表信息:
resultset的next()方法:每次执行时要求指针向下移动一行,如果指针指向位置是一个具体数据行,此时next方法将返回true,没有数据行了就返回false了。
我们可以用这个方法来作为循环结束的条件,用循环体来寻找get我们需要的信息
public static void main(String[] args) throws Exception{
Class.forName("com.mysql.cj.jdbc.Driver");
String url = "jdbc:mysql://localhost:3306/companydb";
Connection connection = DriverManager.getConnection(url, "root", "123456");
String sql = "select * from t_departments";
PreparedStatement preparedStatement = connection.prepareStatement(sql);
//获取临时表
ResultSet resultSet = preparedStatement.executeQuery(sql);
//通过ResultSet来获取临时表数据
while (resultSet.next()){
String department_name = resultSet.getString("DEPARTMENT_ID");
String manager_id = resultSet.getString("MANAGER_ID");
System.out.println("部门名称:"+department_name+"经理id:"+manager_id);
}
if (resultSet!=null){
resultSet.close();
}
if (preparedStatement!=null){
preparedStatement.close();
}
if (connection!=null){
connection.close();
}
}
最后注意关闭资源,先开的后关。
结果:
部门名称:10经理id:200
部门名称:100经理id:108
部门名称:110经理id:205
部门名称:120经理id:null
部门名称:130经理id:null
部门名称:140经理id:null
部门名称:150经理id:null