一、引入相关依赖

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <groupId>com.jx</groupId>
    <artifactId>hibernate_shiro</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <name>hibernate_shiro</name>
    <description>Demo project for Spring Boot</description>

    <properties>
        <java.version>1.8</java.version>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
        <spring-boot.version>2.3.7.RELEASE</spring-boot.version>
    </properties>

    <dependencies>
        <!-- 添加JPA依赖,官网描述支持spring data JPA 和hibernate-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-jpa</artifactId>
        </dependency>
        <!--导入连接MySQL的依赖 -->
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
        </dependency>

        <!-- 添加web依赖,使用内置tomcat容器-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
            <exclusions>
                <exclusion>
                    <groupId>org.junit.vintage</groupId>
                    <artifactId>junit-vintage-engine</artifactId>
                </exclusion>
            </exclusions>
        </dependency>
    </dependencies>

    <dependencyManagement>
        <dependencies>
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-dependencies</artifactId>
                <version>${spring-boot.version}</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
        </dependencies>
    </dependencyManagement>

    <build>
        <plugins>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-compiler-plugin</artifactId>
                <version>3.8.1</version>
                <configuration>
                    <source>1.8</source>
                    <target>1.8</target>
                    <encoding>UTF-8</encoding>
                </configuration>
            </plugin>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
                <version>2.3.7.RELEASE</version>
                <configuration>
                    <mainClass>com.jx.hibernate_shiro.HibernateShiroApplication</mainClass>
                </configuration>
                <executions>
                    <execution>
                        <id>repackage</id>
                        <goals>
                            <goal>repackage</goal>
                        </goals>
                    </execution>
                </executions>
            </plugin>
        </plugins>
    </build>

</project>

导入hibernate、MySQL、web依赖

二、设置数据库信息及hibernate配置


# 应用服务 WEB 访问端口
server.port=8080


#mysql
spring.datasource.url=jdbc:mysql://localhost:3306/shiro?serverTimezone=Asia/Shanghai&useunicode=true&characterEncoding=utf8
spring.datasource.username=root
spring.datasource.password=
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
#spring.datasource.max-idle=10
#spring.datasource.max-wait=10000
#spring.datasource.min-idle=5
#spring.datasource.initial-size=5
# 指定数据库类型
spring.jpa.database = MYSQL
# 是否展示SQL
spring.jpa.show-sql = true
# hibernate自动建表
spring.jpa.hibernate.ddl-auto = update
#命名策略
spring.jpa.hibernate.naming-strategy = org.hibernate.cfg.ImprovedNamingStrategy
spring.jpa.properties.hibernate.dialect = org.hibernate.dialect.MySQL5Dialect
spring.jpa.properties.hibernate.current_session_context_class=org.springframework.orm.hibernate5.SpringSessionContext


注意新版本中驱动已更改,设置spring.datasource.driver-class-name=com.mysql.jdbc.Driver启动会警告。

另外高版本MySQL里的需要配置确定时区问题,否则会报错,在URL路径下追加  serverTimezone=UTC&  

没有红框内容会报错

需要在JDBC或者MySQL服务里配置统一时区,建议设置

serverTimezone=Asia/Shanghai

三、编写hibernate配置类,自定义sessionfactory。

package com.jx.hibernate_shiro.hibernate;


import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.core.env.Environment;
import org.springframework.jdbc.datasource.DriverManagerDataSource;
import org.springframework.orm.hibernate5.LocalSessionFactoryBean;
import java.util.Properties;

@Configuration
public class HibernateConfig {
   @Autowired
   private Environment environment;
   /*
   * 配置SessionFactory会话工厂注入到spring容器
   * */
   @Bean
    LocalSessionFactoryBean sessionFactory(){
        LocalSessionFactoryBean localSessionFactoryBean = new LocalSessionFactoryBean();
        localSessionFactoryBean.setDataSource(getDataSource());
        localSessionFactoryBean.setPackagesToScan("com.jx.hibernate_shiro");
        localSessionFactoryBean.setHibernateProperties(hibernateProperties());
        return localSessionFactoryBean;
    }
    /*
    * 配置数据源
    * */
    private DriverManagerDataSource getDataSource(){
        DriverManagerDataSource dataSource = new DriverManagerDataSource();
        dataSource.setDriverClassName(environment.getProperty("spring.datasource.driver-class-name"));
        dataSource.setUsername(environment.getProperty("spring.datasource.username"));
        dataSource.setPassword(environment.getProperty("spring.datasource.password"));
        dataSource.setUrl(environment.getProperty("spring.datasource.url"));
        return dataSource;
    }
    /*
    *设置hibernate配置属性
    * */
    private Properties hibernateProperties(){
        Properties properties = new Properties();
        properties.setProperty("hibernate.naming-strategy",environment.getProperty("spring.jpa.hibernate.naming-strategy"));
        properties.setProperty("hibernate.dialect",environment.getProperty("spring.jpa.properties.hibernate.dialect"));
        properties.setProperty("hibernate.current_session_context_class",environment.getProperty("spring.jpa.properties.hibernate.current_session_context_class"));
        properties.setProperty("hibernate.show_sql",environment.getProperty("spring.jpa.show-sql"));
        properties.setProperty("hibernate.hbm2ddl.auto",environment.getProperty("spring.jpa.hibernate.ddl-auto"));
        
        return  properties;
   }

}

