@wuxin1994
2019-03-21T11:01:39.000000Z
字数 7078
阅读 1060
数据库 JAVA
Java 数据库连接,(Java Database Connectivity,简称JDBC)是Java语言中用来规范客户端程序如何来访问数据库的应用程序接口,提供了诸如查询和更新数据库中数据的方法。JDBC也是Sun Microsystems的商标。它JDBC是面向关系型数据库的。
即用于执行SQL语句的JAVA API。
直接按照教程,话不多说。
MySQL安装图解
(1)在MySQL官网页面,选择对应系统的文件。如果是windows系统,选择Platform Independent对应的jar包即可。
(2)复制mysql-connector-java-8.0.15.jar包到你的\jre1.8.0_181\lib\ext文件夹下。
a.注册驱动
DriverManager.registerDriver(new com.mysql.jdbc.Driver());//上面这种方法相当于注册两次驱动,因此没有必要,最好用下面这种代码:Class.forName("com.mysql.jdbc.Driver");//deprecatedClass.forName("com.mysql.cj.jdbc.Driver");
b.建立连接
//1. 一个参数,用&隔开DriverManager.getConnection("jdbc:mysql://localhost/database_name?user=user&password=password");//2. 建立连接 参数一: 协议 + 访问的数据库 , 参数二: 用户名 , 参数三: 密码。conn = DriverManager.getConnection("jdbc:mysql://localhost/database_name", "user", "password");
c.创建statement
//3. 创建statement对象 ,很重要的一个类st = conn.createStatement();
d.执行sql ,得到ResultSet
//4. 执行查询 , 得到结果集String sql = "select * from table_name";rs = st.executeQuery(sql);
e.遍历结果集
//5. 遍历查询每一条记录while(rs.next()){int id = rs.getInt("id");String name = rs.getString("name");int age = rs.getInt("age");System.out.println("id="+id + "===name="+name+"==age="+age);}
f.释放资源
if (rs != null) {try {rs.close();} catch (SQLException sqlEx) { } // ignorers = null;}
通过代码示例了解如何通过JDBC对数据库进行增删改查的任务。
// 1. 获取连接对象conn = JDBCUtil.getConn();// 2. 根据连接对象,得到statement对象st = conn.createStatement();// 3. 执行添加String sql = "insert into t_stu values(null , 'wufan' , 99)";//返回影响的行数,如果大于0表明操作成功。否则失败int result = st.executeUpdate(sql);if(result >0 ){System.out.println("添加成功");}else{System.out.println("添加失败");}
// 1. 获取连接对象conn = JDBCUtil.getConn();// 2. 根据连接对象,得到statementst = conn.createStatement();// 3. 执行删除String sql = "delete from t_stu where name='wufan'";//返回影响的行数,如果大于0表明操作成功。否则失败int result = st.executeUpdate(sql);if(result >0 ){System.out.println("删除成功");}else{System.out.println("删除失败");}
// 1. 获取连接对象conn = JDBCUtil.getConn();// 2. 根据连接对象,得到statementst = conn.createStatement();// 3. 执行返回ResultSet.String sql = "select * from t_stu";rs = st.executeQuery(sql);// 4. 遍历结果集while (rs.next()) {String name = rs.getString("name");int age = rs.getInt("age");System.out.println(name + " " + age);}
// 1. 获取连接对象conn = JDBCUtil.getConn();// 2. 根据连接对象,得到statementst = conn.createStatement();// 3. 执行更新String sql = "update t_stu set age = 16 where name ='wufan'";//返回影响的行数,如果大于0表明操作成功。否则失败int result = st.executeUpdate(sql);if(result >0 ){System.out.println("删除成功");}else{System.out.println("删除失败");}
在JDBC中,Properties()是一种很方便的方法,不需要将url、user、password、driverClass写在代码方法中,而是写入配置文件,并通过调用配置文件实现。
1.在src声明一个配置文件XXX.properties,内容如下:
driverClass=com.mysql.jdbc.Driverurl=jdbc:mysql://localhost:3306/database?useUnicode=true&characterEncoding=utf8username=rootpassword=root
2.在工具类中,使用静态代码块读取属性。
private static String driverClass;private static String url;private static String name;private static String password;static{try {//1. 创建一个属性配置对象Properties properties = new Properties();InputStream is = new FileInputStream("jdbc.properties"); //对应文件位于工程根目录//方法1:使用当前类加载器,读取src底下的资源文件。//InputStream is = JDBCUtil.class.getClassLoader().getResourceAsStream("jdbc.properties");//方法2:导入输入流。properties.load(is);//读取属性driverClass = properties.getProperty("driverClass");url = properties.getProperty("url");name = properties.getProperty("name");password = properties.getProperty("password");} catch (Exception e) {e.printStackTrace();}}
获取连接:
public static Connection getConnection() {Connection conn = null;try {Class.forName(driverClass);conn = DriverManager.getConnection(url, username, password);} catch (Exception e) {e.printStackTrace();}return conn;}
释放资源:
public static void release(Connection conn, PreparedStatement pstmt, ResultSet rs) {if (rs != null) {try {rs.close();} catch (SQLException e) {e.printStackTrace();}}if (pstmt != null) {try {pstmt.close();} catch (SQLException e) {e.printStackTrace();}}if (conn != null) {try {conn.close();} catch (SQLException e) {e.printStackTrace();}}}
可以发现,这种方式能降低代码维护成本,解决了数据库更换的麻烦。
DAO: Data Access Object 数据访问对象
(1).隔离业务逻辑代码和数据访问代码,位于业务逻辑和持久化数据之间,实现对持久化数据的访问。
(2).隔离不同数据库的实现。
(1).DAO接口
(2).DAO实现类
(3).实体类
(4).数据库连接和关闭工具类
(1).DAO接口
package jdbc;public interface DAO {void findeAll();}
(2).DAO实现类(实体类略去)
package jdbc;import java.sql.Connection;import java.sql.ResultSet;import java.sql.Statement;/*** @Author: wufan*/public class UerDao implements DAO {@Overridepublic void findeAll() {Connection conn = null;Statement st = null;ResultSet rs = null;try {//1. 获取连接对象conn = JDBCUtil.getConnection();//2. 创建statement对象st = conn.createStatement();String sql = "select * from user";rs = st.executeQuery(sql);while(rs.next()){String phone = rs.getString("phone");int id = rs.getInt("uid");System.out.print(id+"\t"+phone);System.out.println("");}} catch (Exception e) {e.printStackTrace();}finally {JDBCUtil.release(conn, st, rs);}}public static void main(String[] args) {UerDao ud = new UerDao();ud.findeAll();}}
(4).数据库连接和关闭工具类
package jdbc;import java.io.FileInputStream;import java.io.InputStream;import java.sql.*;import java.util.Properties;/*** @Author: wufan*/public class JDBCUtil {private static String driverClass;private static String url;private static String username;private static String password;static{try {Properties properties = new Properties();//InputStream is = JDBCUtil.class.getClassLoader().getResourceAsStream("JDBC.properties");InputStream is = new FileInputStream("P:\\Java\\Database\\src\\JDBC.properties"); //对应文件位于工程根目录properties.load(is);driverClass = properties.getProperty("driverClass");url = properties.getProperty("url");username = properties.getProperty("username");password = properties.getProperty("password");} catch (Exception e) {e.printStackTrace();}}//获取连接public static Connection getConnection() {Connection conn = null;try {Class.forName(driverClass);conn = DriverManager.getConnection(url, username, password);} catch (Exception e) {e.printStackTrace();}return conn;}//释放资源public static void release(Connection conn, Statement pstmt, ResultSet rs) {if (rs != null) {try {rs.close();} catch (SQLException e) {e.printStackTrace();}}if (pstmt != null) {try {pstmt.close();} catch (SQLException e) {e.printStackTrace();}}if (conn != null) {try {conn.close();} catch (SQLException e) {e.printStackTrace();}}}}
在需要传入参数的SQL语句中,替换
Statement对象。相比较以前的
Statemen, 预先处理给定的sql语句,对其执行语法检查。 在sql语句里面使用?占位符来替代后续要传递进来的变量。后面进来的变量值,将会被看成是字符串,不会产生任何的关键字。
String sql = "insert into table_name values(? , ? , ?)";PrepareStatement ps = conn.prepareStatement(sql);//给占位符赋值//注意从左到右数过来,1 代表第一个问号, 永远从1开始。ps.setInt(1,id);ps.setString(2, userName);ps.setString(3, phone);
(1)time zone错误
SQLException: The server time zone value 'Öйú±ê׼ʱ¼ä' is unrecognized or represents more than one time zone. You must configure either the server or JDBC driver (via the serverTimezone configuration property) to use a more specifc time zone value if you want to utilize time zone support.SQLState: 01S00VendorError: 0
这是由于数据库和系统时区差异所造成的,简单的方法是再url后面加上
serverTimezone=GMT
比如:
Connection conn = DriverManager.getConnection("jdbc:mysql://localhost/database_name?"+"user=root&password=root"+"&serverTimezone=GMT");
(2) java.io.FileNotFoundException: JDBC.properties (系统找不到指定的文件。)
解决办法1:使用类加载
InputStream is = JDBCUtil.class.getClassLoader().getResourceAsStream("JDBC.properties");
办法2:改用全路径
InputStream is = new FileInputStream("P:\\Java\\Database\\src\\JDBC.properties");
参考链接:
1.mysql-8.0.13使用jdbc与java连接教程
2.通过JDBC进行简单的增删改查(以MySQL为例)
3.《高性能MySQL》