jdbc操作mysql

本文讲述2点:

一. jdbc 操作 MySQL 。(封装一个JdbcUtils.java类,实现数据库表的增删改查)

    1. 建立数据库连接

       Class.forName(DRIVER);

       connection = DriverManager.getConnection(URL, USERNAME, PASSWORD);

    2.用PrepareStatement执行sql语句

        pstmt = connection.prepareStatement(sql);

    3. 获得执行Sql结果(int result)或结果集合(ResultSet)

        int result = pstmt.executeUpdate();  (增,删,改)        

        ResultSet resultSet = pstmt.executeQuery(); (查询)       

         // 获取所有列的信息

        ResultSetMetaData metaData = resultSet.getMetaData(); 

二. 用Java反射机制返回JavaBean,List<JavaBean>

       看JdbcUtils.java 中具体代码。

------------------------------------------------------------------------------------------------------------

程序思路:

用eclipse建立一个java 工程,访问mysql数据库。数据库名称:mydb,表格名称:userinfo. user表格有三个属性(id , username , pswd)

工程目录:

1 JdbcUtils.java --封装数据库操作的类

[java] view plain copy
 在CODE上查看代码片派生到我的代码片
  1. package com.jdbc.dbutils;  
  2.   
  3. import java.lang.reflect.Field;  
  4. import java.sql.Connection;  
  5. import java.sql.DriverManager;  
  6. import java.sql.PreparedStatement;  
  7. import java.sql.ResultSet;  
  8. import java.sql.ResultSetMetaData;  
  9. import java.sql.SQLException;  
  10. import java.util.ArrayList;  
  11. import java.util.HashMap;  
  12. import java.util.List;  
  13. import java.util.Map;  
  14.   
  15. import com.jdbc.data.UserInfo;  
  16. import com.mysql.jdbc.Driver;  
  17.   
  18. public class JdbcUtils {  
  19.   
  20.     // 定义数据库的用户名  
  21.     private final String USERNAME = "root";  
  22.     // 定义数据库的密码  
  23.     private final String PASSWORD = "123456";  
  24.     // 定义数据库的驱动信息  
  25.     private final String DRIVER = "com.mysql.jdbc.Driver";  
  26.     // 定义访问数据库的地址  
  27.     private final String URL = "jdbc:mysql://localhost:3306/mydb";  
  28.   
  29.     // 定义访问数据库的连接  
  30.     private Connection connection;  
  31.     // 定义sql语句的执行对象  
  32.     private PreparedStatement pstmt;  
  33.     // 定义查询返回的结果集合  
  34.     private ResultSet resultSet;  
  35.   
  36.     public JdbcUtils() {  
  37.         // TODO Auto-generated constructor stub  
  38.         try {  
  39.             Class.forName(DRIVER);  
  40.             System.out.println("注册驱动成功!!");  
  41.         } catch (ClassNotFoundException e) {  
  42.             // TODO Auto-generated catch block  
  43.             System.out.println("注册驱动失败!!");  
  44.         }  
  45.   
  46.     }  
  47.   
  48.     // 定义获得数据库的连接  
  49.     public Connection getConnection() {  
  50.   
  51.         try {  
  52.             connection = DriverManager.getConnection(URL, USERNAME, PASSWORD);  
  53.   
  54.         } catch (Exception e) {  
  55.             // TODO: handle exception  
  56.             System.out.println("Connection exception !");  
  57.         }  
  58.   
  59.         return connection;  
  60.   
  61.     }  
  62.   
  63.     /** 
  64.      * 完成对数据库标的增加删除和修改的操作 
  65.      *  
  66.      * @param sql 
  67.      * @param params 
  68.      * @return 
  69.      * @throws SQLException 
  70.      */  
  71.     public boolean updateByPreparedStatement(String sql, List<Object> params)  
  72.             throws SQLException {  
  73.         boolean flag = false;  
  74.         int result = -1;// 表示当用户执行增加删除和修改的操作影响的行数  
  75.         int index = 1; // 表示 占位符 ,从1开始  
  76.         pstmt = connection.prepareStatement(sql);  
  77.         if (params != null && !params.isEmpty()) {  
  78.             for (int i = 0; i < params.size(); i++) {  
  79.                 pstmt.setObject(index++, params.get(i)); // 填充占位符  
  80.             }  
  81.         }  
  82.   
  83.         result = pstmt.executeUpdate();  
  84.         flag = result > 0 ? true : false;  
  85.         return flag;  
  86.   
  87.     }  
  88.   
  89.     /** 
  90.      * 查询返回单条记录 
  91.      *  
  92.      * @param sql 
  93.      * @param params 
  94.      * @return 
  95.      * @throws SQLException 
  96.      */  
  97.     public  Map<String, Object> findSimpleResult(String sql, List<Object> params)  
  98.             throws SQLException {  
  99.         Map<String, Object> map = new HashMap<String, Object>();  
  100.         pstmt = connection.prepareStatement(sql);  
  101.         int index = 1;  
  102.         if (params != null && !params.isEmpty()) {  
  103.             for (int i = 0; i < params.size(); i++) {  
  104.                 pstmt.setObject(index++, params.get(i));  
  105.             }  
  106.         }  
  107.         resultSet = pstmt.executeQuery(); // 返回查询结果  
  108.   
  109.         ResultSetMetaData metaData = pstmt.getMetaData(); // 获取 结果中,一行所有列的结果  
  110.         int cols_len = metaData.getColumnCount(); // 获得列的总数  
  111.   
  112.         while (resultSet.next()) {  
  113.             for (int i = 0; i < cols_len; i++) {  
  114.                 String col_name = metaData.getColumnName(i + 1); // 获得第i列的字段名称  
  115.                 Object col_value = resultSet.getObject(col_name);// 返回 第i列的内容值  
  116.                 if (col_value == null) {  
  117.                     col_value = "";  
  118.                 }  
  119.                 map.put(col_name, col_value);  
  120.             }  
  121.   
  122.         }  
  123.   
  124.         return map;  
  125.     }  
  126.   
  127.     /** 
  128.      * 查询返回多条记录 
  129.      *  
  130.      * @param sql 
  131.      * @param params 
  132.      * @return 
  133.      * @throws SQLException 
  134.      */  
  135.     public List<Map<String, Object>> findMoreResult(String sql,  
  136.             List<Object> params) throws SQLException {  
  137.         List<Map<String, Object>> list = new ArrayList<Map<String, Object>>();  
  138.         pstmt = connection.prepareStatement(sql);  
  139.         int index = 1; // 表示占位符  
  140.         if (params != null && !params.isEmpty()) {  
  141.             for (int i = 0; i < params.size(); i++) {  
  142.                 pstmt.setObject(index++, params.get(i));  
  143.             }  
  144.         }  
  145.         resultSet = pstmt.executeQuery(); // 返回查询结果集合  
  146.         ResultSetMetaData metaData = resultSet.getMetaData(); // 获得列的结果  
  147.   
  148.         while (resultSet.next()) {  
  149.             Map<String, Object> map = new HashMap<String, Object>();  
  150.             int cols_len = metaData.getColumnCount(); // 获取总的列数  
  151.             for (int i = 0; i < cols_len; i++) {  
  152.                 String col_name = metaData.getColumnName(i + 1); // 获取第 i列的字段名称  
  153.                                                                     // ,列计算从1开始  
  154.                 Object col_value = resultSet.getObject(col_name); // 获取第i列的内容值  
  155.                 if (col_value == null) {  
  156.                     col_value = "";  
  157.                 }  
  158.   
  159.                 map.put(col_name, col_value);  
  160.             }  
  161.             list.add(map);  
  162.         }  
  163.   
  164.         return list;  
  165.   
  166.     }  
  167.   
  168.     /** 
  169.      * 查询返回单个JavaBean(使用java反射机制) 
  170.      *  
  171.      * @param sql 
  172.      * @param params 
  173.      * @param cls 
  174.      * @return 
  175.      * @throws Exception 
  176.      */  
  177.     public <T> T findSimpleRefResult(String sql, List<Object> params,  
  178.             Class<T> cls) throws Exception {  
  179.         T resultObject = null;  
  180.         int index = 1; // 占位符  
  181.         pstmt = connection.prepareStatement(sql);  
  182.         if (params != null && !params.isEmpty()) {  
  183.             for (int i = 0; i < params.size(); i++) {  
  184.                 pstmt.setObject(index++, params.get(i)); // 填充占位符  
  185.             }  
  186.         }  
  187.         resultSet = pstmt.executeQuery(); // 获取查询结果  
  188.   
  189.         ResultSetMetaData metaData = resultSet.getMetaData(); // 获取列的信息  
  190.         int cols_len = metaData.getColumnCount(); // 获取总的列数  
  191.         while (resultSet.next()) {  
  192.             // 通过反射机制创建实例  
  193.             resultObject = cls.newInstance(); // java反射机制  
  194.             for (int i = 0; i < cols_len; i++) {  
  195.                 String col_name = metaData.getColumnName(i + 1); // 获取第i列的名称  
  196.                 Object col_value = resultSet.getObject(col_name); // 获取第i列的值  
  197.                 if (col_value == null) {  
  198.                     col_value = "";  
  199.                 }  
  200.                 Field field = cls.getDeclaredField(col_name);  
  201.                 field.setAccessible(true);// 打开 JavaBean的访问 private权限  
  202.                 field.set(resultObject, col_value);  
  203.             }  
  204.   
  205.         }  
  206.   
  207.         return resultObject;  
  208.     }  
  209.   
  210.     /** 查询返回多个JavaBean(通过java反射机制) 
  211.      * @param sql 
  212.      * @param params 
  213.      * @param cls 
  214.      * @return 
  215.      * @throws Exception 
  216.      */  
  217.     public <T> List<T> findMoreRefResult(String sql, List<Object> params,  
  218.             Class<T> cls) throws Exception {  
  219.         List<T> list = new ArrayList<T>();  
  220.         int index = 1; //占位符  
  221.         pstmt = connection.prepareStatement(sql);  
  222.         if (params != null && !params.isEmpty()) {  
  223.             for (int i = 0; i < params.size(); i++) {  
  224.                 pstmt.setObject(index++, params.get(i));  
  225.             }  
  226.         }  
  227.         resultSet = pstmt.executeQuery(); // 返回查询结果集合  
  228.   
  229.         ResultSetMetaData metaData = resultSet.getMetaData(); // 返回列的信息  
  230.         int cols_len = metaData.getColumnCount(); // 结果集中总的列数  
  231.         while (resultSet.next()) {  
  232.             // 通过反射机制创建一个java实例  
  233.             T resultObject = cls.newInstance();  
  234.             for (int i = 0; i < cols_len; i++) {  
  235.                 String col_name = metaData.getColumnName(i + 1); // 获得第i列的名称  
  236.                 Object col_value = resultSet.getObject(col_name); // 获得第i列的内容  
  237.                 if (col_value == null) {  
  238.                     col_value = "";  
  239.                 }  
  240.                 Field field = cls.getDeclaredField(col_name);  
  241.                 field.setAccessible(true); // 打开JavaBean的访问private权限  
  242.                 field.set(resultObject, col_value);  
  243.             }  
  244.             list.add(resultObject);  
  245.   
  246.         }  
  247.   
  248.         return list;  
  249.     }  
  250.       
  251.     /**关闭数据库访问 
  252.      * @throws SQLException 
  253.      */  
  254.     public void releaseConn() throws SQLException{  
  255.         if (resultSet!=null) {  
  256.             resultSet.close();  
  257.         }  
  258.         if (pstmt!=null) {  
  259.             pstmt.close();  
  260.         }  
  261.         if (connection!=null) {  
  262.             connection.close();  
  263.         }  
  264.     }  
  265.   
  266.       
  267. }  

