4.3 连接MySQL数据库

MySQL以其易于使用和管理、跨平台、开源等优点倍受程序员的青睐,也成为一些中小型网站的首选数据库。下面将通过几个具体实例介绍如何在JSP中连接MySQL数据库。

实例081 通过JDBC连接MySQL数据库

本实例是一个实用的程序

实例位置:光盘\mingrisoft\04\081

实例说明

在开发中小型Web应用程序时,采用MySQL数据库比较方便。要应用MySQL数据库,首先必须连接MySQL数据库。在JSP中连接MySQL数据库的方法有多种,本实例将介绍如何通过JDBC连接MySQL数据库。运行本实例,输入管理员名称和管理员密码(如图4.35)后,单击“登录”按钮,即可连接MySQL数据库并判断输入的管理员名称和密码是否正确,并返回相应的信息。当输入管理员名称为mr,密码为mrsoft时,将弹出“登录成功”的对话框。

图4.35 通过JDBC连接数据库

技术要点

目前,MySQL的JDBC包主要有Jconnector和org.git.mm.mysql,下面分别介绍。

(1)Jconnector包。

Jconnector包是MySQL官方网站公布的,其更新速度比较快,很多程序员都使用该包。

(2)org.git.mm.mysql包。

org.git.mm.mysql包是国外一些Java爱好者编写的,出现的时间比较长,国际化程度做得比较好,而且对中文支持也比较好。本实例使用的就是该包。

连接MySQL数据库的驱动程序,代码如下:

        org.gjt.mm.mysql.Driver

URL地址的代码如下:

        jdbc:mysql://IP:PORT/databaseName?user=UserName&password=PWD&useUnicode=true

解释说明:

● IP:是指MySQL主机的IP地址。

● PORT:是指MySQL主机的端口号,3306为安装MySQL时的默认端口号。

● databaseName:是数据库名称。

● UserName:是使用MySQL数据库的用户名。

● PWD:是使用MySQL数据库的密码。

● useUnicode:用于设置是否使用Unicode输出。

实现过程

