JDBC的使用
今天废了5个小时,彻底知道了了指定服务器如果发生错,另外的解决办法
//1分参指定
MysqlDataSource md=new MysqlDataSource();
md.setServerName("127.0.0.1");
md.setPort(3306);
md.setUser("root");
md.setPassword("H@139849t");
md.setDatabaseName("user_manage");
md.setCharacterEncoding("UTF-8");
md.setUseSSL(false);
md.setServerTimezone("Asia/shanghai");
md.setURL("jdbc:mysql://127.0.0.1:3306/user_manage");
//2,使用url 指定
MysqlDataSource mysqlDataSource=new MysqlDataSource();
mysqlDataSource.setURL("jdbc:mysql://localhost:3306/user_manage?characterEncoding=utf8&useSSL=false&serverTimezone=Asia/shanghai");
System.out.println(mysqlDataSource.getURL());
mysqlDataSource.setUser("root");
mysqlDataSource.setPassword("H@13984994357t");
这是我想要实现的全部代码:
import com.mysql.cj.jdbc.MysqlDataSource;
import javax.sql.DataSource;
import java.sql.*;
import java.util.Scanner;
public class JdbcDemo {
public static void main(String[] args) throws Exception {
//指定服务器
//1分参指定
MysqlDataSource md=new MysqlDataSource();
md.setServerName("127.0.0.1");
md.setPort(3306);
md.setUser("root");
md.setPassword("H@13984994357t");
md.setDatabaseName("user_manage");
md.setCharacterEncoding("UTF-8");
md.setUseSSL(false);
md.setServerTimezone("Asia/shanghai");
md.setURL("jdbc:mysql://127.0.0.1:3306/user_manage");
System.out.println(md.getURL());
//2,使用url 指定
/* MysqlDataSource mysqlDataSource=new MysqlDataSource();
mysqlDataSource.setURL("jdbc:mysql://localhost:3306/user_manage?characterEncoding=utf8&useSSL=false&serverTimezone=Asia/shanghai");
System.out.println(mysqlDataSource.getURL());
mysqlDataSource.setUser("root");
mysqlDataSource.setPassword("H@13984994357t");*/
//3尽量使用接口而不是实际类
//获取数据源
DataSource dataSource=new MysqlDataSource();
Scanner scanner=new Scanner(System.in);
String usernameInput=scanner.nextLine();
String passwordInput=scanner.nextLine();
//获取连接对象从dataSource中(背后发了网络连接)
try(Connection connection=dataSource.getConnection()){
String sql="insert into users (username,password) values (?, ?)";
//从connection中,创建要执行SQL操作;
//需要得到自增id=
try(PreparedStatement ps=connection.prepareStatement(sql,Statement.RETURN_GENERATED_KEYS)){
//为动态参数进行绑定
ps.setString(1,usernameInput);
ps.setString(2,passwordInput);
//due to not return result ,execute executeUpdata;
ps.executeUpdate();
//hope get uid auto_increase list;
try(ResultSet rs=ps.getGeneratedKeys()){
if(rs.next()){
//这一定有一行,除非上面的executeUpdate() error
int uid=rs.getInt(1);
System.out.println("插入后uid的主建等于"+uid);
}else{
}
}
}
}
}
}
遇到的第一个错误是:Access denied for user ‘86139’@‘localhost’ (using password: NO)
意思是没有输入密码不能进入
Exception in thread "main" java.sql.SQLException: Access denied for user '86139'@'localhost' (using password: NO)
at com.mysql.cj.jdbc.exceptions.SQLError.createSQLException(SQLError.java:129)
at com.mysql.cj.jdbc.exceptions.SQLExceptionsMapping.translateException(SQLExceptionsMapping.java:122)
at com.mysql.cj.jdbc.ConnectionImpl.createNewIO(ConnectionImpl.java:828)
at com.mysql.cj.jdbc.ConnectionImpl.<init>(ConnectionImpl.java:448)
at com.mysql.cj.jdbc.ConnectionImpl.getInstance(ConnectionImpl.java:241)
at com.mysql.cj.jdbc.NonRegisteringDriver.connect(NonRegisteringDriver.java:198)
at com.mysql.cj.jdbc.MysqlDataSource.getConnection(MysqlDataSource.java:416)
at com.mysql.cj.jdbc.MysqlDataSource.getConnection(MysqlDataSource.java:128)
at com.mysql.cj.jdbc.MysqlDataSource.getConnection(MysqlDataSource.java:113)
at JdbcDemo.main(JdbcDemo.java:39)
解决办法是在:
//获取连接对象从dataSource中(背后发了网络连接)
try(Connection connection=dataSource.getConnection("root","mima")){
String sql="insert into users (username,password) values (?, ?)";
dataSource.getConnection(String name,String password)//将用户在里加入;
弄好这个后又有下面这个错误;
遇到的第二个错误是:No database selected
没有选择数据库
Exception in thread "main" java.sql.SQLException: No database selected
at com.mysql.cj.jdbc.exceptions.SQLError.createSQLException(SQLError.java:129)
at com.mysql.cj.jdbc.exceptions.SQLExceptionsMapping.translateException(SQLExceptionsMapping.java:122)
at com.mysql.cj.jdbc.ClientPreparedStatement.executeInternal(ClientPreparedStatement.java:916)
at com.mysql.cj.jdbc.ClientPreparedStatement.executeUpdateInternal(ClientPreparedStatement.java:1061)
at com.mysql.cj.jdbc.ClientPreparedStatement.executeUpdateInternal(ClientPreparedStatement.java:1009)
at com.mysql.cj.jdbc.ClientPreparedStatement.executeLargeUpdate(ClientPreparedStatement.java:1320)
at com.mysql.cj.jdbc.ClientPreparedStatement.executeUpdate(ClientPreparedStatement.java:994)
at JdbcDemo.main(JdbcDemo.java:49)
解决办法
//获取连接对象从dataSource中(背后发了网络连接)
try(Connection connection=dataSource.getConnection()){
String sql="insert into user_manage.users (username,password) values (?, ?)";
String sql="insert into users (username,password) values (?, ?)";//在表的前面加上库名.
就解决问题;
总结;用这两种方法后上面分参指定 和URL指定没有用,我出现错误的原因也是 分参指定 和URL指定没有用的上,具体原因可能是我的环境有问题,这两种写法没有问题,由以上原因的可以采用我这种方式去连接数据库;
1,获取数据源
2,连接数据库
3,执行语句
4,关闭连接(connection,ps rs,例子中还没有关闭)