2. UserInfo.java (用来验证java反射机制的JavaBean , 属性名称和数据表userinfo的字段完全一致)

[java] view plain copy
 在CODE上查看代码片派生到我的代码片
  1. package com.jdbc.data;  
  2.   
  3. import java.io.Serializable;  
  4.   
  5. public class UserInfo implements Serializable {  
  6.   
  7.     /** 
  8.      *  
  9.      */  
  10.     private static final long serialVersionUID = 1L;  
  11.     private int id;  
  12.     private String username;  
  13.     private String pswd;  
  14.   
  15.     public UserInfo() {  
  16.         // TODO Auto-generated constructor stub  
  17.     }  
  18.   
  19.     public int getId() {  
  20.         return id;  
  21.     }  
  22.   
  23.     public void setId(int id) {  
  24.         this.id = id;  
  25.     }  
  26.   
  27.     public String getUsername() {  
  28.         return username;  
  29.     }  
  30.   
  31.     public void setUsername(String username) {  
  32.         this.username = username;  
  33.     }  
  34.   
  35.     public String getPswd() {  
  36.         return pswd;  
  37.     }  
  38.   
  39.     public void setPswd(String pswd) {  
  40.         this.pswd = pswd;  
  41.     }  
  42.   
  43.     public static long getSerialversionuid() {  
  44.         return serialVersionUID;  
  45.     }  
  46.   
  47.     @Override  
  48.     public String toString() {  
  49.         return "UserInfo [id=" + id + ", username=" + username + ", pswd="  
  50.                 + pswd + "]";  
  51.     }  
  52.       
  53. }  

