在 JavaWeb 中使用 JDBC 进行相关数据的操作。
在这里只是讲一下简单的应用,不涉及 MVC 模式。
① 利用 c3p0 数据库连接池获取数据库连接。
② 利用 dbutils 工具类操作数据库。
③ 利用 beanutils 工具类操作 JavaBean。
1.下载相关包
当然,你可以自己到相应的官网下载。
这里也提供全套的 jar 包下载,百度云链接: https://pan.baidu.com/s/1aSDHhDx5T3Y1-FUxYvpncA&shfl=shareset 提取码: ncv7。失效请联系博主。
其中 Codec 包是用来进行特殊编码和解码的。
2.在JavaWeb中简单使用 JDBC
①在 Ecplise 中创建一个动态的 Web 工程 。
②在 Web 根目录下的 WEB-INF/lib 目录下,导入下载好的 jar 包。
③在 src 目录下新建包,存放相应的 java 文件,当然,都放在一个包里也可以。如下图:
下面用到的 src,下载地址:链接: https://pan.baidu.com/s/1MHoMuvXXb0Fx_ehlWVE87g&shfl=shareset 提取码: sv8y。失效请联系博主。
下载后解压后,别忘记了 先将下载要用的 jar 包导入 lib,再修改你的 c3p0-config.xml 配置文件:修改的你数据库 jdbcUrl、用户名、密码。
期间用到的数据库表为 user,字段为:userId(int)、userName(varchar)、password(vrachar)、age(int)、address(varchar)、email(varchar)。
之后以 Java Application 形式运行 UserDAOJDBCImplTest.java 文件测试即可。
相关介绍:
dao包---------Data Access Object 接口类
domain包---------存放JavaBean
impl包---------存放DAO的实现类
servlet包---------存放用到的servlet
test包---------junit测试包
utils包---------工具类
c3p0-config.xml---------c3p0配置信息
在JavaWeb中简单使用中,我们先把所有的类文件放在一个包里。
例子:使用c3p0数据库连接池,获取 MySQL 数据库连接,之后利用 DButils 操作数据库,查询数据库记录并返回对应的 JavaBean 对象,或数据库的查询结果、更新数据库记录。数据库的一张 user 表如下:
在这里建议,开发 Java 项目的话,数据表字段名建议用 小驼峰命名法 命名。
user_id
user_name
password
age
address
email
1
root
root
10
山东临沂
root @crainyday.com
2
admin
admin
20
山东济南
admin @crainyday.com
3
user
user
30
山东泰安
user @crainyday.com
修改数据表字段名:
userId
userName
password
age
address
email
1
root
root
10
山东临沂
root @crainyday.com
2
admin
admin
20
山东济南
admin @crainyday.com
3
user
user
30
山东泰安
user @crainyday.com
分文件介绍:
A.创建表对应的 JavaBean
JavaBean 属性与 user 表一一对应,属性名用小驼峰命名法,setter和getter用大驼峰命名。
为了方便编程,可以将数据库表的字段名也用 小驼峰命名法,这样的话,写对该表操作的 SQL 语句时方便很多。
例如:对同一种查询,数据库字段用下划线命名法命名的话,要这样写:“SELECT user_id as userId,user_name as userName,password,age,address,email FROM user WHERE user_name = ?”。
数据库字段用小驼峰命名法命名的话,就可以这样写:“SELECT * FROM user WHERE userName = ?”。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 package com.crainyday.web;public class User { private int userId; private String userName; private String password; private int age; private String address; private String email; public User () { super (); } public int getUserId () { return userId; } public void setUserId (int userId) { this .userId = userId; } public String getUserName () { return userName; } public void setUserName (String userName) { this .userName = userName; } public String getPassword () { return password; } public void setPassword (String password) { this .password = password; } public int getAge () { return age; } public void setAge (int age) { this .age = age; } public String getAddress () { return address; } public void setAddress (String address) { this .address = address; } public String getEmail () { return email; } public void setEmail (String email) { this .email = email; } @Override public String toString () { return "User [userId=" + userId + ", userName=" + userName + ", password=" + password + ", age=" + age + ", address=" + address + ", email=" + email + "]" ; } }
B.JDBCUtils工具类
利用 c3p0 连接池获取数据源,下面只是初步的工具类,不涉及事务操作。
注意:需要在 src 目录下有 c3p0-config.xml 文件,JDBCUtils.java 中的数据源名为:c3p0-config.xml文件中的named-config标签中的 name 属性值。
c3p0-config.xml:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 <?xml version="1.0" encoding="utf-8"?> <c3p0-config > <default-config > <property name ="driverClass" > com.mysql.cj.jdbc.Driver</property > <property name ="jdbcUrl" > jdbc:mysql://127.0.0.1:3306/design?useSSL=false&serverTimezone=GMT%2B8&useUnicode=true&characterEncoding=UTF-8</property > <property name ="user" > root</property > <property name ="password" > root</property > <property name ="initialPoolSize" > 5</property > <property name ="maxPoolSize" > 10</property > </default-config > <named-config name ="web" > </named-config > </c3p0-config >
JDBCUtils.java:
One More Thing 👇
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 package com.crainyday.web;import java.sql.Connection;import java.sql.SQLException;import javax.sql.DataSource;import com.mchange.v2.c3p0.ComboPooledDataSource;public class JDBCUtils { private static DataSource ds = null ; static { ds = new ComboPooledDataSource("web" ); } public static void release (Connection connection) { try { if (connection != null ) { connection.close(); } } catch (SQLException e) { e.printStackTrace(); } } public static Connection getConnection () throws SQLException { return ds.getConnection(); } }
C.最基础DAO
封装了基本的 CRUD (增加Create、读取Read、更新Update和删除Delete)的方法, 以供子类继承使用。
这里的 DAO 无事务操作,故直接在方法中利用 JDBCUtils 获取数据库连接。
采用 DBUilts 操作数据库。
返回查询到的某一条记录对应的 JavaBean 对象,或返回查询的某些记录对应的 JavaBean 对象的 List 对象,或返回查询结果的数值。
DAO.java:
One More Thing 👇
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 package com.crainyday.web;import java.lang.reflect.ParameterizedType;import java.lang.reflect.Type;import java.sql.Connection;import java.util.List;import org.apache.commons.dbutils.QueryRunner;import org.apache.commons.dbutils.handlers.BeanHandler;import org.apache.commons.dbutils.handlers.BeanListHandler;import org.apache.commons.dbutils.handlers.ScalarHandler;public class DAO <T > { private QueryRunner qr = new QueryRunner(); private Class<T> clazz; @SuppressWarnings ("unchecked" ) public DAO () { Type superClass = getClass().getGenericSuperclass(); if (superClass instanceof ParameterizedType) { ParameterizedType parameterizedType = (ParameterizedType) superClass; Type [] typeArgs = parameterizedType.getActualTypeArguments(); if (typeArgs != null && typeArgs.length > 0 ) { if (typeArgs[0 ] instanceof Class) { clazz = (Class<T>) typeArgs[0 ]; } } } } public <E> E getForValue (String sql, Object ...args) { Connection connection = null ; try { connection = JDBCUtils.getConnection(); return (E) qr.query(connection, sql, new ScalarHandler<E>(), args); } catch (Exception e) { e.printStackTrace(); }finally { JDBCUtils.release(connection); } return null ; } public List<T> getForList (String sql, Object ...args) { Connection connection = null ; try { connection = JDBCUtils.getConnection(); return qr.query(connection, sql, new BeanListHandler<>(clazz), args); } catch (Exception e) { e.printStackTrace(); }finally { JDBCUtils.release(connection); } return null ; } public T get (String sql, Object ...args) { Connection connection = null ; try { connection = JDBCUtils.getConnection(); return qr.query(connection, sql, new BeanHandler<>(clazz), args); } catch (Exception e) { e.printStackTrace(); }finally { JDBCUtils.release(connection); } return null ; } public void update (String sql, Object ... args) { Connection connection = null ; try { connection = JDBCUtils.getConnection(); qr.update(connection, sql, args); } catch (Exception e) { e.printStackTrace(); }finally { JDBCUtils.release(connection); } } }
D.UserDAO
描述了一些与 User JavaBean 相关的 操作接口,以供子类 implements
就是这个 User Bean 可以用来干什么,只是描述一下它的功能。
UserDAO.java:
One More Thing 👇
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 package com.crainyday.web;public interface UserDAO { public void register (User user) ; public User login (String username, String password) ; public long getUsernameCount (String username) ; public long getEmailCount (String email) ; }
E.UserDAOJDBCImpl
继承自 基础的 DAO,实现了 功能接口 DAO。
User 数据访问对象 JDBC 的实现
通过基础 DAO 操作数据库:用户登陆,用户注册,查询用户信息
UserDAOJDBCImpl.java:
One More Thing 👇
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 package com.crainyday.web;public class UserDAOJDBCImpl extends DAO <User > implements UserDAO { @Override public void register (User user) { String sql = "INSERT INTO user VALUES(?,?,?,?,?,?)" ; update(sql, user.getUserId(),user.getUserName(), user.getPassword(), user.getAge(), user.getAddress(), user.getEmail()); } @Override public User login (String username, String password) { String sql = "SELECT * FROM user WHERE userName = ?" ; return get(sql, username); } @Override public long getUsernameCount (String username) { String sql = "SELECT count(userId) FROM user WHERE userName = ?" ; return getForValue(sql, username); } @Override public long getEmailCount (String email) { String sql = "SELECT count(userId) FROM user WHERE email = ?" ; return getForValue(sql, email); } }
F.UserDAOJDBCImplTest
测试写好的数据操作、对象功能是否正确。也可以用 junits 测试,为了共用,这里用了基本的方法。
UserDAOJDBCImplTest.java:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 package com.crainyday.web; public class UserDAOJDBCImplTest { public static void main(String[] args) { UserDAO dao = new UserDAOJDBCImpl(); String username = "root"; String password = "root"; User user = dao.login(username, password); User registerUser = new User(); registerUser.setUserId(2); registerUser.setUserName("admin"); registerUser.setPassword("admin"); registerUser.setAge(12); registerUser.setAddress("山东济南"); registerUser.setEmail("admin@crainyday.com"); dao.register(registerUser); System.out.println(user); } }