【问题标题】:How do I use createQuery() Method to create JDBC Connection, using sql2o?如何使用 createQuery() 方法创建 JDBC 连接,使用 sql2o?
【发布时间】:2016-04-01 15:22:02
【问题描述】:

createQuery() 方法想要转换为 Connection 对象,但似乎该方法适用于 SQL2o 对象,因为它在包中...... 我正在使用 sql2o 创建我的数据库连接;但是,我不明白为什么要使用 .createQuery() 方法将其强制转换为 Connection 对象?

import java.io.IOException;
import java.io.PrintWriter;
import java.sql.Connection;

    import java.sql.PreparedStatement;
    import java.sql.ResultSet;
    import java.sql.SQLException;

    import java.util.ArrayList;

   import javax.servlet.ServletException;
   import javax.servlet.annotation.WebServlet;
   import javax.servlet.http.HttpServlet;
   import javax.servlet.http.HttpServletRequest;
   import javax.servlet.http.HttpServletResponse;

   import org.sql2o.Sql2o;

   import com.google.gson.Gson;
   import com.models.Person;
   import com.tools.DBUtil;
   import com.tools.DataTable;



   /**
    * Servlet implementation class SalesTeam
    */
    @WebServlet(name = "SalesTeam_Table", urlPatterns = {                   "/json/table/salesteam" })
    public class Table_SalesTeam extends HttpServlet {
    private static final long serialVersionUID = 1L;

    /**
     * @see HttpServlet#HttpServlet()
     */
    public Table_SalesTeam() {
        super();
        // TODO Auto-generated constructor stub
    }

    /**
     * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse
     *      response)
     */
    protected void doGet(HttpServletRequest request, HttpServletResponse    response)
            throws ServletException, IOException {

        // Creating an arraylist based on the Person model in com.models
        ArrayList<Person> people = new ArrayList<Person>();
        Connection conn = null;
        PreparedStatement pst = null;
        ResultSet rs = null;


        String DB_URL = "jdbc:mysql://localhost:3306/salesteam";
        String USER = "root";
        String PASS = "1234 ";
        Sql2o sql2o = new Sql2o(DB_URL, USER, PASS);

        String sql =
                "SELECT empID, fName " +
                "FROM salesteam " +
                "WHERE empID = 1";


    //issue is here...
        try (Connection con = sql2o.open()){
                people = con.createQuery(sql).executeAndFetch(Person.class);

     ////////////////////////

            //Selecting every record in sales_team table
            //pst = conn.prepareStatement("select f_Name, l_Name, email,           contactNum from sales_team ORDER BY f_Name ASC "); 
            //rs = pst.executeQuery();
            while (rs.next()) {
                //Create a person object and fill fields
                Person p = new Person();
                p.setfName(rs.getString("f_Name"));
                p.setlName(rs.getString("l_Name"));
                p.setEmail(rs.getString("email"));
                p.setContact(rs.getString("contactNum"));

                //Add person to people array list
                people.add(p);
            }
        } catch (SQLException e) {

            e.printStackTrace();
        }finally {
            //Must close the database objects
            DBUtil.close(conn, pst, rs);
        }

        //Gson Library was added to WEB-INF/lib
        //Creating a new gson object to hold json
        Gson gson = new Gson();

        //Create a custom DataTable object that takes an ArrayList<Object> and   makes an object
        //Used to create correct datatable json formatting
        DataTable table = new DataTable();
        table.setData(people);

        //Creating string by converting people arraylist to json string with gson object
        //Read up on gson library for json at http://www.mkyong.com/java/how-do-convert-java-object-to-from-json-format-gson-api/
        String json = gson.toJson(table);

        //Uncomment line below and look in console for what json looks like
        System.out.println(json);

        //Write json string to response
        PrintWriter out = response.getWriter();
        out.print(json);
        out.flush();

    }

    /**
     * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse
     *      response)
     */
    protected void doPost(HttpServletRequest request, HttpServletResponse                 response)
            throws ServletException, IOException {
        // TODO Auto-generated method stub
        doGet(request, response);
    }

   }

【问题讨论】:

    标签: java servlets jdbc import sql2o


    【解决方案1】:

    仔细阅读 Javadoc。 sql2o#open() 返回一个 org.sql2o.Connection,它不继承自 java.sql.Connection。如果你想要底层的 JDBC Connection 对象,你必须调用org.sql2o.Connection#getJdbcConnection()

    似乎 sql2o 已经落伍了,因为最近的 JDBC API 包括方法(Wrapper#unwrap()isWrapperFor())来简化 JDBC 类的自定义实现的使用。

    【讨论】:

    • 我需要一些时间来学习 Javadoc,谢谢你的更新。
    【解决方案2】:

    您的代码是纯 jdbc 和 sql2o 代码的混合体。使用 sql2o 时,不应从 ResultSet 中手动读取。事实上,当您尝试从 ResultSet 中读取数据时,您的代码会抛出 NullPointerException。

    它没有编译的原因是因为你已经导入了java.sql.Connection,而Sql2o.open()方法返回了一个org.sql2o.Connection。我认为你会更容易,如果你只是删除所有引用 JDBC 类。

    您的方法应该如下所示(记得删除所有 JDBC 类的导入):

    protected void doGet(HttpServletRequest request, HttpServletResponse    response)
                throws ServletException, IOException {
    
            String DB_URL = "jdbc:mysql://localhost:3306/salesteam";
            String USER = "root";
            String PASS = "1234 ";
            Sql2o sql2o = new Sql2o(DB_URL, USER, PASS);
    
            String sql =
                    "SELECT empID, fName " +
                    "FROM salesteam " +
                    "WHERE empID = 1";
    
            List<Person> people;
            try (Connection con = sql2o.open()){
                    people = con.createQuery(sql).executeAndFetch(Person.class);
            }
    
            // code to generate json here...
        }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-02-25
      • 2011-03-08
      • 1970-01-01
      • 1970-01-01
      • 2011-11-21
      • 2017-02-07
      相关资源
      最近更新 更多