3. Test_insert.java  测试添加 

[java] view plain copy
 在CODE上查看代码片派生到我的代码片
  1. package com.jdbc.test;  
  2.   
  3. import java.sql.SQLException;  
  4. import java.util.ArrayList;  
  5. import java.util.List;  
  6.   
  7. import com.jdbc.dbutils.JdbcUtils;  
  8.   
  9. public class Test_Insert {  
  10.   
  11.     /** 
  12.      * @param args 
  13.      * @throws SQLException  
  14.      */  
  15.     public static void main(String[] args) throws SQLException {  
  16.       
  17.             JdbcUtils jdbcUtils = new JdbcUtils();  
  18.             jdbcUtils.getConnection();  
  19.               
  20.             //增加一条记录。新增一个用户信息 uername = "jack" , password = "admin"   
  21.             String sql = "insert into userinfo(username,pswd) values(?,?)";  
  22.             List<Object> params = new ArrayList<Object>();  
  23.             params.add("jack");  
  24.             params.add("admin");  
  25.               
  26.           
  27.             try {  
  28.                 boolean flag = jdbcUtils.updateByPreparedStatement(sql, params);      
  29.                 System.out.println("添加一条记录: "+flag);  
  30.             } catch (Exception e) {  
  31.                 // TODO: handle exception  
  32.                 e.printStackTrace();  
  33.             }finally{  
  34.                 jdbcUtils.releaseConn();  
  35.             }  
  36.   
  37.   
  38.     }  
  39.   
  40. }  

