使用Hibernate 的sql 多資料來源查詢
阿新 • • 發佈:2018-11-25
1、資料庫配置: #MySQL jdbc3.driverClassName=com.mysql.jdbc.Driver #jdbc.url=jdbc\:mysql\://0.0.0.0\:3306/sss?useUnicode\=true&characterEncoding\=UTF-8 jdbc3.url=jdbc\:mysql\://0.0.0.0\:3306/sss?useUnicode\=true&characterEncoding\=UTF-8 #jdbc.url=jdbc\:mysql\://0.0.0.0\:3306/sss?useUnicode\=true&characterEncoding\=UTF-8 #jdbc.url=jdbc:mysql://0.0.0.0\:3306/sss?useUnicode=true&characterEncoding=UTF-8 jdbc3.username=root jdbc3.password=123456 jdbc3.dbType=mysql 2、mvc配置: <!--補錄系統庫 --> <!-- 配置資料來源3 --> <bean id="dataSource_jdbc3" class="com.mchange.v2.c3p0.ComboPooledDataSource" destroy-method="close"> <property name="driverClass" value="${jdbc3.driverClassName}" /> <property name="jdbcUrl" value="${jdbc3.url}" /> <property name="user" value="${jdbc3.username}" /> <property name="password" value="${jdbc3.password}" /> <property name="acquireIncrement"> <value>${c3p0.acquireIncrement}</value> </property> <property name="initialPoolSize"> <value>${c3p0.initialPoolSize}</value> </property> <property name="minPoolSize"> <value>${c3p0.minPoolSize}</value> </property> <property name="maxPoolSize"> <value>${c3p0.maxPoolSize}</value> </property> <property name="maxIdleTime"> <value>${c3p0.maxIdleTime}</value> </property> <property name="idleConnectionTestPeriod"> <value>${c3p0.idleConnectionTestPeriod}</value> </property> <property name="maxStatements"> <value>${c3p0.maxStatements}</value> </property> <property name="numHelperThreads"> <value>${c3p0.numHelperThreads}</value> </property> </bean> <bean id="jdbcTemplate_jdbc3" class="org.springframework.jdbc.core.namedparam.NamedParameterJdbcTemplate"> <constructor-arg ref="dataSource_jdbc3" /> </bean> 3、java程式碼 @Autowired @Qualifier("jdbcTemplate_jdbc3") private NamedParameterJdbcTemplate jdbcTemplate_jdbc3; Map<String, Object> param //KeyHolder keyHolder = new GeneratedKeyHolder(); SqlParameterSource sqlp = new MapSqlParameterSource(param); //update(insertSql, sqlp, keyHolder)//增量 Map<String, Object> map = new HashMap<String, Object>(); int map1 = jdbcTemplate_jdbc3.queryForInt(sqlCount, sqlp);//列表數字 map.put("total", map1); List<Map<String, Object>> list = jdbcTemplate_jdbc3.queryForList(sqlDygc+sqlLimit, sqlp);//list《map》 map.put("rows", list); 當sql等查詢方式不能滿足效能或靈活性的要求,必須使用SQL時,大家有三種選擇: 第一、使用Hibernate 的sql 查詢函式,將查詢結果物件轉為Entity物件。 第二、使用Hibernate Session的getConnection 獲得JDBC Connection,然後進行純JDBC API操作; 第三、選擇把Spring的JDBCTemplate作為一種很不錯的JDBC Utils來使用。 JDBCTemplate---方法介紹和簡單示例JDBCTemplate---方法介紹和簡單示例 /*使用jdbcTemplate查詢資料的時候可以使用queryForXXX等方法。下面我們就一一解析一下:*/ 1、jdbcTemplate.queryForInt()和jdbcTemplate.queryForLong() //使用queryForInt返回user表中的記錄數量,queryForInt搭配這樣的sql可以在分頁的時候計算總記錄數 jdbcTemplate.queryForInt("select count(*) from user"); 2、jdbcTemplate.queryForObject() //本質上和queryForInt相同,只是可以返回不同的物件,例如返回一個String物件 String name = (String) jdbcTemplate.queryForObject( --3個引數: 1、sql 2、要傳遞的引數陣列 3、返回來的物件class "SELECT name FROM USER WHERE id = ?", new Object[] {id}, java.lang.String.class); 3、jdbcTemplate.queryForList(???) //返回一個裝有map的list,每一個map是一條記錄,map裡面的key是欄位名 List rows = jdbcTemplate.queryForList("SELECT * FROM user"); //得到裝有map的list for(int i=0;i<rows.size();i++){ //遍歷 Map userMap=rows.get(i); System.out.println(userMap.get("id")); System.out.println(userMap.get("name")); System.out.println(userMap.get("age")); } 4、jdbcTemplate.queryForMap(SQL) //這個查詢只能是查詢一條記錄的查詢,返回一個map,key的值是column的值 Map map = jdbcTemplate.queryForMap("select count(*) as keyval from user"); map.get("keyval") 5、jdbcTemplate.queryForRowSet(???) //返回一個RowSet 然後呼叫.getString或者getInt等去取值 6、jdbc1.query(sql, new RowCallbackHandler() //返回一個ResultSet物件, processRow有自動迴圈的機制,它會自動執行processRow中的語句直到 //rs的size執行完了為止。我們可以在這其中用list完成物件的轉移,只不過list要用final來修飾 jdbc1.query(sql, new RowCallbackHandler() { //editing public void processRow(ResultSet rs) throws SQLException { VideoSearch vs = new VideoSearch(); vs.setRECORDINGFILENAME(rs.getString("RECORDINGFILENAME")); vs.setCALLID(rs.getString("CALLID")); list.add(vs); } } 7.更新操作 //執行sql語句,無返回執,可用於插入等操作 jdbcTemplate.execute(sql); //更新操作,返回受影響的行數 jdbcTemplate.update(strSql.toString()); //執行批量更新,引數為string陣列 jdbcTemplate.batchUpdate(sql); //更新,args為物件陣列 jdbcTemplate.update(strSql, args); /* 說明: JDBCTemplate的使用方法: 在ApplicationContext.xml中定義一個jdbcTemplate的節點,使用POJO注入,獲得注入後可以執行操作 不需要繼承什麼基類 */ <bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate"> <property name="dataSource" ref="dataSource"/> </bean> SqlRowSet rs = jdbcTemplate.queryForRowSet(sql, params); /* jdbcTemplate有很多的ORM化回撥操作將返回結果轉為物件列表, 但很多時候還是需要返回ResultSet,Spring有提供一個類似ResultSet的,實現JDBC3.0 RowSet介面的Spring SqlRowSet 注意 jdbcTemplate儘量只執行查詢操作,莫要進行更新,否則會破壞Hibernate的二級快取體系 */