SpringBoot 集成Hibernate

本文详细介绍如何在SpringBoot项目中整合Hibernate进行数据库操作,包括配置文件设置、自定义DAO接口实现复杂查询等功能。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

技术支持:springboot,mysql,hibernate,entityManage

结构图:


功能计划:查询出User数据信息

————————————************分隔符**********———————

1:配置pom.xml

<!--mysql支持  MySQL的JDBC驱动包,用JDBC连接MySQL数据库时必须使用该jar包  -->
       <dependency>
           <groupId>mysql</groupId>
           <artifactId>mysql-connector-java</artifactId>
       </dependency>
       
       <!--事务管理:原子性,一致性,隔离性,持久性  -->
      <dependency>
         <groupId>org.springframework.boot</groupId>
         <artifactId>spring-boot-starter-jdbc</artifactId>
      </dependency>
      
      <!--jpa 集成hibernate -->
      <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-jpa</artifactId>

       </dependency>



2:配置application.properties

#---------------------jspSupport---------------------
spring.mvc.view.prefix=/WEB-INF/jsp/
spring.mvc.view.suffix=.jsp
spring.mvc.date-format="yyyy-MM-dd HH:mm:ss"

#-----------------dataSource------------
spring.datasource.url=jdbc:mysql://localhost:3306/db_dz_rhcms
spring.datasource.username = root
spring.datasource.password = zhao4443
spring.datasource.driverClassName = com.mysql.jdbc.Driver
spring.datasource.max-active=20
spring.datasource.max-idle=8
spring.datasource.min-idle=8
spring.datasource.initial-size=10

#-----------------JPA-hibernate--------------
spring.jpa.database = MYSQL
spring.jpa.show-sql = true
spring.jpa.hibernate.ddl-auto = update
spring.jpa.hibernate.naming-strategy = org.hibernate.cfg.ImprovedNamingStrategy

spring.jpa.properties.hibernate.dialect = org.hibernate.dialect.MySQL5Dialect


3:配置UserDto


4:hibernate封装查询方法

    4.1

    public interface BaseAppDao<T,ID extends Serializable> {
/**
     * 保存数据对象
     * @param entity
     * @return
     */
boolean insert(T entity);

/**
     * 根据id查询
     * @param id
     * @param t
     * @return
     */
T findById(T t,Long id);

/**
     * 根据表名,字段,参数查询,拼接sql语句
     * @param  tablename 表名
     * @param filed 字段名
     * @param o 字段参数
     * @return
     */
List<T> findByHql(String tableName,String filed,Object o);
Object findObjiectByHql(String tablename,String filed,Object o);

/**
     * 多个字段的查询
     * @param tablename 表名
     * @param map 将你的字段传入map中
     * @return
     */
List<T> findByMoreFiled(String tablename,LinkedHashMap<String,Object> map);

/**
     * 多字段查询分页
     * @param tablename 表名
     * @param map 以map存储key,value
     * @param start 第几页
     * @param pageNumer 一个页面的条数
     * @return
     */
List<T> findByMoreFiledPage(String tableName,LinkedHashMap<String, Object> map,int star,int pageNumer);

/**
     * 一个字段的分页
     * @param  tablename 表名
     * @param filed 字段名
     * @param o 字段参数
     * @param start 第几页
     * @param pageNumer 一个页面多少条数据
     * @return
     */
List<T> findPages(String tableName,String filed,Object o,int start,int pageNumer);

/**
     * 根据表的id删除数据
     * @param  entity
     */
boolean delete(T entity);

/**
     * 更新对象
     * @param e
     * @return
     */
boolean update(T entity);

/**
     * 根据传入的map遍历key,value拼接字符串,以id为条件更新
     * @param tablename 表名
     * @param map 传入参数放入map中
     * @return
     */
Integer updateMoreFiled(String tableName,LinkedHashMap<String, Object> map,Long id);

/**
     * 根据条件查询总条数返回object类型
     * @param tablename  表名
     * @param map 传入参数放入map中
     * @return
     */
Object findCount(String tableName,LinkedHashMap<String, Object> map);


}

   4.2

   @Repository
