zoukankan      html  css  js  c++  java
  • 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. }  

    运行结果:

  • 相关阅读:
    可爱的中国电信 请问我们的电脑还属于我们自己吗?
    了解客户的需求,写出的代码或许才是最优秀的............
    DELPHI DATASNAP 入门操作(3)简单的主从表的简单更新【含简单事务处理】
    用数组公式获取字符在字符串中最后出现的位置
    在ehlib的DBGridEh控件中使用过滤功能(可以不用 MemTableEh 控件 适用ehlib 5.2 ehlib 5.3)
    格式化json返回的时间
    ExtJs中使用Ajax赋值给全局变量异常解决方案
    java compiler level does not match the version of the installed java project facet (转)
    收集的资料(六)ASP.NET编程中的十大技巧
    收集的资料共享出来(五)Asp.Net 权限解决办法
  • 原文地址:https://www.cnblogs.com/wanghuaijun/p/5497071.html
Copyright © 2011-2022 走看看