(1)编写连接MySQL数据库的JavaBean“ConnDB”,将其保存到com.core包中。首先定义相应的全局变量;然后定义构造方法,通过Class.forName加载驱动程序;最后定义执行查询操作的方法executeQuery()。关键代码如下:

        package com.core;
        import java.sql.*;
        public class ConnDB{
            public Connection conn=null;
            public Statement stmt=null;
            public ResultSet rs=null;
        }
        public ConnDB(){                                 //加载数据库驱动
            try{
                Class.forName("org.gjt.mm.mysql.Driver");
            }catch(java.lang.ClassNotFoundException e){
                System.err.println(e.getMessage());
            }
        }
        public ResultSet executeQuery(String sql){       //定义查询数据库数据的方法
            try{
                conn=DriverManager.getConnection("jdbc:mysql://127.0.0.1:3306/db_database04?user=root&password= 111&use
    Unicode=true");
              stmt=conn.createStatement(ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ ONLY);
              rs=stmt.executeQuery(sql);
            }catch(SQLException ex){
                System.err.println(ex.getMessage());
            }finally{}
                return rs;
        }

(2)在com.core.Deal类中编写验证管理员身份的方法checkManager(),在该方法中创建一个ConnDB对象的实例,调用executeQuery()方法查询管理员信息,关键代码如下。

        public int checkManager(String name,String inpwd) {
              int flag = 0;
              ConnDB conn=new ConnDB();                                        //实例化数据库操作类
              String sql="SELECT*FROM tb_manager where name='"+name+"'";       //定义SQL语句
              ResultSet rs=conn.executeQuery(sql);                             //调用executeQuery()方法执行查询语句
              …  //此处省略了验证管理员名称和密码的代码
              return flag;
        }

(3)创建index.jsp页面,添加form表单,提交管理员的用户名和密码。

(4)创建deal.jsp页面,调用checkManager()方法验证管理员身份,关键代码如下:

        <jsp:useBean id="deal" class="com.core.Deal" scope="page"/>
        <%
        String manager=request.getParameter("manager");
        String pwd=request.getParameter("pwd");
        int rtn=deal.checkManager(manager,pwd);
        if(rtn==0){
            out.println("<script>alert('登录失败!');window.location.href='index.jsp';</script>");
        }else{
            out.println("<script>alert('登录成功!');window.location.href='index.jsp';</script>");
        }
        %>

举一反三

根据本实例,读者可以:

将数据库连接所需的信息保存到Properties文件中,以连接MySQL数据库。

实例082 通过Tomcat连接池连接MySQL数据库

这时一个可以提高基础技能的实例

实例位置:光盘\mingrisoft\04\082

实例说明

本实例将介绍如何通过Tomcat连接池技术访问MySQL数据库。运行本实例,如图4.36所示。

图4.36 通过Tomcat连接池连接MySQL数据库

技术要点

本实例中配置Tomcat连接池主要使用的是<Resource>标签,有关该标签中属性的详细讲解请参考实例076中的技术要点。

本实例中在当前项目的META-INF文件夹内新建的context.xml文件的代码如下:

        <Context antiJARLocking="true" path="/082">
            <Resource name="jdbc/082"
                type="javax.sql.DataSource"
                username="root"
                password="111"
                driverClassName="com.mysql.jdbc.Driver"
                url="jdbc:mysql://localhost:3306/db_database04"
                initialSize="10"
                maxActive="5"
                maxIdle="20"
                minIdle="5"
                maxWait="-1"
            />
        </Context>

说明:本实例应用的是Tomcat 6.0服务器。

实现过程

(1)下载MySQL驱动包并复制到tomcat安装目录的lib文件夹下。本实例使用的是mysql-connector-java-3.0.16-ga-bin.jar包。

说明:本实例是应用Eclipse开发的,使用的是Eclipse自带的Tomcat 6.0服务器。Tomcat服务器存储在Eclipse中的plugins文件夹下。

(2)在当前项目的META-INF文件夹内新建context.xml文件,有关该文件的配置请参考技术要点的内容。

(3)创建UserBean类封装数据记录,并且编写getConnection()方法从数据库连接池中获取数据库连接,编写findAll()方法查询数据表中的数据,并将查询结果集添加到List集合中。关键代码如下:

        public Connection getConnection() {
            Connection con=null;                                              //声明Connection对象
            try {
                Context initctx=new InitialContext();                          //创建Context对象
                Context envContext = (Context) initctx.lookup("java:comp/env");
                DataSource ds=(DataSource)envContext.lookup("jdbc/082");      //按照JNDI名称查找
                con=ds.getConnection();                                      //创建Connection对象
            } catch (Exception ex) {
                ex.printStackTrace();
            }
            return con;
        }
        public List findAll(){
            List list=new ArrayList();                                         //声明list对象
            try {
                Connection con=getConnection();                               //创建数据库连接
                Statement st=con.createStatement();                           //创建Statmenet对象
                ResultSet rs=st.executeQuery("select*from tb_bookinfo");       //执行SQL语句
                while (rs.next()) {
                    UserBean bean=new UserBean();                   //声明UserBean,并为UserBean的属性赋值
                    bean.setId(Integer.valueOf(rs.getInt("id")));
                    bean.setBookname(rs.getString("bookname"));
                    bean.setAuthor(rs.getString("author"));
                    bean.setPrice(rs.getString("price"));
                    list.add(bean);                               //添加到list列表
                }
              rs.close();                                         //关闭rs对象
              st.close();                                         //关闭st对象
              con.close();                                        //关闭con对象
            } catch (SQLException ex) {
                ex.printStackTrace();
            }
            return list;                                           //返回list列表
        }

(4)创建index.jsp页面,输出从数据库中查询出的结果集,代码如下:

        <%@page  import="java.util.*"%>
        <%@page  import="com.pkh.UserBean"%>
        <%@page contentType="text/html" pageEncoding="GBK"%>
        <jsp:useBean id="user" class="com.pkh.UserBean"/>
        <%
            List list = user.findAll();
            for (int i = 0; i < list.size(); i++) {
              UserBean ub = (UserBean)list.get(i);
        %>
        <tr align="center" valign="middle">
            <td class="tr2"><%= ub.getId() %></td>
            <td class="tr2"><%= ub.getBookname() %></td>
            <td class="tr2"><%= ub.getAuthor() %></td>
            <td class="tr2"><%= ub.getPrice() %></td>
        </tr>
        <%
            }
        %>

举一反三

根据本实例,读者可以:

对MySQL数据库下的表进行操作。

实例083 应用Hibernate连接MySQL数据库

本实例是一个典型的、连接数据库的程序

实例位置:光盘\mingrisoft\04\083

实例说明

本例将介绍如何通过Hibernate连接MySQL数据库,通过前面两个例子,你可能已经想到了需要改动的地方,没错,还是修改Hibernate配置文件,这就是在软件的底层采用Hibernate持久层技术实现数据持久化的好处之一,在深入学习的过程中,你会发现它更多的优点。运行本实例,图4.37所示为连接MySQL数据库得到的查询结果。

图4.37 应用Hibernate连接数据库

技术要点

在连接MySQL数据库时,Hibernate配置文件的配置代码如下:

        <hibernate-configuration>
          <session-factory>
            <property name="connection.driver_class">com.mysql.jdbc.Driver</property>
            <property name="connection.url">
            jdbc:mysql://127.0.0.1:3306/db_database04
            </property>
            <property name="connection.username">root</property>
            <property name="connection.password"></property>
            <property name="dialect">org.hibernate.dialect.MySQLDialect</property>
            <property name="show_sql">true</property>
            <mapping resource="mrgf/HibernateJoin.hbm.xml"/>
          </session-factory>
        </hibernate-configuration>

元素connection.driver_class指定的驱动包为com.mysql.jdbc.Driver,具体为mysql-connector-java-3.0.16-ga-bin.jar,需要将它复制到Web工程的WEB-INF/lib文件夹下。

元素connection.url指定连接IP为127.0.0.1的计算机上的MySQL数据库,数据库名称是db_database04。读者在运行本例时需要改为本机(即127.0.0.1或localhost)。

元素dialect指定的是MySQL数据库自己的方言。

实现过程

(1)创建数据表。表结构如图4.38所示。

图4.38 数据表结构图

(2)配置Hibernate配置文件。将该文件存储于src文件夹下,代码可参见本例的“技术要点”。

(3)编写持久化类HibernateJoin.java及其对应的映射文件HibernateJoin.hbm.xml。持久化类关键代码如下:

        public class HibernateJoin {
              // 限于篇幅,在此只给出了几个属性类型有代表性的属性
              private String bookname;
              private float price;
              private int id;
              public String getBookname() {
              return bookname;
              }
              public float getPrice() {
              return price;
              }
              public int getId() {
              return id;
              }
              public void setBookname(String bookname) {
              this.bookname = bookname;
              }
              public void setPrice(float price) {
              this.price = price;
              }
              public void setId(int id) {
              this.id = id;
              }
        }

映射文件负责建立持久化类中属性与数据库表中字段之间的映射关系。关键代码如下:

        <hibernate-mapping>
            <class name="mrgf.HibernateJoin" table="tb_bookinfo">
              <id name="id" column="id" type="int"/>
              <property name="bookname"  column="bookname"  type="string"/>
              <property name="price"  column="price"  type="float"/>
            </class>
        </hibernate-mapping>

注意:本例中持久化类与对应的数据表没有采用同一个名字,建议在实际开发中采用相同的名字,便于软件的开发和后期维护。

(4)编写基于持久化的业务逻辑类Hibernate。关键代码如下:

        public class Hibernate {
            public Hibernate() {
            }
            private static SessionFactory sessionFactory;        // 在静态快中加载Hibernate配置信息
            static {
                try {
                    Configuration config = new Configuration().configure();
                    sessionFactory = config.buildSessionFactory();
                } catch (Exception e) {
                    System.out.println("------在初始化hibernate时抛出异常,内容如下:");
                    e.printStackTrace();
                }
            }
            private Session session = null;
            private Transaction tx = null;
            public List query(String hql){                     //检索对象
            session=sessionFactory.openSession();              //打开Session,开启事物
                tx = session.beginTransaction();
                List result=null;                              //检索数据
                try {
                    Query query = session.createQuery(hql);
                    result = query.list();
                } catch (Exception e) {
                    System.out.println("------在检索对象时抛出异常,内容如下:");
                    e.printStackTrace();
                }
                tx.commit();                                  //提交事物
                session.close();                              //关闭Session
                return result;
              }
        }

(5)创建index.jsp页面,输出查询结果。关键代码如下:

        <%
            Hibernate hibernate = new Hibernate();
            List result=hibernate.query("from HibernateJoin");
            for(int i=0;i<result.size();i++){
                HibernateJoin join=(HibernateJoin)result.get(i);
        %>
        <tr align="center">
            <td><%=join.getBarcode() %></td>
            <td><%=join.getName()%></td>
            <td><%=join.getAuthor() %></td>
            <td><%=join.getPage() %></td>
            <td><%=join.getPrice() %></td>
        </tr>
        <%  }   %>

举一反三

根据本实例,读者可以:

通过MySQL数据库实现数据的增删改查操作;

利用MySQL数据库开发一个家庭成员日记软件。