今天是线上实习第一天,主要完成了环境的搭建以及回顾MySQL的相关知识。
S1、new project->创建一个webapp项目,单击next。
S2、在properties里添加archetypeCatalog internal,单击finish。
S3、对pom.xml文件进行修改,讲properties和dependencies进行替换,刷新该项目,单击右侧maven按钮,可发现已经导入需要的jar包。
UTF-8
1.8
1.8
5.0.2.RELEASE
3.2.6
1.7.7
1.2.17
0.9.5.2
1.1.2
org.springframework
spring-core
${spring.version}
org.springframework
spring-web
${spring.version}
org.springframework
spring-oxm
${spring.version}
org.springframework
spring-tx
${spring.version}
org.springframework
spring-jdbc
${spring.version}
org.springframework
spring-webmvc
${spring.version}
org.springframework
spring-aop
${spring.version}
org.springframework
spring-context-support
${spring.version}
org.springframework
spring-test
${spring.version}
org.mybatis
mybatis
${mybatis.version}
org.mybatis
mybatis-spring
1.2.2
javax
javaee-api
7.0
mysql
mysql-connector-java
8.0.18
commons-dbcp
commons-dbcp
1.2.2
jstl
jstl
1.2
log4j
log4j
${log4j.version}
com.mchange
c3p0
${c3p0.version}
taglibs
standard
${taglibs.version}
org.slf4j
slf4j-api
${slf4j.version}
org.slf4j
slf4j-log4j12
${slf4j.version}
javax.servlet
javax.servlet-api
3.1.0
provided
javax.servlet.jsp
javax.servlet.jsp-api
2.3.1
provided
S1、创建项目,添加lib文件夹,将MySQL8.x的jar包拖入其中,单击add as library。
使用Navicat数据库可视化工具新建一个数据库asd和表user:
S2、新建一个配置项文件jdbc.properties,里面放入驱动信息。
url=jdbc:mysql://localhost:3306/asd?useSSL=false&serverTimezone=UTC
user=root
password=123456
driver=com.mysql.cj.jdbc.Driver
S3、新建一个JDBCUtils工具类,其中放入对数据库的一些基本操作,包括对配置项信息的读写,创建连接函数、关闭连接函数。
import java.io.FileReader;
import java.io.IOException;
import java.net.URL;
import java.sql.*;
import java.util.Properties;
public class JDBCUtils {
private static String url = null;
private static String user = null;
private static String password = null;
private static String driver = null;
//读取文件,只需要读取一次即可拿到这些值
static{
try {
//创建Properties集合类
Properties pro = new Properties();
ClassLoader classLoader = JDBCUtils.class.getClassLoader();
URL res = classLoader.getResource("jdbc.properties");
String path = res.getPath();
System.out.println(path);
//加载文件
pro.load(new FileReader(path));
//获取数值
url = pro.getProperty("url");
user = pro.getProperty("user");
password = pro.getProperty("password");
driver = pro.getProperty("driver");
Class.forName(driver);
}catch(ClassNotFoundException e){
e.printStackTrace();
}catch (IOException e) {
e.printStackTrace();
}
}
//获取连接
public static Connection getConnection() throws SQLException {
return DriverManager.getConnection(url,user,password);
}
//释放资源
public static void close(ResultSet rs,Statement stmt,Connection conn){
if(rs!=null){
try{
rs.close();
} catch (SQLException throwables) {
throwables.printStackTrace();
}
}
if(stmt!=null){
try{
stmt.close();
} catch (SQLException throwables) {
throwables.printStackTrace();
}
}
if(conn!=null){
try{
conn.close();
} catch (SQLException throwables) {
throwables.printStackTrace();
}
}
}
}
S4、新建一个类jdbc_test,完成数据查询,返回查询是否成功。
import java.sql.*;
import java.util.Scanner;
public class jdbc_test {
public static void main(String[] args) throws ClassNotFoundException, SQLException {
// Class.forName("com.mysql.cj.jdbc.Driver");
// //获取数据库连接对象
// Connection conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/asd?useSSL=false&serverTimezone=UTC","root","123456");
// String sql = "update user set name = '啦啦' where id =2";
// Statement stmt = conn.createStatement();
// //执行sql,并接受返回结果。
// int count = stmt.executeUpdate(sql);
// System.out.println(count);
// //释放资源
// stmt.close();
// conn.close();
Scanner scanner = new Scanner(System.in);
System.out.println("请输入用户名:");
String username = scanner.nextLine();
System.out.println("请输入密码:");
String password = scanner.nextLine();
boolean loginflag = new jdbc_test().login(username,password);
if(loginflag){
System.out.println("成功");
}else{
System.out.println("失败");
}
}
public boolean login(String username,String password){
if(username==null||password==null){
return false;
}
Connection conn = null;
Statement stmt = null;
ResultSet rs = null;
try{
conn = JDBCUtils.getConnection();
//定义sql
String sql = "select * from user where name = '"+username+"'and password='"+password+"'";
//获取执行sql对象
stmt = conn.createStatement();
rs = stmt.executeQuery(sql);
return rs.next();
}catch(SQLException e){
e.printStackTrace();
}finally{
JDBCUtils.close(rs,stmt,conn);
}
return false;
}
}
这个文件作为一些参数的存储,代码就可以灵活一点。通俗点讲就相当于定义一个变量,在这个文件里面定义这些变量的值,在程序里面可以调用这些变量,好处就是,如果程序中的参数值需要变动,直接来改这个.property文件就可以了,不用在去修改源代码。
Java中的Properties类详解
JDBC是用于运行sql语句并从数据库中获取新新的java API.
JDBC是用来(让我们的程序)通过网络来操作数据库的,作用非常重要;JDBC技术也是Java核心技术之中的一个。
是使用JDBC驱动程序訪问数据库的首选方式
第1步:注冊驱动 (仅仅做一次)
第2步:建立连接(Connection)
第3步:创建运行SQL的语句(Statement)
第4步:运行语句
第5步:处理运行结果(ResultSet)
第6步:释放资源
使用JDBC第一步:载入驱动
注冊驱动有三种方式:
1. Class.forName(“com.mysql.jdbc.Driver”);
推荐这样的方式,不会对详细的驱动类产生依赖
2. DriverManager.registerDriver(com.mysql.jdbc.Driver);
会对详细的驱动类产生依赖
3. System.setProperty(“jdbc.drivers”, “driver1:driver2”);
尽管不会对详细的驱动类产生依赖;但注冊不太方便。所以非常少使用
使用JDBC第二步:建立连接
通过Connection建立连接,Connection是一个接口类。其功能是与数据库进行连接(会话)。
建立Connection接口类对象:
Connection conn =DriverManager.getConnection(url, user, password);
当中URL的格式要求为:
JDBC:子协议:子名称//主机名:port/数据库名?属性名=属性值&…
如:"jdbc:mysql://localhost:3306/test“
user即为登录数据库的username,如root
password即为登录数据库的密码,为空就填””
使用JDBC第三步:创建运行对象
运行对象Statement负责运行SQL语句。由Connection对象产生。
Statement st = connection.createStatement();
Statement接口类还派生出两个接口类PreparedStatement和CallableStatement,这两个接口类对象为我们提供了更加强大的数据訪问功能。
PreparedStatement能够对SQL语句进行预编译,这样防止了 SQL注入 提高了安全性。
PreparedStatement ps=connection.prepareStatement( "update user set id=? where username=?”); ————sql语句中庸 ? 作为通配符,变量值通过参数设入:ps.setObject(1, object);
而且预编译结果能够存储在PreparedStatement对象中。当多次运行SQL语句时能够提高效率。
作为Statement的子类,PreparedStatement继承了Statement的全部函数。
CallableStatement接口
CallableStatement类继承了PreparedStatement类,他主要用于运行SQL存储过程。
在JDBC中运行SQL存储过程须要转义。
JDBC API提供了一个SQL存储过程的转义语法:
{call[,, …]}
procedure-name:是所要运行的SQL存储过程的名字
[,, …]:是相相应的SQL存储过程所须要的參数
使用JDBC第四步:运行SQL语句
运行对象Statement 或 PreparedStatement 提供两个经常使用的方法来运行SQL语句。
executeQuery(Stringsql),该方法用于运行实现查询功能的sql语句。返回类型为ResultSet(结果集)。
如:ResultSet rs =st.executeQuery(sql);
executeUpdate(Stringsql),该方法用于运行实现增、删、改功能的sql语句,返回类型为int,即受影响的行数。
如:int flag = st.executeUpdate(sql);
使用JDBC第五步:处理运行结果
ResultSet对象
ResultSet对象负责保存Statement运行后所产生的查询结果。
结果集ResultSet是通过游标来操作的。
游标就是一个可控制的、能够指向随意一条记录的指针。
有了这个指针我们就能轻易地指出我们要对结果集中的哪一条记录进行改动、删除,或者要在哪一条记录之前插入数据。一个结果集对象中仅仅包括一个游标。
另外,借助ResultSetMetaData ,可以将数据表的结构信息都查出来。
ResultSetMetaData rsmd= resultSet.getMetaData();
使用JDBC 第六步——释放资源
MySQL 8.0 以下版本 - JDBC 驱动名及数据库 URL
static final String JDBC_DRIVER = "com.mysql.jdbc.Driver";
static final String DB_URL = "jdbc:mysql://localhost:3306/test";
MySQL 8.0 以上版本 - JDBC 驱动名及数据库 URL
static final String JDBC_DRIVER = "com.mysql.cj.jdbc.Driver";
static final String DB_URL = "jdbc:mysql://localhost:3306/test?useSSL=false&serverTimezone=UTC";
具体参数详情请见
1、Mysql URL连接参数useSSL、serverTimezone 相关问题
2、useUnicode=true&characterEncoding=UTF-8 的作用