spring实现泛型hibernate



泛型Hibernate Dao接口的实现

  1. 定义一个泛型接口IHibernateDao<T,PK extends Serilizable>

/**

 * @author Administrator

 * 接口里的方法可以自行定义

 * @param <T>

 * @param <PK>

 */

public interfaceIHibernateDao<T, PK extends Serializable>

  1. 定义一个HibernateDao的实现接口,通过spring来管理hibernatesession的事务处理,自行定义一些通过的方法,方便后续开发人员直接调用接口开发简单的数据库操作(如:分页查询,自定义sql查询,通过条件过滤查询)

    1. 分页查询需要的参数过滤条件、排序字段、每页大小以及页码

  1. return (List<T>) this.getHibernateTemplate().execute(

new HibernateCallback(){

public Object doInHibernate(Session session) throws HibernateException, SQLException

{

Criteria criteria = buildCriteria(session, filters, sorts);

int index = (pageNo - 1)*pageSize;

return   criteria.setFirstResult(index)

.setMaxResults(pageSize)

.list();

    }

});

  1. Criteriacriteria = session.createCriteria(entityClass);

  2. criteria.add(Restrictions.eq(property,value));

  3. criteria.addOrder(Order.desc(properties));

     

     

  1. 对象映射文件中自定义查询语句(hqlsql

    <query name="getUserByName">

               <![CDATA[from User]]>

    </query>

HibernateDao的方法实现

 

  1. return (List<T>) this.getHibernateTemplate().execute(

newHibernateCallback(){

public ObjectdoInHibernate(Session session) throws HibernateException, SQLException

{

Query query = session.getNamedQuery(queryName);

        return query.list();   

}

});

 

 

 

 

 

  1. Xml的定义,采用spring来管理hibernatesession

<?xml version="1.0" encoding="UTF-8"?>

<beans xmlns="http://www.springframework.org/schema/beans"

     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"

     xmlns:aop="http://www.springframework.org/schema/aop"

     xmlns:tx="http://www.springframework.org/schema/tx"

     xmlns:context="http://www.springframework.org/schema/context"

     xsi:schemaLocation="

        http://www.springframework.org/schema/beans

        http://www.springframework.org/schema/beans/spring-beans.xsd

        http://www.springframework.org/schema/tx

        http://www.springframework.org/schema/tx/spring-tx.xsd

        http://www.springframework.org/schema/aop

        http://www.springframework.org/schema/aop/spring-aop.xsd

         http://www.springframework.org/schema/context

        http://www.springframework.org/schema/context/spring-context.xsd">

    

     <bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource">

         <property name="driverClass" value="oracle.jdbc.driver.OracleDriver"/>

         <property name="jdbcUrl" value="jdbc:oracle:thin:@localhost:1521:sno"/>

         <property name="user" value="sna"/>

         <property name="password" value="sna"/>

     </bean>

    

<bean id="sessionFactory" class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">

         <property name="dataSource" ref="dataSource"/>

         <property name="hibernateProperties">

              <props>

                   <prop key="hibernate.dialect">

org.hibernate.dialect.Oracle10gDialect

</prop>  

                   <prop key="hibernate.show_sql">true</prop>             

              </props>          

         </property>

         <property name="mappingDirectoryLocations">

              <list>

                   <value>classpath:com/sno/hibernate/</value>       

              </list>

         </property>

     </bean>

    

<bean id="txManager" class="org.springframework.orm.hibernate3.HibernateTransactionManager">

         <property name="sessionFactory" ref="sessionFactory"/>

     </bean>

    

     <tx:advice id="txAdvice" transaction-manager="txManager">

              <tx:attributes>

                   <tx:method name="get*" read-only="true"/>

                   <tx:method name="*" rollback-for="Exception"/>

              </tx:attributes>

     </tx:advice>

    

     <bean id="baseDao" class="com.sno.core.dao.HibernateDaoImpl">

         <property name="sessionFactory" ref="sessionFactory"/>

     </bean>

    

     <bean id="UserDao" class="com.sno.dao.UserDaoImpl" parent="baseDao">

         <property name="entityClass" value="com.sno.model.User"/>

     </bean>

</beans>

 

 

 

  1. 新建表对应需要新增一个实体类

    1.自增实体类对应的实体DaoUserDao extendsIHibernateDao<User, String>

UserDaoImpl extends HibernateDaoImpl<User, String> implementsUserDao

2.新增实体类的对象映射文件

<?xml version="1.0" encoding="UTF-8"?>

<!DOCTYPE hibernate-mapping PUBLIC

  "-//Hibernate/HibernateMapping DTD 3.0//EN"

  "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">

<hibernate-mapping>

  <class name="com.sno.model.User" table="SNO_E_USER">

       <id name="id" column="id" type="string">

           <generator class="uuid.hex"></generator>

       </id>

       <property name="name"  type="string">

           <column name="name"></column>

       </property>

       <property name="remark"  type="string">

           <column name="remark"></column>

       </property>

  </class>

</hibernate-mapping>

  1. 测试Spring+Hibernate<T>

@Test

public void test(){

ApplicationContextac =  new  ClassPathXmlApplicationContext("

classpath*:hibernate.cfg.xml");   

        UserDao udao = (UserDao) ac.getBean( "UserDao" );

        List<User> user = udao.getUserInfo();

        User u1 = new User();

        u1.setId("aa");

        u1.setName("abc");

        u1.setRemark("abcefgs");

        udao.save(u1);

        if(null == user){

            System.out.println("fff");

        }else{

            System.out.println("bbbb" + user.size());

        }

        for(User u : user){

            System.out.println(u.getId());

        }

}

11.png

Maven搭建

以下是maven所有依赖包

<!-- hibernate -->

         <dependency>

              <groupId>org.hibernate</groupId>

              <artifactId>hibernate-core</artifactId>

              <version>3.6.1.Final</version>

         </dependency>

         <dependency>

              <groupId>org.javassist</groupId>

              <artifactId>javassist</artifactId>

              <version>3.15.0-GA</version>

         </dependency>

 

         <!-- spring mvc -->

         <dependency>

              <groupId>org.springframework</groupId>

              <artifactId>spring-webmvc</artifactId>

              <version>3.2.0.RELEASE</version>

         </dependency>

 

         <!-- spring3 -->

         <dependency>

              <groupId>org.springframework</groupId>

              <artifactId>spring-core</artifactId>

              <version>3.2.0.RELEASE</version>

         </dependency>

         <dependency>

              <groupId>org.springframework</groupId>

              <artifactId>spring-context</artifactId>

              <version>3.2.0.RELEASE</version>

         </dependency>

         <dependency>

              <groupId>org.springframework</groupId>

              <artifactId>spring-jdbc</artifactId>

              <version>3.2.0.RELEASE</version>

         </dependency>

         <dependency>

              <groupId>org.springframework</groupId>

              <artifactId>spring-beans</artifactId>

              <version>3.2.0.RELEASE</version>

         </dependency>

         <dependency>

              <groupId>org.springframework</groupId>

              <artifactId>spring-web</artifactId>

              <version>3.2.0.RELEASE</version>

         </dependency>

         <dependency>

              <groupId>org.springframework</groupId>

              <artifactId>spring-expression</artifactId>

              <version>3.2.0.RELEASE</version>

         </dependency>

         <dependency>

              <groupId>org.springframework</groupId>

              <artifactId>spring-orm</artifactId>

              <version>3.2.0.RELEASE</version>

         </dependency>

         <!-- Oracle驱动包 -->

         <dependency>

              <groupId>com.oracle</groupId>

              <artifactId>ojdbc14</artifactId>

              <version>10.2.0.1.0</version>

         </dependency>

         <dependency>

              <groupId>c3p0</groupId>

              <artifactId>c3p0</artifactId>

              <version>0.9.1.2</version>

         </dependency>

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,这是一个比较常见的应用场景。下面我简单介绍一下如何使用Java的Spring Boot框架创建RESTful风格的服务端,并创建对应的客户端程序。 ## 创建服务端 ### 1. 创建Spring Boot项目 首先,我们需要在IDE中创建一个Spring Boot项目。可以使用Maven或Gradle构建工具,这里以Maven为例。在pom.xml文件中添加以下依赖: ```xml <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <!-- 数据库相关依赖 --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-jpa</artifactId> </dependency> <dependency> <groupId>com.h2database</groupId> <artifactId>h2</artifactId> <scope>runtime</scope> </dependency> ``` 这里使用了Spring Boot内置的Web框架和H2数据库。如果需要使用其他Web框架或数据库,可以根据需要进行调整。 ### 2. 创建实体类和数据访问接口 在src/main/java目录下创建一个名为`com.example.demo`的包,并在该包下创建一个名为`Student`的实体类: ```java @Entity public class Student { @Id @GeneratedValue(strategy = GenerationType.AUTO) private Long id; private String name; private String number; // 省略getter和setter方法 } ``` 这里使用了JPA注解来定义实体类和数据库表之间的映射关系。`@Id`注解表示该字段为主键,`@GeneratedValue`表示主键自动生成。 接下来,在同一个包下创建一个名为`StudentRepository`的接口: ```java public interface StudentRepository extends JpaRepository<Student, Long> { List<Student> findByName(String name); List<Student> findByNumber(String number); } ``` 这里使用了Spring Data JPA框架来访问数据库。`JpaRepository`是一个泛型接口,用于定义通用的CRUD操作。我们可以在该接口中定义自己的查询方法。 ### 3. 创建控制器 在同一个包下创建一个名为`StudentController`的控制器类: ```java @RestController @RequestMapping("/students") public class StudentController { private final StudentRepository studentRepository; public StudentController(StudentRepository studentRepository) { this.studentRepository = studentRepository; } @PostMapping("/") public Student create(@RequestBody Student student) { return studentRepository.save(student); } @GetMapping("/") public List<Student> getAll() { return studentRepository.findAll(); } @GetMapping("/name/{name}") public List<Student> getByName(@PathVariable String name) { return studentRepository.findByName(name); } @GetMapping("/number/{number}") public List<Student> getByNumber(@PathVariable String number) { return studentRepository.findByNumber(number); } } ``` 这里使用了`@RestController`注解来标识该类为控制器,并使用`@RequestMapping`注解来定义路由前缀。 `@PostMapping`注解表示该方法为处理POST请求的方法,`@RequestBody`注解表示该方法接收一个JSON格式的请求体,并将其转换为`Student`对象。 `@GetMapping`注解表示该方法为处理GET请求的方法,`@PathVariable`注解表示该方法接收一个路径参数。 ### 4. 配置数据库连接 在`application.properties`文件中添加以下配置: ``` spring.datasource.driverClassName=org.h2.Driver spring.datasource.url=jdbc:h2:mem:testdb spring.datasource.username=sa spring.datasource.password= spring.jpa.database-platform=org.hibernate.dialect.H2Dialect spring.h2.console.enabled=true ``` 这里使用了H2内存数据库,并启用了H2控制台。 ### 5. 运行服务端 运行项目,访问`http://localhost:8080/h2-console`即可打开H2控制台。可以使用以下语句创建表并插入数据: ```sql CREATE TABLE student ( id BIGINT AUTO_INCREMENT PRIMARY KEY, name VARCHAR(255), number VARCHAR(255) ); INSERT INTO student (name, number) VALUES ('张三', '001'); INSERT INTO student (name, number) VALUES ('李四', '002'); INSERT INTO student (name, number) VALUES ('王五', '003'); ``` 然后,可以使用Postman等工具测试接口是否正常工作。 ## 创建客户端程序 ### 1. 添加依赖 在pom.xml文件中添加以下依赖: ```xml <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <!-- JSON解析依赖 --> <dependency> <groupId>com.fasterxml.jackson.core</groupId> <artifactId>jackson-databind</artifactId> </dependency> ``` 这里使用了Spring Boot内置的Web框架和Jackson库来处理JSON格式的数据。 ### 2. 创建实体类 在src/main/java目录下创建一个名为`com.example.demo`的包,并在该包下创建一个名为`Student`的实体类: ```java public class Student { private Long id; private String name; private String number; // 省略getter和setter方法 } ``` 这里与服务端的实体类相同。 ### 3. 创建客户端类 在同一个包下创建一个名为`StudentClient`的类: ```java public class StudentClient { private final RestTemplate restTemplate; private final String baseUrl; public StudentClient(RestTemplate restTemplate, String baseUrl) { this.restTemplate = restTemplate; this.baseUrl = baseUrl; } public List<Student> getAll() { String url = baseUrl + "/students/"; ResponseEntity<List<Student>> response = restTemplate.exchange(url, HttpMethod.GET, null, new ParameterizedTypeReference<List<Student>>() {}); return response.getBody(); } public List<Student> getByName(String name) { String url = baseUrl + "/students/name/" + name; ResponseEntity<List<Student>> response = restTemplate.exchange(url, HttpMethod.GET, null, new ParameterizedTypeReference<List<Student>>() {}); return response.getBody(); } public List<Student> getByNumber(String number) { String url = baseUrl + "/students/number/" + number; ResponseEntity<List<Student>> response = restTemplate.exchange(url, HttpMethod.GET, null, new ParameterizedTypeReference<List<Student>>() {}); return response.getBody(); } public Student create(Student student) { String url = baseUrl + "/students/"; return restTemplate.postForObject(url, student, Student.class); } } ``` 这里使用了`RestTemplate`来发送HTTP请求,并使用Jackson库来解析JSON格式的响应数据。需要注意的是,`exchange`方法用于处理返回类型为List的情况。 ### 4. 使用客户端类 在main方法中使用`StudentClient`类来调用服务端的接口: ```java @SpringBootApplication public class DemoApplication { public static void main(String[] args) { SpringApplication.run(DemoApplication.class, args); RestTemplate restTemplate = new RestTemplate(); String baseUrl = "http://localhost:8080"; StudentClient studentClient = new StudentClient(restTemplate, baseUrl); // 添加学生信息 Student student1 = new Student(); student1.setName("张三"); student1.setNumber("001"); studentClient.create(student1); Student student2 = new Student(); student2.setName("李四"); student2.setNumber("002"); studentClient.create(student2); Student student3 = new Student(); student3.setName("王五"); student3.setNumber("003"); studentClient.create(student3); // 获取所有学生信息 List<Student> students1 = studentClient.getAll(); System.out.println(students1); // 获取指定姓名的学生信息 List<Student> students2 = studentClient.getByName("张三"); System.out.println(students2); // 获取指定学号的学生信息 List<Student> students3 = studentClient.getByNumber("002"); System.out.println(students3); } } ``` 运行程序,即可测试客户端与服务端的交互是否正常。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值