- 浏览: 658078 次
- 性别:
- 来自: 深圳
文章分类
- 全部博客 (609)
- java (139)
- 数据库 (107)
- 微信 (23)
- IT生活 (5)
- web前端 (74)
- SSH (11)
- 设计模式 (12)
- 重要资料 (11)
- 其他 (15)
- java技巧 (23)
- 服务器 (9)
- 2D/GUI (3)
- JAVA3D (2)
- ANT (5)
- Apache项目 (19)
- 数据类型 (10)
- 报表 (3)
- Collections (6)
- SQL/JDBC (15)
- 开发类 (6)
- EJB (6)
- Email (6)
- 文件读写 (2)
- 游戏 (0)
- Flex (2)
- Generic (2)
- HIbernate (12)
- I18N (5)
- Java EE (9)
- java ME (4)
- JDK 6 (8)
- JNDI/LDAP (5)
- JSP (7)
- JSTL (2)
- 正则表达式 (2)
- 安全 (2)
- Struts2 (12)
- Spring (4)
- Web服务 (10)
- Xml (1)
- JavaScript (30)
- AJAX (7)
- 验证 (4)
- 上传下载 (1)
- office办公软件 (1)
- Android (2)
- IOS (0)
- Dubbo (3)
- memcached/redis (1)
- 小程序 (1)
- 微信公众号 (0)
最新评论
-
wf_wangfeng:
怎么我用第一种方法不行呢 alert(document.rea ...
当jsp页面完全加载完成后执行一个js函数 -
Lori_Liu:
有帮助,至少可以解决了目前所遇到的问题!谢谢..
当jsp页面完全加载完成后执行一个js函数 -
starbhhc:
String actionMessage = new Stri ...
Java读取txt文件乱码 -
starbhhc:
Sev7en_jun 写道GOOD
客气,互相交流。。
javaeye论坛规则小测验(答案)--star -
Sev7en_jun:
GOOD
javaeye论坛规则小测验(答案)--star
利用Class.formName("")去获取Class对象、在通过Class对象提供的静态方法、获取类或接口的字段、方法、构造这些成员。
了解了反射的一些基础、个人觉得学习编程应该充分的动起手来。在使用过Hibernate的查询过后、突然觉得普通的JDBC查询对查询结果的封装很是麻烦!
于是仿造它、构建一个简单的JDBC查询。
数据库连接类:
/**
* 数据连接类
* @author star
*
*/
public class UtilDao {
static Properties properties = null;
public UtilDao(){
//读取属性文件
properties = new Properties();
java.io.InputStream in = (java.io.InputStream) this.getClass()
.getResourceAsStream("/mysqlDB.properties");
try {
properties.load(in);
} catch (IOException ex) {
System.out.println(ex.getMessage());
ex.printStackTrace();
}
}
public Connection getConn(){
Connection connection = null;
try{
Class.forName(properties.getProperty("DBDriver"));
connection = DriverManager.getConnection(properties.getProperty("url"),properties.getProperty("name"),properties.getProperty("pass"));
}catch (Exception err) {
System.out.println("连接ConDB-->getCon()____JDBC错误!");
err.printStackTrace();
return null;
}
return connection;
}
/**
* 以下是关闭重载方法
* @param rs
* @param st
* @param cs
* @param conn
* @throws SQLException
*/
public void closeAll(ResultSet rs,Statement st ,CallableStatement cs ,Connection conn) throws SQLException{
if(rs!=null){
rs.close();
}
if(st!=null){
st.close();
}
if(cs!=null){
cs.close();
}
if(conn!=null){
conn.close();
}
}
public void closeAll(ResultSet rs,Statement st,Connection conn) throws SQLException{
if(rs!=null){
rs.close();
}
if(st!=null){
st.close();
}
if(conn!=null){
conn.close();
}
}
public void closeAll(ResultSet rs,PreparedStatement ps,Connection conn) throws SQLException{
if(rs!=null){
rs.close();
}
if(ps!=null){
ps.close();
}
if(conn!=null){
conn.close();
}
}
public void closeAll(PreparedStatement ps,Connection conn) throws SQLException{
if(ps!=null){
ps.close();
}
if(conn!=null){
conn.close();
}
}
public void closeAll(Statement st,Connection conn) throws SQLException{
if(st!=null){
st.close();
}
if(conn!=null){
conn.close();
}
}
public void closeAll(Connection conn) throws SQLException{
if(conn!=null){
conn.close();
}
}
}
属性文件:
DBDriver=com.mysql.jdbc.Driver
url=jdbc\:mysql\://localhost\:3306/db
name=root
pass=root
characterEncoding=utf8
数据层接口:
/**
* 访问数据方法接口
* @author star
*
*/
@SuppressWarnings("unchecked")
public interface IDao<T> {
/**
* 分页查询方法
* @param objClass 类对象
* @param sql 查询语句
* @param params 参数
* @return 分页数据
* @throws Exception
*/
public List<T> findList(Object objClass,String sql, List params)throws Exception;
/**
* 查询一条数据
* @param objClass 类对象
* @param sql 查询语句
* @param params 参数
* @return 一条数据信息
* @throws Exception
*/
public T findInfo(Object objClass,String sql ,List params)throws Exception;
}
数据层接口实现:
/**
* 访问数据方法实现类
* @author star
*/
@SuppressWarnings({"unchecked","unused"})
public class DaoImpl<T> implements IDao<T> {
private UtilDao dao = new UtilDao();
private Connection conn = null;
private ResultSet rs = null;
private PreparedStatement ps = null;
/*
* 查询一条数据
*/
public T findInfo(Object objClass,String sql, List params) throws Exception {
Class c = objClass.getClass();
try{
conn = dao.getConn();
ps = conn.prepareStatement(sql);
for (int i = 0; i < params.size(); i++) {
if(params.get(i)!=null){
Object obj = params.get(i);
if(obj.getClass().getName().equals("java.lang.String")){
ps.setString(i+1, obj.toString());
}else if(obj.getClass().getName().equals("java.lang.Integer")){
ps.setInt(i+1, Integer.valueOf(obj.toString()));
}else{
ps.setObject(i+1, obj);
}
}
}
rs = ps.executeQuery();
Class type = null ; //属性类型
if(rs.next()){
objClass = c.newInstance();
List<String> list = Reflect003.getKeys(c);
Method method = null;
for (int i = 0; i < list.size(); i++) {
String key = list.get(i);
String mName = "set"+key.substring(0,1).toUpperCase()+key.substring(1);
String typeName = c.getDeclaredField(key).getType().getName();
if(typeName.equals("int")){
type = int.class;
method = c.getMethod(mName, type);
method.invoke(objClass, rs.getInt(key));
}else if(typeName.equals("java.lang.String")){
type = java.lang.String.class;
method = c.getMethod(mName, type);
method.invoke(objClass, rs.getString(key));
}
}
}
}catch(Exception e){
System.out.println("访问数据方法实现类findInfo方法出错");
e.printStackTrace();
}finally{
dao.closeAll(rs,ps,conn);
}
return (T)objClass;
}
/*
* 分页查询方法
*/
public List<T> findList(Object objClass,String sql, List params)
throws Exception {
/*
* 创建返回值对象
*/
List<Object> info = new ArrayList<Object>();
//获得Class对象
Class c = objClass.getClass();
try{
conn = dao.getConn();
ps = conn.prepareStatement(sql);
for (int i = 0; i < params.size(); i++) {
if(params.get(i)!=null){
Object obj = params.get(i);
/*
* 判断参数的原始类型
* 暂时判断Integer跟String类型
*/
if(obj.getClass().getName().equals("java.lang.String")){
ps.setString(i+1, obj.toString());
}else if(obj.getClass().getName().equals("java.lang.Integer")){
ps.setInt(i+1, Integer.valueOf(obj.toString()));
}else{
ps.setObject(i+1, obj);
}
}
}
rs = ps.executeQuery();
Class type = null ; //属性类型
while(rs.next()){
//创建一个实例
objClass = c.newInstance();
//获取所有的字段名称
List<String> list = Reflect003.getKeys(c);
Method method = null;//声明Method对象
for (int i = 0; i < list.size(); i++) {
String key = list.get(i);
String mName = getSetMethodName(key); //组装set方法名称
String typeName = c.getDeclaredField(key).getType().getName(); //获取字段类型名称
/*
* 判断字段类型
*/
if(typeName.equals("int")){
type = int.class; //赋值属性类型
method = c.getMethod(mName, type); //获得Method实例
method.invoke(objClass, rs.getInt(key)); //调用该set方法
}else if(typeName.equals("java.lang.String")){
type = java.lang.String.class;
method = c.getMethod(mName, type);
method.invoke(objClass, rs.getString(key));
}
}
info.add(objClass);
}
}catch(Exception e){
System.out.println("访问数据方法实现类findList方法出错");
e.printStackTrace();
}finally{
dao.closeAll(rs,ps,conn);
}
return (List<T>)info;
}
/**
* 组装set方法
* @param columnName 字段名
* @return
*/
private static String getSetMethodName(String columnName) {
return "set" + columnName.substring(0, 1).toUpperCase()
+ columnName.toLowerCase().substring(1);
}
}
获取所有字段的方法:
/**
* 获取字段名称类
* @author star
*
*/
public class Reflect003 {
public static List<String> getKeys(Class<?> c){
List<String> list = new ArrayList<String>();
try{
//根据Class的静态方法获取所以字段名称、不包括继承字段
Field[] fs = c.getDeclaredFields();
for (int i = 0; i < fs.length; i++) {
list.add(fs[i].getName());
}
}catch(Exception e){
e.printStackTrace();
}
return list;
}
}
main测试Test:
public static void main(String[] args) throws Exception {
DaoImpl dao = new DaoImpl();
test_user u = new test_user();
String sqlPage = "SELECT * FROM userWHERE id <= ";
sqlPage += " (SELECT id FROM user ORDER BY id LIMIT "+(2-1)*20+", 1) ";
sqlPage += " ORDER BY id LIMIT 20 " ; //
List<test_user> listT = (List<test_user>)dao.findList(u, sqlPage, new ArrayList());
for (int i = 0; i < listT.size(); i++) {
test_user user = listT.get(i);
System.out.println("名称====:"+user.getName());
}
}
了解了反射的一些基础、个人觉得学习编程应该充分的动起手来。在使用过Hibernate的查询过后、突然觉得普通的JDBC查询对查询结果的封装很是麻烦!
于是仿造它、构建一个简单的JDBC查询。
数据库连接类:
/**
* 数据连接类
* @author star
*
*/
public class UtilDao {
static Properties properties = null;
public UtilDao(){
//读取属性文件
properties = new Properties();
java.io.InputStream in = (java.io.InputStream) this.getClass()
.getResourceAsStream("/mysqlDB.properties");
try {
properties.load(in);
} catch (IOException ex) {
System.out.println(ex.getMessage());
ex.printStackTrace();
}
}
public Connection getConn(){
Connection connection = null;
try{
Class.forName(properties.getProperty("DBDriver"));
connection = DriverManager.getConnection(properties.getProperty("url"),properties.getProperty("name"),properties.getProperty("pass"));
}catch (Exception err) {
System.out.println("连接ConDB-->getCon()____JDBC错误!");
err.printStackTrace();
return null;
}
return connection;
}
/**
* 以下是关闭重载方法
* @param rs
* @param st
* @param cs
* @param conn
* @throws SQLException
*/
public void closeAll(ResultSet rs,Statement st ,CallableStatement cs ,Connection conn) throws SQLException{
if(rs!=null){
rs.close();
}
if(st!=null){
st.close();
}
if(cs!=null){
cs.close();
}
if(conn!=null){
conn.close();
}
}
public void closeAll(ResultSet rs,Statement st,Connection conn) throws SQLException{
if(rs!=null){
rs.close();
}
if(st!=null){
st.close();
}
if(conn!=null){
conn.close();
}
}
public void closeAll(ResultSet rs,PreparedStatement ps,Connection conn) throws SQLException{
if(rs!=null){
rs.close();
}
if(ps!=null){
ps.close();
}
if(conn!=null){
conn.close();
}
}
public void closeAll(PreparedStatement ps,Connection conn) throws SQLException{
if(ps!=null){
ps.close();
}
if(conn!=null){
conn.close();
}
}
public void closeAll(Statement st,Connection conn) throws SQLException{
if(st!=null){
st.close();
}
if(conn!=null){
conn.close();
}
}
public void closeAll(Connection conn) throws SQLException{
if(conn!=null){
conn.close();
}
}
}
属性文件:
DBDriver=com.mysql.jdbc.Driver
url=jdbc\:mysql\://localhost\:3306/db
name=root
pass=root
characterEncoding=utf8
数据层接口:
/**
* 访问数据方法接口
* @author star
*
*/
@SuppressWarnings("unchecked")
public interface IDao<T> {
/**
* 分页查询方法
* @param objClass 类对象
* @param sql 查询语句
* @param params 参数
* @return 分页数据
* @throws Exception
*/
public List<T> findList(Object objClass,String sql, List params)throws Exception;
/**
* 查询一条数据
* @param objClass 类对象
* @param sql 查询语句
* @param params 参数
* @return 一条数据信息
* @throws Exception
*/
public T findInfo(Object objClass,String sql ,List params)throws Exception;
}
数据层接口实现:
/**
* 访问数据方法实现类
* @author star
*/
@SuppressWarnings({"unchecked","unused"})
public class DaoImpl<T> implements IDao<T> {
private UtilDao dao = new UtilDao();
private Connection conn = null;
private ResultSet rs = null;
private PreparedStatement ps = null;
/*
* 查询一条数据
*/
public T findInfo(Object objClass,String sql, List params) throws Exception {
Class c = objClass.getClass();
try{
conn = dao.getConn();
ps = conn.prepareStatement(sql);
for (int i = 0; i < params.size(); i++) {
if(params.get(i)!=null){
Object obj = params.get(i);
if(obj.getClass().getName().equals("java.lang.String")){
ps.setString(i+1, obj.toString());
}else if(obj.getClass().getName().equals("java.lang.Integer")){
ps.setInt(i+1, Integer.valueOf(obj.toString()));
}else{
ps.setObject(i+1, obj);
}
}
}
rs = ps.executeQuery();
Class type = null ; //属性类型
if(rs.next()){
objClass = c.newInstance();
List<String> list = Reflect003.getKeys(c);
Method method = null;
for (int i = 0; i < list.size(); i++) {
String key = list.get(i);
String mName = "set"+key.substring(0,1).toUpperCase()+key.substring(1);
String typeName = c.getDeclaredField(key).getType().getName();
if(typeName.equals("int")){
type = int.class;
method = c.getMethod(mName, type);
method.invoke(objClass, rs.getInt(key));
}else if(typeName.equals("java.lang.String")){
type = java.lang.String.class;
method = c.getMethod(mName, type);
method.invoke(objClass, rs.getString(key));
}
}
}
}catch(Exception e){
System.out.println("访问数据方法实现类findInfo方法出错");
e.printStackTrace();
}finally{
dao.closeAll(rs,ps,conn);
}
return (T)objClass;
}
/*
* 分页查询方法
*/
public List<T> findList(Object objClass,String sql, List params)
throws Exception {
/*
* 创建返回值对象
*/
List<Object> info = new ArrayList<Object>();
//获得Class对象
Class c = objClass.getClass();
try{
conn = dao.getConn();
ps = conn.prepareStatement(sql);
for (int i = 0; i < params.size(); i++) {
if(params.get(i)!=null){
Object obj = params.get(i);
/*
* 判断参数的原始类型
* 暂时判断Integer跟String类型
*/
if(obj.getClass().getName().equals("java.lang.String")){
ps.setString(i+1, obj.toString());
}else if(obj.getClass().getName().equals("java.lang.Integer")){
ps.setInt(i+1, Integer.valueOf(obj.toString()));
}else{
ps.setObject(i+1, obj);
}
}
}
rs = ps.executeQuery();
Class type = null ; //属性类型
while(rs.next()){
//创建一个实例
objClass = c.newInstance();
//获取所有的字段名称
List<String> list = Reflect003.getKeys(c);
Method method = null;//声明Method对象
for (int i = 0; i < list.size(); i++) {
String key = list.get(i);
String mName = getSetMethodName(key); //组装set方法名称
String typeName = c.getDeclaredField(key).getType().getName(); //获取字段类型名称
/*
* 判断字段类型
*/
if(typeName.equals("int")){
type = int.class; //赋值属性类型
method = c.getMethod(mName, type); //获得Method实例
method.invoke(objClass, rs.getInt(key)); //调用该set方法
}else if(typeName.equals("java.lang.String")){
type = java.lang.String.class;
method = c.getMethod(mName, type);
method.invoke(objClass, rs.getString(key));
}
}
info.add(objClass);
}
}catch(Exception e){
System.out.println("访问数据方法实现类findList方法出错");
e.printStackTrace();
}finally{
dao.closeAll(rs,ps,conn);
}
return (List<T>)info;
}
/**
* 组装set方法
* @param columnName 字段名
* @return
*/
private static String getSetMethodName(String columnName) {
return "set" + columnName.substring(0, 1).toUpperCase()
+ columnName.toLowerCase().substring(1);
}
}
获取所有字段的方法:
/**
* 获取字段名称类
* @author star
*
*/
public class Reflect003 {
public static List<String> getKeys(Class<?> c){
List<String> list = new ArrayList<String>();
try{
//根据Class的静态方法获取所以字段名称、不包括继承字段
Field[] fs = c.getDeclaredFields();
for (int i = 0; i < fs.length; i++) {
list.add(fs[i].getName());
}
}catch(Exception e){
e.printStackTrace();
}
return list;
}
}
main测试Test:
public static void main(String[] args) throws Exception {
DaoImpl dao = new DaoImpl();
test_user u = new test_user();
String sqlPage = "SELECT * FROM userWHERE id <= ";
sqlPage += " (SELECT id FROM user ORDER BY id LIMIT "+(2-1)*20+", 1) ";
sqlPage += " ORDER BY id LIMIT 20 " ; //
List<test_user> listT = (List<test_user>)dao.findList(u, sqlPage, new ArrayList());
for (int i = 0; i < listT.size(); i++) {
test_user user = listT.get(i);
System.out.println("名称====:"+user.getName());
}
}
发表评论
-
mysql创建用户并授权
2016-09-04 23:42 6131.新建用户。 //登录MYSQL mysql -u ... -
java实现文件转换成二进制存储与取出
2016-08-06 01:21 2743一、功能描述: 将文件转成二进制数据放入数据库中,需要的 ... -
Mongodb的全面总结
2016-07-14 16:35 1402MongoDB的官方文档基本是how to do的介绍,而关 ... -
Navicat连接Oracle数据库时报错ORA-28547
2016-07-12 15:46 707用Navicat连接Oracle数据库时出现如下错误提示: ... -
4.ubuntu14.04 安装mongodb笔记
2016-05-06 08:52 6721、使用系统自动获取安装。 1)获取更新 s ... -
3.mongdb mongdb的shell命令
2016-04-14 11:10 1000在mongdb的安装目录,运行mongo.exe,运 ... -
2.mongdb mongdb客户端使用
2016-04-14 10:26 791robomongo,命令行方便 ... -
1. WIN7下安装运行mongodb
2016-04-14 10:11 5381)、下载MongoDBhttp://downloads. ... -
mysql 与mongodb的特点与优劣
2016-04-13 17:37 980介绍: MongoDB是 ... -
报错:1130-host ... is not allowed to connect to this MySql server 开放mysql远程连接 不使用l
2015-07-06 13:16 826报错:1130-host ... is not allow ... -
sql查询今天、昨天、本周、本月、日期的
2015-05-15 10:55 1792sql 求解两个时间差 SELECTDATEDIFF ... -
druid demo
2015-04-08 15:13 1613java程序很大一部分要操作数据库,为了提高性能操作数据库的 ... -
Druid数据库连接池使用
2015-04-08 15:03 728阿里巴巴推出的国产数据库连接池,据网上测试对比,比目前的D ... -
Hibernate与 MyBatis的比较
2015-03-20 00:34 640mybatis是半自动的,hibernate是全自动的,就是 ... -
经典SQL语句大全
2015-01-16 01:02 563一、基础 1、说明:创建数据库CREATE DATABAS ... -
MyBatis的几种批量操作
2015-01-11 22:59 1692MyBatis中批量插入 方法一: &l ... -
spring与mybatis三种整合方法
2015-01-11 22:58 489本文主要介绍Spring与Mybatis三种常用整合方法, ... -
MyBatis(六)、MyBatis主配置文件
2015-01-11 22:58 692在定义sqlSessionFactory时需要指定MyBa ... -
MyBatis(五)、动态SQL语句
2015-01-09 01:01 738有些时候,sql语句where条件中,需要一些安全判断,例 ... -
MyBatis(四)、SQL语句映射文件(2)增删改查、参数、缓存
2015-01-09 01:00 5252.2 select 一个select 元素非常简单。例如 ...
相关推荐
接着,我们来看Java反射机制。反射允许程序在运行时检查类、接口、字段和方法的信息,甚至可以动态调用方法和访问字段。在JDBC封装中,反射非常有用,因为它允许在运行时创建和执行SQL语句,而不必在代码中硬编码...
在这个“JDBC_Java反射技术入门”资源中,初学者可以了解到如何使用Java进行数据库操作的基础知识,包括连接数据库、执行SQL语句、处理查询结果等。 1. **JDBC基础**: - **加载驱动**:在使用JDBC之前,我们需要...
总之,Java反射机制为我们提供了灵活的编程方式,可以动态地操控类、接口、方法和字段,实现对数据库的动态操作。在这个案例中,我们看到了如何结合反射和JDBC实现类似Hibernate的功能,尽管这种方式可能不那么高效...
由于Java反射机制允许程序在运行时构造和访问任何类的属性和方法,它为Reflect-ORM框架提供了实现的理论基础。通过反射,框架可以动态地读取对象的属性信息,将这些信息转换为数据库的表结构,以及将数据库查询结果...
1. **加载数据库驱动**:通过`Class.forName("com.mysql.jdbc.Driver")`加载MySQL驱动,其他数据库对应不同的驱动类名。 2. **获取数据库连接**:使用`DriverManager.getConnection(url, username, password)`方法...
书中还可能涵盖了Java基础语法、面向对象设计、异常处理、集合框架、多线程编程、网络编程、反射机制等多个方面,旨在帮助开发者全面掌握JDK 6的新特性,提升开发效率和软件质量。通过阅读《Wrox Professional Java ...
1. **Java语言基础**:介绍了Java的基本语法,如变量、数据类型、运算符、流程控制语句(if、switch、for、while)以及方法的定义和调用。 2. **面向对象编程**:深入讲解类、对象的概念,封装、继承和多态等面向...
java.lang.reflect 包提供了用于反射对象的工具,包括类、字段、方法和构造方法的反射。 6. java.awt.image 包 java.awt.image 包处理和操纵来自于网上的图片的Java工具类库,包括图像处理、图像resize和图像滤镜...
1. **Java语言基础**: - **语法基础**:包括变量、数据类型、运算符、流程控制语句(如if、switch、for、while)、方法定义与调用等。 - **类与对象**:讲解面向对象编程的基本概念,如类的定义、对象的创建与...
在Java编程中,"万能查询方法"是一种通用的、基于反射技术实现的数据库查询解决方案。这种方法的主要目的是简化代码,减少重复性工作,提高代码的复用性。它允许开发者通过传入实体类和SQL查询语句来执行数据库查询...
总结起来,这个主题涉及到Java反射机制的运用,特别是动态加载数据库驱动和创建数据库连接。通过深入理解反射和JDBC API,开发者可以编写出更灵活、适应性强的代码,以应对各种数据库连接需求。同时,了解项目结构和...
1. 反射(Reflection):Java反射机制允许程序在运行时动态地获取类的信息(如类名、方法名、参数类型等)并调用其方法。通过`Class`类,我们可以实例化未知类型的对象,调用私有方法,访问私有字段,以及检查类的...
8. **反射API**:Java反射允许在运行时检查类的信息,创建和调用类的对象。这部分可能涵盖Class对象、Constructor、Method和Field的使用。 9. **网络编程**:Java 6提供了Socket和ServerSocket类进行网络通信,书中...
6. Java的反射机制,了解如何在运行时检查、修改和调用对象的方法和属性。 7. 注解(Annotation)和泛型的深入讲解,涵盖自定义注解的创建与应用,以及泛型的高级特性。 8. Java 8及后续版本中的函数式编程特性,如...
在Java编程中,类反射机制是一种强大的工具,它允许程序在运行时检查并操作类的信息,包括类的方法、属性和构造器。这个机制是Java动态性的重要体现,它使得我们能够在不知道具体类名的情况下,创建对象并调用其方法...
总之,JDBC作为Java语言与数据库交互的重要桥梁,极大地简化了数据库访问过程,使得Java开发者能够轻松地构建出功能强大的数据库应用程序。随着Java技术的不断发展和完善,JDBC也将持续进化,更好地服务于Java开发者...
1. **多线程编程**:在Java中,多线程是高级特性之一,本书会详细讲解如何创建和管理线程,包括同步机制(如synchronized关键字、wait()和notify()方法)、线程池以及并发集合的使用。 2. **网络编程**:Java提供...
9. **JDBC数据库编程**:Java Database Connectivity (JDBC) 是Java访问数据库的标准API,书中讲述了如何连接数据库、执行SQL语句、处理结果集,以及事务管理和批处理。 10. **Java企业级技术**:简要介绍EJB...