JDBC
连接
将数据库配置文件写到config.properties中
然后使用以下代码连接数据库。
import java.io.FileNotFoundException; import java.io.FileReader; import java.io.Reader; import java.sql.Connection; import java.sql.DriverManager; import java.sql.SQLException; import java.util.Properties; public class DBUtil { private static String driver; private static String url; private static String username; private static String password; static{ Properties prop = new Properties(); Reader in; try { in = new FileReader("src/config.properties"); prop.load(in); } catch (Exception e) { // TODO Auto-generated catch block e.printStackTrace(); } driver = prop.getProperty("driver"); url = prop.getProperty("url"); username = prop.getProperty("username"); password = prop.getProperty("password"); } public static Connection open(){ try { Class.forName(driver); return DriverManager.getConnection(url, username, password); } catch (Exception e) { // TODO Auto-generated catch block e.printStackTrace(); } return null; } public static void close(Connection conn){ if(conn!=null){ try { conn.close(); } catch (SQLException e) { // TODO Auto-generated catch block e.printStackTrace(); } } } }
然后是基础的增删改查
import java.io.FileReader; import java.io.IOException; import java.io.Reader; import java.sql.Connection; import java.sql.ResultSet; import java.sql.SQLException; import java.util.Properties; import com.mysql.jdbc.Statement; public class Main { public static void main(String[] args) { query(); } //建表 static void createTable(){ Connection conn = DBUtil.open(); String sql = "create table UserTb1(id int primary key auto_increment, name varchar(20))"; try { Statement stmt = (Statement) conn.createStatement(); stmt.execute(sql); } catch (SQLException e) { // TODO Auto-generated catch block e.printStackTrace(); }finally{ DBUtil.close(conn); } } //插入 static void insert(){ Connection conn = DBUtil.open(); String sql = "insert into UserTb1(name)values('tom')"; try { Statement stmt = (Statement) conn.createStatement(); stmt.execute(sql); } catch (SQLException e) { // TODO Auto-generated catch block e.printStackTrace(); }finally{ DBUtil.close(conn); } } //更新 static void update(){ Connection conn = DBUtil.open(); String sql = "update UserTb1 set name='big tom' where id > 3"; try { Statement stmt = (Statement) conn.createStatement(); stmt.execute(sql); } catch (SQLException e) { // TODO Auto-generated catch block e.printStackTrace(); }finally{ DBUtil.close(conn); } } //删除 static void delete(){ Connection conn = DBUtil.open(); String sql = "delete from UserTb1 where id = 1"; try { Statement stmt = (Statement) conn.createStatement(); stmt.execute(sql); } catch (SQLException e) { // TODO Auto-generated catch block e.printStackTrace(); }finally{ DBUtil.close(conn); } } //查询 static void query(){ Connection conn = DBUtil.open(); String sql = "select id,name from UserTb1"; try { Statement stmt = (Statement) conn.createStatement(); ResultSet rs = stmt.executeQuery(sql); while(rs.next()){ int id = rs.getInt(1); String name = rs.getString(2); System.out.println(id+","+name); } } catch (SQLException e) { // TODO Auto-generated catch block e.printStackTrace(); }finally{ DBUtil.close(conn); } } }
更近一步就是将数据库表封装成对象,那么查询时返回对象就好了。
ResultSet
查询返回的结果就存储在ResultSet的对象中。
PreparedStatement
该查询是预定义语句,也就是sql语句已经写好了,只要查询时传相应的参数进去就好了,这样的好处是。会将该sql语句进行转为成关系代数,然后进行优化,优化的原则是选择和投影尽可能先做,表连接尽可能后做。所以查询时会比较快。
如果时候Stetement查询,那么每次查询都需要进行sql语句的优化,那么就很耗费时间了。
CallableStatement
数据库也是有函数了,数据库中的函数称为存储过程,为了调用数据库中的存储过程,必须使用CallableStatement对象。
在数据库中使用 create proceducre 函数名() sql语句 ; 来创建存储过程,若
在数据库中调用存储过程使用 call 函数名();
使用java调用存储过程
static void procedure_query(){ Connection conn = DBUtil.open(); try { CallableStatement csmt = conn.prepareCall("{call all_user()}"); ResultSet rs = csmt.executeQuery(); while(rs.next()){ int id = rs.getInt(1); String name = rs.getString(2); System.out.println(id+","+name); } } catch (SQLException e) { // TODO Auto-generated catch block e.printStackTrace(); }finally{ DBUtil.close(conn); } }
创建能够接收参数的存储过程
调用有参数的存储过程
static void procedure_insert(){ Connection conn = DBUtil.open(); try { CallableStatement csmt = conn.prepareCall("{call insert_user(?)}"); csmt.setString(1, "tommmm"); System.out.println(csmt.executeUpdate()); } catch (SQLException e) { // TODO Auto-generated catch block e.printStackTrace(); }finally{ DBUtil.close(conn); } }
创建带有输入输出参数的存储过程。
java调用代码
static void procedure_query2(){ Connection conn = DBUtil.open(); try { CallableStatement csmt = conn.prepareCall("{call getNameById(?,?)}"); csmt.setInt(1, 6);; csmt.registerOutParameter(2, Types.CHAR);//注册输出参数 csmt.execute(); String name = csmt.getString(2); System.out.println(name); } catch (SQLException e) { // TODO Auto-generated catch block e.printStackTrace(); }finally{ DBUtil.close(conn); } }
DAO设计模式
Data Access Object(数据访问对象)
作用:使得底层的数据逻辑和高层的业务逻辑相分离。