• SSH上一个随笔的基础上添加上hibernate支持


    配置文件

     1 <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
     2     xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
     3     <modelVersion>4.0.0</modelVersion>
     4     <groupId>com.lgp</groupId>
     5     <artifactId>maven_ssh</artifactId>
     6     <packaging>war</packaging>
     7     <version>0.0.1-SNAPSHOT</version>
     8     <name>maven_ssh Maven Webapp</name>
     9     <url>http://maven.apache.org</url>
    10     <properties>
    11         <project.build.sourceEncoding>
    12             UTF-8
    13         </project.build.sourceEncoding>
    14     </properties>
    15     <dependencies>
    16         <dependency>
    17             <groupId>junit</groupId>
    18             <artifactId>junit</artifactId>
    19             <version>3.8.1</version>
    20             <scope>test</scope>
    21         </dependency>
    22         <!-- struts2的驱动包 -->
    23         <dependency>
    24             <groupId>org.apache.struts</groupId>
    25             <artifactId>struts2-core</artifactId>
    26             <version>2.3.31</version>
    27         </dependency>
    28         <!-- 添加Hibernate依赖 -->
    29         <dependency>
    30             <groupId>org.hibernate</groupId>
    31             <artifactId>hibernate-core</artifactId>
    32             <version>3.6.10.Final</version>
    33         </dependency>
    34         <dependency>
    35             <groupId>log4j</groupId>
    36             <artifactId>log4j</artifactId>
    37             <version>1.2.16</version>
    38         </dependency>
    39         <dependency>
    40             <groupId>org.slf4j</groupId>
    41             <artifactId>slf4j-nop</artifactId>
    42             <version>1.6.4</version>
    43         </dependency>
    44         <!-- mysql数据库的驱动包 -->
    45         <dependency>
    46             <groupId>mysql</groupId>
    47             <artifactId>mysql-connector-java</artifactId>
    48             <version>5.1.6</version>
    49         </dependency>
    50     </dependencies>
    51     <build>
    52         <finalName>maven_ssh</finalName>
    53     </build>
    54 </project>

    熟悉的pom.xml其中lo4g和slf4j这两个包第一眼看上去有点莫名奇妙,我也是这么觉得的,实际作用是在后台输出sql语句,不导入hibernate就会报错。

    web.xml和struts2一致即可

     剩下的配置文件就放在resource文件夹以下即可

        ### direct log messages to stdout ###  
        log4j.appender.stdout=org.apache.log4j.ConsoleAppender  
        log4j.appender.stdout.Target=System.out  
        log4j.appender.stdout.layout=org.apache.log4j.PatternLayout  
        log4j.appender.stdout.layout.ConversionPattern=%d{ABSOLUTE} %5p %c{1}:%L - %m%n  
          
        ### direct messages to file hibernate.log ###  
        #log4j.appender.file=org.apache.log4j.FileAppender  
        #log4j.appender.file.File=hibernate.log  
        #log4j.appender.file.layout=org.apache.log4j.PatternLayout  
        #log4j.appender.file.layout.ConversionPattern=%d{ABSOLUTE} %5p %c{1}:%L - %m%n  
          
        ### set log levels - for more verbose logging change 'info' to 'debug' ###  
          
        log4j.rootLogger=warn, stdout  
          
        #log4j.logger.org.hibernate=info  
        log4j.logger.org.hibernate=debug  
          
        ### log HQL query parser activity  
        #log4j.logger.org.hibernate.hql.ast.AST=debug  
          
        ### log just the SQL  
        #log4j.logger.org.hibernate.SQL=debug  
          
        ### log JDBC bind parameters ###  
        log4j.logger.org.hibernate.type=info  
        #log4j.logger.org.hibernate.type=debug  
          
        ### log schema export/update ###  
        log4j.logger.org.hibernate.tool.hbm2ddl=debug  
          
        ### log HQL parse trees  
        #log4j.logger.org.hibernate.hql=debug  
          
        ### log cache activity ###  
        #log4j.logger.org.hibernate.cache=debug  
          
        ### log transaction activity  
        #log4j.logger.org.hibernate.transaction=debug  
          
        ### log JDBC resource acquisition  
        #log4j.logger.org.hibernate.jdbc=debug  
          
        ### enable the following line if you want to track down connection ###  
        ### leakages when using DriverManagerConnectionProvider ###  
        #log4j.logger.org.hibernate.connection.DriverManagerConnectionProvider=trace  
    

     log4j.properties全是复制粘贴就好,硬要深究每一个的作用你可以一个一个的改,认真看都能看懂的。

    <?xml version='1.0' encoding='utf-8'?>
    
    <!DOCTYPE hibernate-configuration PUBLIC
    
            "-//Hibernate/Hibernate Configuration DTD 3.0//EN"
    
            "http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd">
    <hibernate-configuration>
    <!-- 根据 <session-factory>创建与mysql的连接-->
    	<session-factory>
    		<!-- Database connection settings -->
    		<property name="connection.driver_class">org.gjt.mm.mysql.Driver</property>
    		<property name="connection.url">jdbc:mysql://localhost:3306/test</property>
    		<property name="connection.username">root</property>
    		<property name="connection.password">123456789</property>
    		<!-- JDBC connection pool (use the built-in) -->
    		<property name="connection.pool_size">10</property>
    		<!-- SQL dialect -->
    		<property name="dialect">org.hibernate.dialect.MySQLDialect</property>
    		<!-- Enable Hibernate's automatic session context management -->
    		<property name="current_session_context_class">thread</property>
    		<!-- Disable the second-level cache -->
    		<property name="cache.provider_class">org.hibernate.cache.NoCacheProvider</property>
    
    		<!-- Echo all executed SQL to stdout -->
    		<property name="show_sql">true</property>
    		<property name="format_sql">true</property>
    		<!-- Drop and re-create the database schema on startup -->
    		<property name="hbm2ddl.auto">update</property>
    		<mapping resource="Table.hbm.xml" />
    	</session-factory>
    </hibernate-configuration>
    

     hibernate.cfg.xml 注意<mapping resource="Table.hbm.xml" />里面是你的数据库表格设置

    <?xml version="1.0" encoding="UTF-8"?>
    <!DOCTYPE hibernate-mapping PUBLIC  
        "-//Hibernate/Hibernate Mapping DTD 3.0//EN"  
        "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
    <hibernate-mapping package="com.entiy">
    	<class name="com.entity.User" table="USER">
    		<id name="id" column="ID">
    			<generator class="increment" />
    		</id>
    		<property name="name" column="NAME" />
    		<property name="pwd" column="PWD" />
    	</class>
    </hibernate-mapping> 
    

     Table.hbm.xml一个</class>就是一个表格,所有表格都写在里面即可。hibernate在加载时,如果你没有表格,就会自行创建。

    java代码

    package com.util;
    
    import org.hibernate.SessionFactory;
    import org.hibernate.cfg.Configuration;
    
    public class HibernateUtil {
    	// 定义静态的SessionFactory,产生单例,只生成一个SessionFactory
    	private static final SessionFactory sessionFactory = buildSessionFactory();
    
    	// 用来初始化SessionFactory
    	private static SessionFactory buildSessionFactory() {
    		try {
    			// Create the SessionFactory from hibernate.cfg.xml
    			return new Configuration().configure().buildSessionFactory();
    		} catch (Throwable ex) {
    			// Make sure you log the exception, as it might be swallowed
    			System.err.println("Initial SessionFactory creation failed." + ex);
    			throw new ExceptionInInitializerError(ex);
    		}
    	}
    
    	// 得到SessionFactory
    	public static SessionFactory getSessionFactory() {
    		return sessionFactory;// 返回SessionFactory的对象
    	}
    }
    

     HibernateUtil的工具类

    package com.entity;
    
    public class User {
    	private int id;// id
    	private String name;// 名字
    	private String pwd;// 密码
    
    	public User() {
    
    	}
    
    	public User(int id, String name, String pwd) {
    		this.id = id;
    		this.name = name;
    		this.pwd = pwd;
    	}
    
    	public int getId() {
    		return id;
    	}
    
    	public void setId(int id) {
    		this.id = id;
    	}
    
    	public String getName() {
    		return name;
    	}
    
    	public void setName(String name) {
    		this.name = name;
    	}
    
    	public String getPwd() {
    		return pwd;
    	}
    
    	public void setPwd(String pwd) {
    		this.pwd = pwd;
    	}
    
    }
    

     user 就是表格的实体类,根据这个来创建表格

    package com.action;
    
    import java.util.List;
    import java.util.Map;
    
    import org.apache.struts2.interceptor.RequestAware;
    
    import com.entity.User;
    import com.opensymphony.xwork2.ActionContext;
    import com.opensymphony.xwork2.ActionSupport;
    import com.opensymphony.xwork2.ModelDriven;
    import com.opensymphony.xwork2.util.ValueStack;
    import com.service.UserService;
    
    public class UserAction extends ActionSupport implements ModelDriven<User>, RequestAware {
    	private static final long serialVersionUID = -1417237614181805435L;
    	private User user;
    	List<User> list;
    
    	public List<User> getList() {
    		return list;
    	}
    
    	public void setList(List<User> list) {
    		this.list = list;
    	}
    
    	@SuppressWarnings("unused")
    	private Map<String, Object> request;
    
    	public String selectAll() {
    		String sql = "from User";
    		UserService userService = new UserService();// model
    		list = userService.findAll(sql);
    		ValueStack vs = ActionContext.getContext().getValueStack();
    		vs.push(list);
    		return "success";
    	}
    
    	public String add() {
    		UserService userService = new UserService();// model
    		userService.add(user);
    		return "success";
    	}
    
    	public String delete() {
    		UserService userService = new UserService();// model
    		userService.delete(user);
    		return "success";
    	}
    
    	public String update() {
    		UserService userService = new UserService();// model
    		userService.update(user);
    		return "success";
    	}
    
    	public User getUser() {
    		return user;
    	}
    
    	public void setUser(User user) {
    		this.user = user;
    	}
    
    	public User getModel() {
    		if (user == null) {
    			user = new User();
    		}
    		return user;
    	}
    
    	public void setRequest(Map<String, Object> arg0) {
    		request = arg0;
    	}
    }
    

     action类

    package com.dao;
    
    import java.util.List;
    
    import com.entity.User;
    
    public interface DBDao<T> {
    
        public List<T> selectAll(String sql);
    
        public int insert(User user);
    
        public void update(User user);
    
        public void delete(User user);
    }

    dao接口

    package com.dao.impl;
    
    import java.util.List;
    
    import org.hibernate.Session;
    
    import com.util.HibernateUtil;
    import com.dao.DBDao;
    import com.entity.User;
    
    public class DBDaoImpl<T> implements DBDao<T> {
    	@SuppressWarnings("unchecked")
    	public List<T> selectAll(String sql) {
    		Session session = HibernateUtil.getSessionFactory().getCurrentSession();// 得到目前运行的session
    		session.beginTransaction();// 开始事务 没有终结事务的方法
    		List<T> listUsers = session.createQuery(sql).list();
    		HibernateUtil.getSessionFactory().close();
    		return listUsers;
    	}
    
    	public int insert(User user) {
    		Session session = HibernateUtil.getSessionFactory().getCurrentSession();// 得到目前运行的session
    		session.beginTransaction();// 开始事务 没有终结事务的方法
    		int result = (Integer) session.save(user);// 保存对象
    		session.getTransaction().commit();// 提交事务
    		HibernateUtil.getSessionFactory().close();
    		return result;
    	}
    
    	public void delete(User user) {
    		Session session = HibernateUtil.getSessionFactory().getCurrentSession();// 得到目前运行的session
    		session.beginTransaction();// 开始事务 没有终结事务的方法
    		session.delete(user);
    		session.getTransaction().commit();// 提交事务
    		HibernateUtil.getSessionFactory().close();
    	}
    
    	public void update(User user) {
    		Session session = HibernateUtil.getSessionFactory().getCurrentSession();// 得到目前运行的session
    		session.beginTransaction();// 开始事务 没有终结事务的方法
    		session.update(user);
    		session.getTransaction().commit();// 提交事务
    		HibernateUtil.getSessionFactory().close();
    	}
    }
    

     DBDaoImpl接口的实现类,这里值得一提的是,有没有close,有没有beginTransaction,有没有commit,会有不会报错的逻辑bug,建议要么自己一个一个试试,要么像我这样贪方便(懒)全写。

    package com.service;
    
    import java.util.List;
    
    import com.dao.impl.DBDaoImpl;
    import com.entity.User;
    
    public class UserService {
    
    	@SuppressWarnings({ "unchecked", "rawtypes" })
    	public List<User> findAll(String sql) {
    		DBDaoImpl Impl = new DBDaoImpl();
    		return Impl.selectAll(sql);
    	}
    
    	@SuppressWarnings("rawtypes")
    	public int add(User user) {
    		DBDaoImpl Impl = new DBDaoImpl();
    		return Impl.insert(user);
    	}
    
    	@SuppressWarnings("rawtypes")
    	public void delete(User user) {
    		DBDaoImpl Impl = new DBDaoImpl();
    		Impl.delete(user);
    	}
    
    	@SuppressWarnings("rawtypes")
    	public void update(User user) {
    		DBDaoImpl Impl = new DBDaoImpl();
    		Impl.update(user);
    	}
    }
    

     service类model控制事务

  • 相关阅读:
    GHOJ 683 小球
    GHOJ 682 图的m着色问题
    GHOJ 681 最佳调度问题
    YBT 最长公共子上升序列
    YBT 数的划分
    Educational Codeforces Round 68 (Rated for Div. 2) C
    马里奥项目中对象直接通讯小结
    Educational Codeforces Round 67 (Rated for Div. 2) C
    19新疆省赛总结
    Codeforces Round #560 div3 (C,D)
  • 原文地址:https://www.cnblogs.com/ydymz/p/6486905.html
Copyright © 2020-2023  润新知