运行结果:

(用同样的方法,再增加一条记录username="rose",pswd="123"),此时数据库共2条记录。如下图:

4. Test_FindMore.java (查询多条记录) 

[java] view plain copy
 在CODE上查看代码片派生到我的代码片
  1. package com.jdbc.test;  
  2.   
  3. import java.sql.SQLException;  
  4. import java.util.ArrayList;  
  5. import java.util.List;  
  6. import java.util.Map;  
  7.   
  8. import com.jdbc.dbutils.JdbcUtils;  
  9.   
  10. public class Test_FindMore {  
  11.   
  12.     /** 返回多条记录 
  13.      * @param args 
  14.      * @throws Exception  
  15.      */  
  16.     public static void main(String[] args) throws Exception {  
  17.         // TODO Auto-generated method stub  
  18.         JdbcUtils jdbcUtils = new JdbcUtils();  
  19.         jdbcUtils.getConnection();    
  20.         String sql = "select * from userinfo";    
  21.           
  22.         try {  
  23.             List<Map<String, Object>> list = jdbcUtils.findMoreResult(sql, null);  
  24.             System.out.println(list);  
  25.         } catch (Exception e) {  
  26.             // TODO: handle exception  
  27.             e.printStackTrace();  
  28.         }finally{  
  29.             jdbcUtils.releaseConn();  
  30.         }  
  31.   
  32.     }  
  33.   
  34. }  

运行结果:

5. Test_FindSimple.java (查询返回单条记录)

