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. }  

    运行结果:

  • 相关阅读:
    随机产生16进制颜色值
    关于单元测试的思考--Asp.Net Core单元测试最佳实践
    使用xUnit为.net core程序进行单元测试
    SQLSERVER——查看阻塞信息(sp_who_lock优化无误版)
    SQLServer连接查询之Cross Apply和Outer Apply的区别及用法
    .netcore 写日志(使用NLog,log4net)
    概率与影响矩阵
    WebApi Helper帮助文档 swagger
    C# 使用HttpWebRequest Post提交数据,携带Cookie和相关参数示例
    解决哈希(HASH)冲突的主要方法
  • 原文地址:https://www.cnblogs.com/wanghuaijun/p/5497071.html
Copyright © 2011-2022 走看看