public class SimpleService<T,ID extends Serializable> implements BaseAppDao<T, ID>{

private static Logger log=Logger.getLogger(SimpleService.class);


@PersistenceContext
private EntityManager entityManager;


/**
* 插入数据
*/
@Transactional
@Override
public boolean insert(T entity) {
boolean flag=false;
try {
entityManager.persist(entity);
flag=true;
} catch (Exception e) {
e.printStackTrace();
}
return flag;
}
    /**
     * 根据id查找数据
     */
@Transactional
@Override
public Object findById(Object obj, Long id) {
return entityManager.find(obj.getClass(), id);
}
    /**
     * 根据表名,字段,参数查询,拼接sql语句
     */
@Transactional
@Override
public List<T> findByHql(String tableName, String filed, Object o) {
String sql="from "+tableName+" where "+filed+" =?";
log.warn(sql);
Query query=entityManager.createQuery(sql);
query.setParameter(1, o);
List<T>  result=query.getResultList();
entityManager.close();
return result;
}


@Transactional
@Override
public Object findObjiectByHql(String tablename, String filed, Object o) {
Query query=entityManager.createQuery("from "+tablename+" where "+filed+" =?");
query.setParameter(1, o);
entityManager.close();
return query.getSingleResult();
}


/**
     * 多个字段的查询
     * @param tablename 表名
     * @param map 将你的字段传入map中
     * key:字段 ,value:值
     * @return
     */
@Transactional
@Override
public List<T> findByMoreFiled(String tablename, LinkedHashMap<String, Object> map) {
List<Object> filedlist=new ArrayList<>();
StringBuffer sql=new StringBuffer();
sql.append("from "+tablename+" u where ");
Iterator<String> iter= map.keySet().iterator();
while(iter.hasNext()) {
sql.append(" u."+iter.next()+"=? and ");
filedlist.add(map.get(iter.next()));
}
Query query=entityManager.createQuery(sql.toString().substring(0,sql.toString().length()-4));

for(int i=0;i<filedlist.size();i++) {
query.setParameter(i+1, filedlist.get(i));
}
List<T> result=query.getResultList();
entityManager.close();
return result;
}


/**
     * 多字段查询分页
     * @param tablename 表名
     * @param map 以map存储key,value
     * @param start 第几页
     * @param pageNumer 一个页面的条数
     * @return
     */
@Transactional
@Override
public List<T> findByMoreFiledPage(String tableName, LinkedHashMap<String, Object> map, int star, int pageNumer) {
List<Object> filedlist=new ArrayList<>();
StringBuffer sql=new StringBuffer();
sql.append("from "+tableName+" u where ");
Iterator<String> iter= map.keySet().iterator();
while(iter.hasNext()) {
sql.append(" u."+iter.next()+"=? and ");
filedlist.add(map.get(iter.next()));
}
Query query=entityManager.createQuery(sql.toString().substring(0,sql.toString().length()-4));

for(int i=0;i<filedlist.size();i++) {
query.setParameter(i+1, filedlist.get(i));
}
query.setFirstResult((star-1)*pageNumer);
query.setMaxResults(pageNumer);
List<T> result=query.getResultList();
entityManager.close();
return result;
}


/**
     * 一个字段的分页
     * @param  tablename 表名
     * @param filed 字段名
     * @param o 字段参数
     * @param start 第几页
     * @param pageNumer 一个页面多少条数据
     * @return
     */
@Transactional
@Override
public List<T> findPages(String tableName, String filed, Object o, int start, int pageNumer) {
try {
Query query=entityManager.createQuery(" from "+tableName+" t where t."+filed+"=?");
query.setParameter(1, o);
query.setFirstResult((start-1)*pageNumer);
query.setMaxResults(pageNumer);
List<T> result=query.getResultList();
entityManager.close();
return result;

} catch (Exception e) {
log.warn(e.getMessage());
return null;
}
}


/**
     * 根据表的id删除数据
     * @param  entity
     */
@Transactional
@Override
public boolean delete(T entity) {
boolean flag=false;
try {
entityManager.remove(entityManager.merge(entity));
flag=true;
return flag;
} catch (Exception e) {
log.warn(e.getMessage());
return flag;
}
}


/**
     * 更新对象
     * @param e
     * @return
     */
@Transactional
@Override
public boolean update(T entity) {
boolean flag=false;
try {
entityManager.merge(entity);
flag=true;
return flag;
} catch (Exception e) {
log.warn(e.getMessage());
return flag;
}
}
/**
     * 根据传入的map遍历key,value拼接字符串,以id为条件更新
     * @param tablename 表名
     * @param map 传入参数放入map中
     * @return
     */
@Transactional
@Override
public Integer updateMoreFiled(String tableName, LinkedHashMap<String, Object> map,Long id) {

StringBuffer sql=new StringBuffer();
sql.append("update "+tableName+" t set ");
Iterator<String> iter=map.keySet().iterator();
while(iter.hasNext()) {
if(map.get(iter.next()).getClass().getTypeName()=="java.lang.String") {
sql.append("t."+iter.next()+"='"+map.get(iter.next())+"', " );
}else {
sql.append("t."+iter.next()+"="+map.get(iter.next())+", " );
}
}
String exesql=sql.toString().substring(0,sql.toString().length()-2);
exesql+="t.id="+id;
try {
Query query=entityManager.createQuery(exesql);
query.setParameter(1, id);
int result=query.executeUpdate();
return result;
} catch (Exception e) {
log.warn(e.getMessage());
return 0;
}
}


/**
     * 根据条件查询总条数返回object类型
     * @param tablename  表名
     * @param map 传入参数放入map中
     * @return
     */
@Transactional
@Override
public Object findCount(String tableName, LinkedHashMap<String, Object> map) {
String sql="select count(u) from "+tableName+" u WHERE ";
        Set<String> set=null;
        set=map.keySet();
        List<String> list=new ArrayList<>(set);
        List<Object> filedlist=new ArrayList<>();
        for (String filed:list){
            sql+="u."+filed+"=? and ";
            filedlist.add(filed);
        }
        sql=sql.substring(0,sql.length()-4);
        System.out.println(sql+"--------sql语句-------------");
        Query query=entityManager.createQuery(sql);
        for (int i=0;i<filedlist.size();i++){
            query.setParameter(i+1,map.get(filedlist.get(i)));
        }
        return query.getSingleResult();
}


}

5:登录验证

    /**
 * @author 赵参谋
 *
 */
@Controller
public class Login {

@SuppressWarnings("rawtypes")
@Resource
private SimpleService simpleService;

private User user=new User();

/**
* 跳转登陆页面
* @author 赵参谋
*/
    @RequestMapping(value="/demo")
    public String userLogin() {
    return  "index";
    }
    
    /**
     * 登陆验证
     * @author 赵参谋
     */
    @RequestMapping(value="/sysLogin.do")
    public String sysLogin(@NotBlank String name,@NotBlank String password) {
    User obj= (User)simpleService.findById(user, Long.parseLong("1"));
    return null;
   
    }

}


参考文献:entityManage:  https://docs.oracle.com/javaee/5/api/javax/persistence/EntityManager.html

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值