Valid XHTML 1.0 Transitional集成演练路线图 (P16)

Page: [index.html] (v2017-03-01_19-30)

  1. 项目基础:……
  2. Servlet :……
  3. Spring Web MVC :
    1. 基本 Web 应用:……
    2. CRUD :
      1. Spring Web MVC + DataSource + 基本 JDBC :……
      2. Spring Web MVC + DataSource + Spring JDBC Template :……
      3. Spring Web MVC + DataSource + MyBatis :……
      4. Spring Web MVC + DataSource + Hibernate :
        • 方式 - 基本集成:
          • 样例 - 用户管理:
            1. 环境准备:
              1. 修改 pom.xml ,添加需要的库 (并由 Eclipse 的 Maven 插件自动下载、导入) :
                <project ……>
                	……
                	<dependencies>
                		……
                		<dependency>
                			<!-- [Hibernate 3]. -->
                			<groupId>org.hibernate</groupId>
                			<artifactId>hibernate-core</artifactId>
                			<version>3.6.8.Final</version>
                		</dependency>
                		<dependency>
                			<!-- [Hibernate 3] dependence. -->
                			<groupId>javassist</groupId>
                			<artifactId>javassist</artifactId>
                			<version>3.11.0.GA</version>
                		</dependency>
                	</dependencies>
                </project>
                

                说明 / 注意事项:
                • 目前通过 Maven 引入的库有:
                  antlr-2.7.6.jar
                  aopalliance-1.0.jar
                  commons-codec-1.10.0.jar
                  commons-codec-1.10.jar
                  commons-collections-3.1.jar
                  commons-dbcp-1.4.jar
                  commons-logging-1.1.3.jar
                  commons-pool-1.5.4.jar
                  dom4j-1.6.1.jar
                  hamcrest-core-1.3.jar
                  hibernate-commons-annotations-3.2.0.Final.jar
                  hibernate-core-3.6.8.Final.jar
                  hibernate-jpa-2.0-api-1.0.1.Final.jar
                  javassist-3.11.0.GA.jar
                  jta-1.1.jar
                  junit-4.12.jar
                  mybatis-3.2.8.jar
                  mybatis-spring-1.2.2.jar
                  ojdbc5-11.2.0.4.jar
                  slf4j-api-1.6.1.jar
                  spring-aop-3.2.8.RELEASE.jar
                  spring-beans-3.2.8.RELEASE.jar
                  spring-context-3.2.8.RELEASE.jar
                  spring-core-3.2.8.RELEASE.jar
                  spring-expression-3.2.8.RELEASE.jar
                  spring-jdbc-3.2.8.RELEASE.jar
                  spring-tx-3.2.8.RELEASE.jar
                  spring-web-3.2.8.RELEASE.jar
                  spring-webmvc-3.2.8.RELEASE.jar
              2. 编写 Hibernate 主配置文件 src/main/resources/tfw/integration_demo/_04_spring_web_mvc/_02_crud/_04_hibernate_crud/hibernate-config.xml
                由于当前方式下在 Hibernate 中使用第三方数据源过于麻烦,本样例暂时只考虑使用将连接配置写在此文件中:
                <?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>
                		<!-- Connection parameters: -->
                		<property
                				name="connection.driver_class">oracle.jdbc.OracleDriver</property>
                		<property
                				name="connection.url">jdbc:oracle:thin:@127.0.0.1:1521:demo01</property>
                		<property name="connection.username">scott</property>
                		<property name="connection.password">tiger</property>
                
                		<!-- Database SQL dialect: -->
                		<property name="dialect">org.hibernate.dialect.OracleDialect</property>
                
                		<!-- Console output flags: -->
                		<property name="show_sql">true</property>
                		<property name="format_sql">true</property>
                	</session-factory>
                </hibernate-configuration>
                

                说明 / 注意事项:
                1. <property name="dialect">org.hibernate.dialect.OracleDialect</property>”:
                  数据库“方言”指定为 Oracle ,运行过成中将自动生成 Oracle 专用的 SQL 。
                2. <property name="show_sql">true</property>”:
                  在控制台上输出 SQL 。
                3. <property name="format_sql">true</property>”:
                  输出时将 SQL 格式化。
              3. 编写测试用例 tfw.integration_demo._04_spring_web_mvc._02_crud._04_hibernate_crud.user_mgr_testcase._01_basic_way._01_Hibernate_Operation 开启和关闭 Session ,检查 Hibernate 主配置文件的正确性:
                ……
                public class _01_Hibernate_Operation
                {
                
                	private String strClasspathConfFile =
                			"tfw/integration_demo/_04_spring_web_mvc/_02_crud/_04_hibernate_crud/hibernate-config.xml";
                
                	@Test
                	public void testObjects() throws IOException
                	{
                		Configuration conf = new Configuration();
                		System.out.println("Configuration:\n\t" + conf);
                
                		System.out.println("Configuration File:\n\t" + strClasspathConfFile);
                		conf.configure(strClasspathConfFile);
                		System.out.println("Configuration:\n\t" + conf);
                
                		SessionFactory sf = conf.buildSessionFactory();
                		System.out.println("SessionFactory:\n\t" + sf);
                
                		Session session = sf.openSession();
                		System.out.println("Session:\n\t" + session);
                
                		Transaction ts = session.beginTransaction();
                		System.out.println("Transaction:\n\t" + ts);
                
                		session.close();
                		System.out.println("Session Closed:\n\t" + session);
                	}
                
                }
                

            2. 样例编写:
              1. 实体类:
                沿用“基本 JDBC CRUD”样例既有的实体类 tfw.integration_demo._04_spring_web_mvc._02_crud._01_basic_jdbc_crud.entity.User
              2. DAO 层:
                • Hibernate 功能验证:
                  1. 环境准备:
                    1. 编写 Hibernate 映射文件 src/main/resources/tfw/integration_demo/_04_spring_web_mvc/_02_crud/_04_hibernate_crud/dao/impl/oracle/User.hibernate_mapping.xml
                      1. 将实体类 tfw.integration_demo._04_spring_web_mvc._02_crud._01_basic_jdbc_crud.entity.User 映射至表 tfw_dash_user
                      2. 将实体类中的各 bean 属性映射至表中的各列、并标注类型;
                      3. 自定义操作暂时留空。
                      <?xml version="1.0" encoding="utf-8"?>
                      <!DOCTYPE hibernate-mapping PUBLIC
                      		"-//Hibernate/Hibernate Configuration DTD 3.0//EN"
                      		"http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
                      <hibernate-mapping>
                      	<class name="tfw.integration_demo._04_spring_web_mvc._02_crud._01_basic_jdbc_crud.entity.User"
                      			table="tfw_dash_user">
                      		<!-- Special column - Oracle primary key: -->
                      		<id name="id" type="java.lang.Integer" column="id">
                      			<generator class="sequence">
                      				<param name="sequence">tfw_seq_dash_user_id</param>
                      			</generator>
                      		</id>
                      
                      		<!-- Ordinary columns: -->
                      		<property name="name" type="java.lang.String" column="name" />
                      		<property name="passwd" type="java.lang.String" column="passwd" />
                      		<property name="status" type="java.lang.Byte" column="stat" />
                      		<property name="remark" type="java.lang.String" column="remark" />
                      	</class>
                      </hibernate-mapping>
                      

                      说明 / 注意事项:
                      1. Hibernate 映射文件的路径和名称在技术上不必和实体相同或相关仅仅是为了好记、好找,本样例使用了相关的文件名。
                      2. Hibernate 映射文件中的“class”需要在整个 Session 范围内唯一的“name”
                    2. 修改 Hibernate 主配置文件 src/main/resources/tfw/integration_demo/_04_spring_web_mvc/_02_crud/_04_hibernate_crud/hibernate-config.xml ,添加此映射文件:
                      <?xml version="1.0" encoding="UTF-8"?>
                      <!DOCTYPE ……>
                      <hibernate-configuration>
                      	<session-factory>
                      		……
                      		<property name="format_sql">true</property>
                      
                      		<!-- Mapping files: -->
                      		<mapping resource="tfw/integration_demo/_04_spring_web_mvc/_02_crud/_04_hibernate_crud/dao/impl/oracle/User.hibernate_mapping.xml"/>
                      	</session-factory>
                      </hibernate-configuration>
                      

                      说明 / 注意事项:
                      • resource 属性的值用映射文件相对于 CLASSPATH 的路径
                    3. Hibernate 主配置文件由主配置文件加载的映射文件中,任何一个有错误均可导致 Session 加载失败;所以再次运行测试用例 tfw.integration_demo._04_spring_web_mvc._02_crud._04_hibernate_crud.user_mgr_testcase._01_basic_way._01_Hibernate_Operation 开启和关闭 Session ,可检查 Hibernate 主配置文件及所有由主配置文件加载的映射文件的正确性。
                  2. 功能实现:
                    1. 常规 Session 查询 (按 ID 查询) :
                      改造测试用例 tfw.integration_demo._04_spring_web_mvc._02_crud._04_hibernate_crud.user_mgr_testcase._01_basic_way._01_Hibernate_Operation ,添加方法,测试:
                      ……
                      public class _01_Hibernate_Operation
                      {
                      
                      	private String strClasspathConfFile =
                      			"tfw/integration_demo/_04_spring_web_mvc/_02_crud/_04_hibernate_crud/hibernate-config.xml";
                      
                      	private SessionFactory sf;
                      
                      	@Test
                      	public void testObjects() throws IOException
                      	{
                      		……
                      	}
                      
                      	@Before
                      	public void init() throws IOException
                      	{
                      		Configuration conf = new Configuration();
                      		System.out.println("Configuration:\n\t" + conf);
                      
                      		System.out.println("Configuration File:\n\t" + strClasspathConfFile);
                      		conf.configure(strClasspathConfFile);
                      		System.out.println("Configuration:\n\t" + conf);
                      
                      		sf = conf.buildSessionFactory();
                      		System.out.println("SessionFactory:\n\t" + sf);
                      	}
                      
                      	@Test
                      	public void testHibernate_findById()
                      	{
                      		// [S] Preparing.
                      		Integer itgUserId;
                      		Session session;
                      		{
                      			itgUserId = // null; // [!][X] Always exception.
                      					new Integer(10000);
                      
                      			session = sf.openSession();
                      			System.out.println("Session:\n\t" + session);
                      		}
                      		// [E] Preparing.
                      
                      		// [S] Main.
                      		{
                      			User user = (User) session.get(User.class, itgUserId);
                      			System.out.println("User:\n\t" + user);
                      
                      			session.close();
                      			System.out.println("Session Closed:\n\t" + session);
                      		}
                      		// [E] Main.
                      	}
                      
                      }
                      

                    2. HQL 查询:
                      改造测试用例 tfw.integration_demo._04_spring_web_mvc._02_crud._04_hibernate_crud.user_mgr_testcase._01_basic_way._01_Hibernate_Operation ,添加方法,测试:
                      ……
                      public class _01_Hibernate_Operation
                      {
                      
                      	……
                      
                      	@Test
                      	public void testHibernate_findById()
                      	{
                      		……
                      	}
                      
                      	@Test
                      	public void testHibernate_listByName()
                      	{
                      		String strHql;
                      		Session session;
                      		{
                      			String strUserName = // null;
                      					// "Name_AAA";
                      					"root";
                      
                      			strHql = "from User where name="
                      					+ (null == strUserName ? null : "'" + strUserName + "'")
                      					+ " order by name, id";
                      			System.out.println("HQL:\n\t" + strHql);
                      
                      			session = sf.openSession();
                      			System.out.println("Session:\n\t" + session);
                      		}
                      		// [E] Preparing.
                      
                      		// [S] Main.
                      		{
                      			Query query = session.createQuery(strHql);
                      			System.out.println("Query:\n\t" + query);
                      
                      			// [!] User with null ID listed as null row.
                      			@SuppressWarnings("unchecked")
                      			List<User> lstUsers = query.list();
                      
                      			session.close();
                      			System.out.println("Session Closed:\n\t" + session);
                      
                      			showUsers(lstUsers);
                      		}
                      		// [E] Main.
                      	}
                      
                      	@Test
                      	public void testHibernate_listByName2()
                      	{
                      		// [S] Preparing.
                      		String strUserName;
                      		String strHql;
                      		Session session;
                      		{
                      			strUserName = // null; // [!] Miss-spelled SQL, no effect.
                      					// "Name_AAA";
                      					"root";
                      
                      			strHql = "from User where name=:name order by name, id";
                      			System.out.println("HQL:\n\t" + strHql);
                      
                      			session = sf.openSession();
                      			System.out.println("Session:\n\t" + session);
                      		}
                      		// [E] Preparing.
                      
                      		// [S] Main.
                      		{
                      			Query query = session.createQuery(strHql);
                      			System.out.println("Query:\n\t" + query);
                      
                      			query = query.setString("name", strUserName);
                      			System.out.println("Query:\n\t" + query);
                      
                      			// [!] User with null ID listed as null row.
                      			@SuppressWarnings("unchecked")
                      			List<User> lstUsers = query.list();
                      
                      			session.close();
                      			System.out.println("Session Closed:\n\t" + session);
                      
                      			showUsers(lstUsers);
                      		}
                      		// [E] Main.
                      	}
                      
                      	private void showUsers(List<User> lstUsers)
                      	{
                      		……
                      	}
                      
                      }
                      

                      说明 / 注意事项:
                      • 尚未找到令 Hibernate 根据条件字段的值是否为 null在 “…… where xxx is null ……” 和 “…… where xxx=XXX ……” 间自动切换的办法;
                        时间有限,暂不深究。
                    3. 命名的 HQL 查询:
                      1. 修改 Hibernate 映射文件 src/main/resources/tfw/integration_demo/_04_spring_web_mvc/_02_crud/_04_hibernate_crud/dao/impl/oracle/User.hibernate_mapping.xml ,添加自定义 HQL 查询:
                        <?xml version="1.0" encoding="utf-8"?>
                        <!DOCTYPE ……>
                        <hibernate-mapping>
                        	<class ……>
                        		……
                        
                        		<!-- Mappings of ordinary columns: -->
                        		<property name="name" type="java.lang.String" column="name" />
                        		<property name="passwd" type="java.lang.String" column="passwd" />
                        		<property name="status" type="java.lang.Byte" column="stat" />
                        		<property name="remark" type="java.lang.String" column="remark" />
                        
                        		<!-- Customized queries: -->
                        		<query name="listByName">
                        			from User where name=:name
                        			order by name, id
                        		</query>
                        		<query name="listAll">
                        			from User order by name, id
                        		</query>
                        	</class>
                        </hibernate-mapping>
                        

                      2. 改造测试用例 tfw.integration_demo._04_spring_web_mvc._02_crud._04_hibernate_crud.user_mgr_testcase._01_basic_way._01_Hibernate_Operation ,添加方法,测试:
                        ……
                        public class _01_Hibernate_Operation
                        {
                        
                        	……
                        
                        	@Test
                        	public void testHibernate_listByName2()
                        	{
                        		……
                        	}
                        
                        	@Test
                        	public void testHibernate_listByName3()
                        	{
                        		// [S] Preparing.
                        		String strUserName;
                        		Session session;
                        		{
                        			strUserName = // null; // [!] Miss-spelled SQL, no effect.
                        					// "Name_AAA";
                        					"root";
                        
                        			session = sf.openSession();
                        			System.out.println("Session:\n\t" + session);
                        		}
                        		// [E] Preparing.
                        
                        		// [S] Main.
                        		{
                        			Query query = session.getNamedQuery(
                        					"tfw.integration_demo._04_spring_web_mvc._02_crud._01_basic_jdbc_crud.entity.User.listByName");
                        			System.out.println("Query:\n\t" + query);
                        
                        			query = query.setString("name", strUserName);
                        			System.out.println("Query:\n\t" + query);
                        
                        			// [!] User with null ID listed as null row.
                        			@SuppressWarnings("unchecked")
                        			List<User> lstUsers = query.list();
                        
                        			session.close();
                        			System.out.println("Session Closed:\n\t" + session);
                        
                        			showUsers(lstUsers);
                        		}
                        		// [E] Main.
                        	}
                        
                        	@Test
                        	public void testHibernate_listAll()
                        	{
                        		// Preparing.
                        		Session session = sf.openSession();
                        		System.out.println("Session:\n\t" + session);
                        
                        		// [S] Main.
                        		{
                        			Query query = session.getNamedQuery(
                        					"tfw.integration_demo._04_spring_web_mvc._02_crud._01_basic_jdbc_crud.entity.User.listAll");
                        			System.out.println("Query:\n\t");
                        
                        			// [!] User with null ID listed as null row.
                        			@SuppressWarnings("unchecked")
                        			List<User> lstUsers = query.list();
                        
                        			session.close();
                        			System.out.println("Session Closed:\n\t" + session);
                        
                        			showUsers(lstUsers);
                        		}
                        		// [E] Main.
                        	}
                        
                        	private void showUsers(List<User> lstUsers)
                        	{
                        		……
                        	}
                        
                        }
                        

                    4. ……