`
Damon_Zhang
  • 浏览: 71886 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

log4j+JDBC+mySQL 将对象写入数据库

 
阅读更多

    一、写前唠叨

      最近写了一个关于将对象通过log4j的形式保存到数据库的例子,因对这个log4j正在入门,所以做之前查过很多资料,不过网上的信息比较简单,如下:

    1.所有信息几乎全部在配置文件中进行获取,如:数据库相关的连接、用户名、密码、sql语句;日志相关的appender、输出、格式化、参数;

    2.写到数据库中的仅是一个字符串而不是一个对象,如:将一个对象本身以及它的各个数据作为一条记录存到数据库

    3.代码的灵活性较低,如:只能存比较简单的数据类型,如保存一个对象及属性的话,就不太容易做了。

  当然,网上的这些资料当然是为了最基础的入门而做的,因此简单了些,但也不乏比较深奥的资料,比如穿件连接池,考虑缓存等等。。

   二、我的做法

     1.通过继承JDBCAppender实现日志的写入的

     2.通过JDBC连接数据库(也可通过HIBERNATE)

     3.数据库和log4j的基本信息配置到properties中,但数据库可以自由选择多种数据库(在配置文件中配置即可)

     4.将对象的属性存到库中

   三、项目例子

     1.项目结构图:见附件,项目结构图.png

     2. 数据库:MYSQL  库名:LOG4J  表名:LogMessage/StudentMessage

         表结构请看附件:LogMessage.png/StudentMessage.png

     3.代码及说明

     log4j.properties :分别输出指定为:控制台、文件(log.log)、数据库

 

log4j.rootLogger=INFO,appender1,appender2,DATABASE

# console
log4j.appender.appender1=org.apache.log4j.ConsoleAppender
log4j.appender.appender1.layout=org.apache.log4j.PatternLayout
log4j.appender.appender1.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss:SSS}[%p]: %m%n

# file
log4j.appender.appender2=org.apache.log4j.FileAppender
log4j.appender.appender2.File=log.log
log4j.appender.appender2.layout=org.apache.log4j.PatternLayout
log4j.appender.appender2.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss:SSS}[%p]: %m%n

#mysql dbappender test
log4j.appender.DATABASE.driver=com.mysql.jdbc.Driver
log4j.appender.DATABASE.URL=jdbc:mysql://127.0.0.1:3306/LOG4J
log4j.appender.DATABASE.username=root
log4j.appender.DATABASE.password=root
log4j.appender.DATABASE=control.DbAppender
log4j.appender.DATABASE.layout=org.apache.log4j.PatternLayout
log4j.appender.DATABASE.layout.ConversionPattern=[framework] %d - %c -%-4r [%t] %-5p %c %x - %m%n %L

    Conorl包——DbAppender.java :日志提交中转站,提取日志信息,处理后进行数据库操作插入对应的表中

 

package control;

import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.Hashtable;
import java.util.Iterator;
import java.util.Map;

import org.apache.log4j.jdbc.JDBCAppender;
import org.apache.log4j.spi.ErrorCode;
import org.apache.log4j.spi.LoggingEvent;

import bean.HashMapping;
import bean.Students;
import bean.UserBean;

import dao.JdbcUtils;
import dao.StudentsUtil;
import dao.UserUtil;

public class DbAppender extends JDBCAppender {

	protected void closeConnection(Connection con) {
		// TODO Auto-generated method stub
		// super.closeConnection(con);
		JdbcUtils.close(con);

	}

	@Override
	protected void execute(String sql) throws SQLException {
		// TODO Auto-generated method stub
		// super.execute(arg0);
		int flag = 0;
		int end = sql.lastIndexOf(")");
		String sqls = sql.substring(0, end + 1);
		String beanname = sql.substring(end + 1);
		if (beanname.equals("UserBean")) {
			 flag = UserUtil.insertUser(sqls);
		} else if (beanname.equals("Students")) {
			 flag = StudentsUtil.insertStudent(sqls);
		}
		System.out.println(flag == 0 ? "insert fail!" : "insert successful!");
	}

	@Override
	protected Connection getConnection() throws SQLException {
		// TODO Auto-generated method stub
		// return super.getConnection();
		if (connection == null) {
			connection = JdbcUtils.getConnection();
		}
		return connection;
	}

	@Override
	protected String getLogStatement(LoggingEvent event) {
		// TODO Auto-generated method stub
		// return super.getLogStatement(event);
		StringBuffer sbuf = new StringBuffer();
		Hashtable hm = (Hashtable) event.getMessage();
		String sql = null;
		if ((hm.get("beanname")).equals("UserBean")) {
			sbuf.append(UserUtil.insertSql());
			sql = sbuf.toString();
			int end = sql.lastIndexOf("(");
			sql = sql.substring(0, end) + "('" + hm.get(HashMapping.USER_TIME)
					+ "','" + event.getMessage() + "','"
					+ hm.get(HashMapping.USER_USERNAME) + "','"
					+ hm.get(HashMapping.USER_PASSWORD) + "')";
			System.out.println(sql);
			return sql + hm.get("beanname");
		} else if ((hm.get("beanname")).equals("Students")) {
			sbuf.append(StudentsUtil.insertSql());
			sql = sbuf.toString();
			int end = sql.lastIndexOf("(");
			sql = sql.substring(0, end)
					+ "('"
					+ hm.get(HashMapping.STUDENT_NAME)
					+ "','"
					+ hm.get(HashMapping.STUDENT_AGE)
					+ "','"
					+ (((Integer) (hm.get(HashMapping.STUDENT_SEX))) == 1 ? "F"
							: "M") + "','" + hm.get(HashMapping.STUDENT_TIME)
					+ "')";
			System.out.println(sql);
			return sql + hm.get("beanname");
		}
		return sql;

	}

}

    Bean包中的类——HashMapping.java :将属性设置成常量(即键-值对中的键),便于代码中进行键值对的读取。

 

package bean;

public class HashMapping {

	public static final String USER_USERNAME = "username";
	public static final String USER_PASSWORD = "password";
	public static final String USER_TIME = "time";
	
	public static final String STUDENT_NAME = "name";
	public static final String STUDENT_AGE = "age";
	public static final String STUDENT_SEX = "sex";
	public static final String STUDENT_TIME = "time";
}

   Bean包中的类——UserBean.java/Students.java: 对LogMessage/studentMessage表及此对象持久化

 

package bean;

public class Students {

	private String name;
	private int age;
	private int sex;
	private String time;

	public String getTime() {
		return time;
	}

	public void setTime(String time) {
		this.time = time;
	}

	public String getName() {
		return name;
	}

	public void setName(String name) {
		this.name = name;
	}

	public int getAge() {
		return age;
	}

	public void setAge(int age) {
		this.age = age;
	}

	public int getSex() {
		return sex;
	}

	public void setSex(int sex) {
		this.sex = sex;
	}

}
//===============================================
package bean;

import java.sql.Date;

public class UserBean {

	private String username;
	private String password;
	private String Time;
	private String Note;

	public String getTime() {
		return Time;
	}

	public void setTime(String time) {
		Time = time;
	}

	public String getNote() {
		return Note;
	}

	public void setNote(String note) {
		Note = note;
	}

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

}

 Dao中的包——GetObject.java: 将对象放到hashtable中并发送到dbappender中

 

package dao;

import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Hashtable;

import org.apache.log4j.Logger;
import org.apache.log4j.PropertyConfigurator;

import test.Test;

import bean.Students;
import bean.UserBean;

public class GetObject {
	private Logger logger = Logger.getLogger(GetObject.class);
	private UserBean ub;
	private Students st;
	private SimpleDateFormat sf;

	// 保存对象
	public UserBean insertInfo(String username, String password) {

		ub = new UserBean();
		ub.setUsername(username);
		ub.setPassword(password);
		return ub;

	}

	public Logger getLogger() {
		return logger;
	}

	public void setLogger(Logger logger) {
		this.logger = logger;
	}

	public UserBean getUb() {
		return ub;
	}

	public void setUb(UserBean ub) {
		this.ub = ub;
	}

	public Students getSt() {
		return st;
	}

	public void setSt(Students st) {
		this.st = st;
	}

	public SimpleDateFormat getSf() {
		return sf;
	}

	public void setSf(SimpleDateFormat sf) {
		this.sf = sf;
	}

	public Students insertInfo(String name, int age, int sex) {
		st = new Students();
		st.setName(name);
		st.setAge(age);
		st.setSex(sex);
		return st;
	}

	// bean key-value
	public void getMethod(Object obj) {

		sf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss:SSS");
		PropertyConfigurator.configure("log4j.properties");
		Hashtable ht = new Hashtable();
		ht.clear();
		if (obj instanceof UserBean) {
			ht.put("username", ub.getUsername());
			ht.put("password", ub.getPassword());
			ht.put("time", sf.format(new Date()));
			ht.put("beanname", "UserBean");
		} else if (obj instanceof Students) {
			ht.put("name", st.getName());
			ht.put("age", st.getAge());
			ht.put("sex", st.getSex());
			ht.put("time", sf.format(new Date()));
			ht.put("beanname","Students");
		}
		logger.info(ht);

	}

}

 Dao中的包——JdbcUtils.java: 数据库的动态链接

 

package dao;

import java.io.FileInputStream;
import java.io.IOException;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.Iterator;
import java.util.Properties;
import java.util.Set;

public final class JdbcUtils {
	//
	private static String url = null;
	private static String driver = null;
	private static String username = null;
	private static String password = null;

	private JdbcUtils() {

	}
	static{
		try {
			getProperties();
			Class.forName(driver);
		} catch (ClassNotFoundException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}

	public static Connection getConnection() throws SQLException  {
		
		return DriverManager.getConnection(url, username, password);
	}

	public static void close(Connection conn) {

		try {
			if (conn != null)
				conn.close();
		} catch (SQLException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}

	public static void getProperties() {

		Properties props = new Properties();
		FileInputStream istream = null;
		try {
			istream = new FileInputStream("log4j.properties");
			props.load(istream);
			Set s = props.keySet();
			Iterator it = s.iterator();
			while (it.hasNext()) {
				String id = (String) it.next();
				String value = props.getProperty(id);
				if(id.equals("log4j.appender.DATABASE.driver")){
					driver = value;
				}else if(id.equals("log4j.appender.DATABASE.URL")){
					url = value;
				}else if(id.equals("log4j.appender.DATABASE.username")){
					username = value;
				}else if(id.equals("log4j.appender.DATABASE.password")){
					password = value;
				}
//				System.out.println(id + ":=" + value);
			}
		} catch (Exception e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} finally {
			try {
				istream.close();
			} catch (IOException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
		}

	}

}

 Dao中的包——StudentsUtil.java/UserUtil.java: 对各自的表进行数据库的操作

 

package dao;

import java.sql.Connection;
import java.sql.SQLException;
import java.sql.Statement;

public class StudentsUtil {
	
	public static int insertStudent(String sql) {

		Connection conn = null;
		Statement sm = null;

		int flag = 0;

		try {
			conn = JdbcUtils.getConnection();
			sm = conn.createStatement();
			sm.execute(sql);
			flag = 1;
		} catch (SQLException e) {
			// TODO Auto-generated catch block
			System.out.println("insert fail!");
		} finally {
			if (sm != null) {
				try {
					sm.close();
				} catch (SQLException e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				}
			}
			JdbcUtils.close(conn);
			
		}

		return flag;

	}

	public static String insertSql() {
		return "INSERT INTO StudentMessage(Name,Age,Sex,Time) values(";
	}
}
//===============================================
package dao;

import java.sql.CallableStatement;
import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;

import bean.UserBean;

public class UserUtil {

	public static int insertUser(String sql) {

		Connection conn = null;
		Statement sm = null;

		int flag = 0;

		try {
			conn = JdbcUtils.getConnection();
			sm = conn.createStatement();
			sm.execute(sql);
			flag = 1;
		} catch (SQLException e) {
			// TODO Auto-generated catch block
			System.out.println("insert fail!");
		} finally {
			if (sm != null) {
				try {
					sm.close();
				} catch (SQLException e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				}
			}
			JdbcUtils.close(conn);
			
		}

		return flag;

	}
	public static String insertSql(){
		return "INSERT INTO LogMessage(Time,Note,Username,Password) values(";
	}

}
 

   test包——test.java :测试类

 

package test;

import java.lang.reflect.InvocationTargetException;

import org.apache.log4j.Logger;
import org.apache.log4j.MDC;
import org.apache.log4j.PropertyConfigurator;
import org.apache.log4j.jdbc.JDBCAppender;
import org.omg.CORBA.Request;

import dao.GetObject;

import bean.Students;
import bean.UserBean;

public class Test {

	public static void main(String[] args) {

		Test dbt = new Test();
		dbt.testUser();

	}

	public void testUser() {
		try {
			GetObject go = new GetObject();
			UserBean ub = go.insertInfo("EE-YY", "YY-12345");
			go.getMethod(ub);
			// Students st = go.insertInfo("YY", 21, 2);
			// go.getMethod(st);
		} catch (SecurityException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}

	}

}

 结果见附加:stuM.png/logM.png

 

 

 

  • 大小: 8.4 KB
  • 大小: 9.7 KB
  • 大小: 11.2 KB
  • 大小: 661 Bytes
  • 大小: 661 Bytes
1
0
分享到:
评论

相关推荐

    log4j使用与java中log4j记录日志如何写入数据库

    本文将详细介绍如何在Java中使用Log4j来记录日志,并将其写入数据库。 首先,我们需要了解Log4j的基本结构。一个简单的Log4j项目通常包含以下几个部分: 1. **配置文件**:Log4j的配置文件通常是`log4j.properties...

    log4j2.xml记录日志到到数据库

    在我们的示例中,我们关注的是如何配置Log4j2以将日志写入MySQL数据库。首先,我们需要在`log4j2.xml`配置文件中定义一个使用JDBC Appender的配置: ```xml <JDBC name="DatabaseAppender" tableName="logs"> ...

    如何借助log4j把日志写入数据库中

    然后,在Java代码中,我们可以创建并使用Logger对象,Log4j会自动将日志信息写入数据库。例如: ```java import org.apache.log4j.Logger; public class LogDemo { private static final Logger logger = Logger....

    log4j日志写入数据库实例

    在“log4j日志写入数据库实例”中,我们将关注如何配置Log4j将日志信息存储到数据库中,以便于后期分析和检索。 要实现这个功能,我们需要创建一个Appender,该Appender能够与数据库进行交互。通常,我们会使用...

    log4j添加日志到数据库和文件中

    Log4j的核心优势在于其可配置性,可以根据不同的需求将日志输出到控制台、文件、数据库甚至网络上。 在"log4j添加日志到数据库和文件中"的场景中,我们首先需要理解Log4j的基本架构。它主要由三个组件构成:Logger...

    日志配置到文件,数据库

    - `log4j.appender.DATABASE.URL=jdbc:mysql://localhost:3306/log4j`:连接数据库的URL。 - `log4j.appender.DATABASE.driver=com.mysql.jdbc.Driver`:MySQL驱动类。 - `log4j.appender.DATABASE.user=root`:...

    log4j学习笔记及写入数据库配置

    在学习Log4j的过程中,阅读“log4j学习笔记及写入数据库配置”这份资料将有助于深入理解Log4j的使用,包括具体的配置步骤、常见问题以及最佳实践。通过实践,你可以更好地掌握如何利用Log4j来提升你的应用程序的可...

    使用log4j 记录日志到数据库

    这篇博客“使用log4j记录日志到数据库”将介绍如何配置和使用Log4j,以便将日志信息存储到数据库中,而非传统的文本文件。数据库存储的日志便于进行结构化查询,有助于进行长期的数据分析和管理。 首先,理解Log4j...

    log4j输出日志到数据库表中

    2. **Log4j配置**:要将日志输出到数据库,需要在`log4j.properties`或`log4j.xml`配置文件中添加一个Appender,指定为JDBC类型。配置包括数据库连接信息(如URL、用户名、密码)、SQL语句(插入日志记录)等。 3. ...

    配置log4j配置数据库连接池(以dbcp连接池为例),并将log信息存储在数据库中(以mysql为例)

    本教程将详细介绍如何配置Log4j以使用DBCP连接池,并将日志信息存储到MySQL数据库中。 首先,我们需要在项目中引入Log4j和DBCP的相关依赖。对于Maven项目,可以在pom.xml文件中添加如下依赖: ```xml ...

    myBaits所有jar包,包括log4j所需jar包,mysql所需jar包,导入后可以直接使用

    在Java应用程序中,log4j允许开发者定义多个日志级别(如DEBUG、INFO、WARN、ERROR等),并决定在何时何地将这些日志信息写入不同的输出目的地,如控制台、文件、电子邮件或者syslog服务器。这个压缩包中的log4j jar...

    log4j 数据库,邮件,html 等配置

    Log4j允许我们直接将日志信息存储到数据库中,这对于需要长期保存和分析大量日志数据的系统来说尤其有用。首先,你需要配置一个Appender(输出端),例如使用JDBCAppender。在配置文件中,定义数据库连接参数,包括...

    eclipse + mybits 操作mysql数据库

    在Eclipse中,右键点击项目 -> "Build Path" -> "Configure Build Path" -> "Libraries" -> "Add External JARs",然后选择MyBatis的jar文件,包括mybatis-x.x.x.jar和mybatis-logging的相应实现(如log4j)。...

    kettle(ETL工具)mysql 5.7 数据库的驱动包

    一旦配置完成,你就可以在Kettle的工作流或转换中创建步骤来读取、写入或操作MySQL数据库中的数据。这包括但不限于表输入、表输出、SQL步骤、JOIN步骤等,这些都极大地丰富了数据处理的可能性。 使用Kettle进行ETL...

    JDBC批量插入 更新 删除等操作

    通过JDBC,Java应用程序可以与多种类型的数据库进行交互,实现数据的读取、写入等功能。批量操作是指在一次数据库连接中执行多次SQL语句的操作,这种方式能显著提高程序性能,尤其是在处理大量数据时。 **批量插入*...

    jdbc小例子

    在某些情况下,日志可能会被写入数据库,这需要配置Log4j以使用JDBC Appender。这将使日志信息存储在数据库表中,便于管理和分析。 配置Log4j使用JDBC Appender通常涉及以下步骤: a. 添加Log4j和JDBC相关的依赖...

    mysql集成包(5个)

    9. `commons-logging-1.2.jar`:Apache Commons Logging是日志服务的抽象层,允许开发者选择不同的日志实现,如Log4j或Java内置的日志API。在数据库操作中,日志记录对于调试和问题排查至关重要。 这些组件结合在...

    Java使用JDBC向MySQL数据库批次插入10W条数据(测试效率)

    在Java开发中,当需要向MySQL数据库大量插入数据时,使用JDBC的批量处理功能可以显著提高效率。本文将详细讲解如何使用JDBC批量插入10万条数据,并探讨其背后的原理和优化策略。 批量处理在JDBC中主要通过Statement...

    hive jdbc 连接所需要的jar包

    9. **slf4j-api*.jar** 和 **slf4j-log4j12*.jar**: 日志记录框架SLF4J和其适配器Log4j,用于记录Hive JDBC操作的日志信息。 10. **protobuf*.jar**: Protocol Buffers是Google的一种数据序列化协议,Hive可能用它...

Global site tag (gtag.js) - Google Analytics