编写hibernate工具类

package com.jx.hibernate_shiro.hibernate;

import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;

/*
* hibernate工具类
* */
@Component
public class HibernateUtils {
    @Autowired
    private SessionFactory sessionFactory;
    //开启一个会话,提交后会自动关闭会话
    public Session getSession(){
        return sessionFactory.getCurrentSession();
    }
    //开启一个会话,提交后需要手动关闭会话
    public Session openSession(){
        return sessionFactory.openSession();
    }
    //关闭会话
    public void closeSession(Session session){
        if (session!=null&session.isOpen()){
            try {
                session.close();
            }catch (Exception e){
                e.getStackTrace();
            }
        }
    }
}

四、编写实体类、DAO、controller

实体类与数据库表的映射关系

package com.jx.hibernate_shiro.beans;

import org.springframework.stereotype.Component;

import javax.persistence.*;
import java.io.Serializable;

@Entity
@Table(name= "t_user")//指定数据库表名
@Component
public class User implements Serializable {
    @Id//指定实体类属性为表ID字段
    @GeneratedValue(strategy = GenerationType.IDENTITY)//指定ID生成策略为自增长
    private Integer userID;
    @Column(name = "userName")//指定属性与表字段名对应关系
    private String userName;
    @Column(name="passWord")
    private String passWord;

    public Integer getUserID() {
        return userID;
    }

    public String getUserName() {
        return userName;
    }

    public String getPassWord() {
        return passWord;
    }

    public void setPassWord(String passWord) {
        this.passWord = passWord;
    }

    public void setUserName(String userName) {
        this.userName = userName;
    }

    public void setUserID(Integer userID) {
        this.userID = userID;
    }
}

DAO类

package com.jx.hibernate_shiro.Daos;

import com.jx.hibernate_shiro.beans.User;
import com.jx.hibernate_shiro.hibernate.HibernateUtils;
import org.hibernate.Session;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Repository;

@Repository
public class UserDao {
    @Autowired
    private HibernateUtils hibernateUtils;

    //根据用户ID查询用户
    public User getUser(Integer userID){
        Session session = null;
        User user = null;
        try{
            session = hibernateUtils.openSession();
            user = session.get(User.class,userID);
        }catch (Exception e){
            e.getStackTrace();
        }finally {
            hibernateUtils.closeSession(session);
        }

        return user;
    }
    //添加用户
    public void addUser(User user){
        Session session = null ;
        try{
            session = hibernateUtils.openSession();
           session.save(user);
        }catch (Exception e){
            e.getStackTrace();
        }finally {
            hibernateUtils.closeSession(session);
        }
    }
}

controller类

package com.jx.hibernate_shiro.controllers;

import com.jx.hibernate_shiro.Daos.UserDao;
import com.jx.hibernate_shiro.beans.User;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
public class UserController {
    @Autowired
    private  UserDao userDao;
    @Autowired
    private User user;

    /*
    * 根据ID查询用户
    * */
    @RequestMapping("/getUserInfo/{userID}")
    public User getUserInfo(@PathVariable Integer userID){
        User user = userDao.getUser(userID);
        return user;
    }
    /*
    * 添加一个用户
    * */
    @RequestMapping("/add/{userName}/{passWord}")
    public void addUser(@PathVariable String userName,@PathVariable String passWord){
        user.setUserName(userName);
        user.setPassWord(passWord);
        userDao.addUser(user);

    }
}

编写springboot启动类

package com.jx.hibernate_shiro;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.autoconfigure.data.jpa.JpaRepositoriesAutoConfiguration;
import org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration;
import org.springframework.boot.autoconfigure.orm.jpa.HibernateJpaAutoConfiguration;


@SpringBootApplication(exclude = {//排除相关自动配置
        DataSourceAutoConfiguration.class,
        JpaRepositoriesAutoConfiguration.class,
        HibernateJpaAutoConfiguration.class })
public class HibernateShiroApplication {

    public static void main(String[] args) {
        SpringApplication.run(HibernateShiroApplication.class, args);
    }

}

注意在@SpringbootApplication()注解中排除相关依赖的自动配置(JPA、hibernate、DataSource)

文件目录结构

 

五、测试添加数据和查询数据

添加两个用户

添加成功

 

Logo

腾讯云面向开发者汇聚海量精品云计算使用和开发经验,营造开放的云计算技术生态圈。

更多推荐