[java] view plain copy
 在CODE上查看代码片派生到我的代码片
  1. package com.jdbc.test;  
  2.   
  3. import java.sql.SQLException;  
  4. import java.util.ArrayList;  
  5. import java.util.List;  
  6. import java.util.Map;  
  7.   
  8. import com.jdbc.dbutils.JdbcUtils;  
  9.   
  10. public class Test_FindSimple {  
  11.   
  12.     /**查询返回一条记录 
  13.      * @param args 
  14.      * @throws SQLException  
  15.      */  
  16.     public static void main(String[] args) throws SQLException {  
  17.         // TODO Auto-generated method stub  
  18.         JdbcUtils jdbcUtils = new JdbcUtils();  
  19.         jdbcUtils.getConnection();    
  20.         String sql = "select * from userinfo where username = ?";         
  21.         List<Object> params = new ArrayList<Object>();  
  22.         params.add("rose");  
  23.         try {  
  24.             Map<String, Object> map = jdbcUtils.findSimpleResult(sql, params);  
  25.             System.out.println(map);  
  26.         } catch (Exception e) {  
  27.             // TODO: handle exception  
  28.             e.printStackTrace();  
  29.         }finally{  
  30.             jdbcUtils.releaseConn();  
  31.         }  
  32.   
  33.     }  
  34.   
  35. }  

运行结果:

6.Test_RefMore.java 查询返回List<JavaBean>(使用Java反射机制)

[java] view plain copy
 在CODE上查看代码片派生到我的代码片
  1. package com.jdbc.test;  
  2.   
  3. import java.sql.SQLException;  
  4. import java.util.List;  
  5. import java.util.Map;  
  6.   
  7. import com.jdbc.data.UserInfo;  
  8. import com.jdbc.dbutils.JdbcUtils;  
  9.   
  10. public class Test_RefMore {  
  11.   
  12.     /**返回List<JavaBean> (用Java反射机制) 
  13.      * @param args 
  14.      * @throws SQLException  
  15.      */  
  16.     public static void main(String[] args) throws SQLException {  
  17.         // TODO Auto-generated method stub  
  18.         JdbcUtils jdbcUtils = new JdbcUtils();  
  19.         jdbcUtils.getConnection();    
  20.         String sql = "select * from userinfo";    
  21.           
  22.         try {  
  23.             List<UserInfo> list = jdbcUtils.findMoreRefResult(sql, null , UserInfo.class);  
  24.             System.out.println(list);  
  25.         } catch (Exception e) {  
  26.             // TODO: handle exception  
  27.             e.printStackTrace();  
  28.         }finally{  
  29.             jdbcUtils.releaseConn();  
  30.         }  
  31.   
  32.     }  
  33.   
  34. }  

7. Test_RefSimple.java 查询返回单个JavaBean (使用Java反射机制)

[java] view plain copy
 在CODE上查看代码片派生到我的代码片
  1. package com.jdbc.test;  
  2.   
  3. import java.sql.SQLException;  
  4. import java.util.ArrayList;  
  5. import java.util.List;  
  6. import java.util.Map;  
  7.   
  8. import com.jdbc.data.UserInfo;  
  9. import com.jdbc.dbutils.JdbcUtils;  
  10.   
  11. public class Test_RefSimple {  
  12.   
  13.     /**返回一个JavaBean (用Java反射机制) 
  14.      * @param args 
  15.      * @throws SQLException  
  16.      */  
  17.     public static void main(String[] args) throws SQLException {  
  18.         // TODO Auto-generated method stub  
  19.         JdbcUtils jdbcUtils = new JdbcUtils();  
  20.         jdbcUtils.getConnection();    
  21.         String sql = "select * from userinfo where username = ?";         
  22.         List<Object> params = new ArrayList<Object>();  
  23.         params.add("rose");  
  24.           
  25.         try {  
  26.             UserInfo userInfo = jdbcUtils.findSimpleRefResult(sql, params, UserInfo.class);  
  27.             System.out.println(userInfo);  
  28.         } catch (Exception e) {  
  29.             // TODO: handle exception  
  30.             e.printStackTrace();  
  31.         }finally{  
  32.             jdbcUtils.releaseConn();  
  33.         }  
  34.   
  35.     }  
  36.   
  37. }  

运行结果:

原文地址:https://www.cnblogs.com/wanghuaijun/p/5497071.html