Salvar imagem no Banco de dados

olá pessoal, eu queria saber como posso salvar a imagem no banco de dados.

Este é o código do modelo

package modelo;

import java.sql.Date;

/**
 *
 * @author Carlos
 */
public class Funcionario {
    private int id_funcionario ;
    private String nome_funcionario;
    private String cpf_funcionario;
    private String rg_funcionario;
    private String email_funcionario;
    private String endereco_funcionario	;
    private String telefone_funcionario;
    private String telefone2_funcionario;
    private int idade_funcionario;
    private Date data_nascimento_funcionario;
    private String sexo_funcionario;
    private String turno;
    private String cargo;
    private double salario;
    private byte[] foto_funcionario;
    private String senha;
    
    
    public int getId_funcionario() {
        return id_funcionario;
    }

    public void setId_funcionario(int id_funcionario) {
        this.id_funcionario = id_funcionario;
    }

    public String getNome_funcionario() {
        return nome_funcionario;
    }

    public void setNome_funcionario(String nome_funcionario) {
        this.nome_funcionario = nome_funcionario;
    }

    public String getCpf_funcionario() {
        return cpf_funcionario;
    }

    public void setCpf_funcionario(String cpf_funcionario) {
        this.cpf_funcionario = cpf_funcionario;
    }

    public String getRg_funcionario() {
        return rg_funcionario;
    }

    public void setRg_funcionario(String rg_funcionario) {
        this.rg_funcionario = rg_funcionario;
    }

    public String getEmail_funcionario() {
        return email_funcionario;
    }

    public void setEmail_funcionario(String email_funcionario) {
        this.email_funcionario = email_funcionario;
    }

    public String getEndereco_funcionario() {
        return endereco_funcionario;
    }

    public void setEndereco_funcionario(String endereco_funcionario) {
        this.endereco_funcionario = endereco_funcionario;
    }

    public String getTelefone_funcionario() {
        return telefone_funcionario;
    }

    public void setTelefone_funcionario(String telefone_funcionario) {
        this.telefone_funcionario = telefone_funcionario;
    }

    public String getTelefone2_funcionario() {
        return telefone2_funcionario;
    }

    public void setTelefone2_funcionario(String telefone2_funcionario) {
        this.telefone2_funcionario = telefone2_funcionario;
    }

    public int getIdade_funcionario() {
        return idade_funcionario;
    }

    public void setIdade_funcionario(int idade_funcionario) {
        this.idade_funcionario = idade_funcionario;
    }

    public Date getData_nascimento_funcionario() {
        return data_nascimento_funcionario;
    }

    public void setData_nascimento_funcionario(Date data_nascimento_funcionario) {
        this.data_nascimento_funcionario = data_nascimento_funcionario;
    }

    public String getSexo_funcionario() {
        return sexo_funcionario;
    }

    public void setSexo_funcionario(String sexo_funcionario) {
        this.sexo_funcionario = sexo_funcionario;
    }

    public String getTurno() {
        return turno;
    }

    public void setTurno(String turno) {
        this.turno = turno;
    }

    public String getCargo() {
        return cargo;
    }

    public void setCargo(String cargo) {
        this.cargo = cargo;
    }

    public double getSalario() {
        return salario;
    }

    public void setSalario(double salario) {
        this.salario = salario;
    }

    public byte[] getFoto_funcionario() {
        return foto_funcionario;
    }

    public void setFoto_funcionario(byte[] foto_funcionario) {
        this.foto_funcionario = foto_funcionario;
    }

    public String getSenha() {
        return senha;
    }

    public void setSenha(String senha) {
        this.senha = senha;
    }
   
}

Este é a classe DAO, que salva no banco de dados.

package DAO;

import connection.ConnectionFactory;
import java.io.FileInputStream;
import java.sql.PreparedStatement;
import java.sql.Connection;
import java.sql.SQLException;
import java.sql.*;
import java.util.ArrayList;
import java.util.List;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.swing.JOptionPane;
import modelo.Funcionario;

/**
 *
 * @author Carlos
 */
public class FuncionarioDAO {
     
    public void salvar(Funcionario f){
        
        Connection con = ConnectionFactory.getConnection();
        PreparedStatement stmt = null;

        try {
            stmt = con.prepareStatement("INSERT INTO funcionario(nome_funcionario,email_funcionario,cpf_funcionario,rg_funcionario,data_nascimento_funcionario,idade_funcionario,telefone_funcionario,telefone2_funcionario,endereco_funcionario,sexo_funcionario,cargo,turno,salario,senha,foto_funcionario)VALUES(?,?,?,?,?,?,?,?,?,?,?,?,?,?,?)");
            stmt.setString(1, f.getNome_funcionario());
            stmt.setString(2, f.getEmail_funcionario());
            stmt.setString(3, f.getCpf_funcionario());
            stmt.setString(4, f.getRg_funcionario());           
            stmt.setDate(5, new java.sql.Date (f.getData_nascimento_funcionario().getTime()));
            stmt.setInt(6, f.getIdade_funcionario());            
            stmt.setString(7, f.getTelefone_funcionario());
            stmt.setString(8, f.getTelefone2_funcionario());
            stmt.setString(9, f.getEndereco_funcionario());
            stmt.setString(10, f.getSexo_funcionario());
            stmt.setString(11, f.getCargo());
            stmt.setString(12, f.getTurno());            
            stmt.setDouble(13, f.getSalario());
            stmt.setString(14, f.getSenha());
            stmt.setBytes(15, f.getFoto_funcionario());
            
            
      stmt.executeUpdate();
            
            JOptionPane.showMessageDialog(null,"Cadastrado com sucesso!");
        } catch (SQLException ex) {
            JOptionPane.showMessageDialog(null,"Erro ao cadastrar: "+ex);
        }finally{
            ConnectionFactory.closeConnection(con, stmt);
        }
 }

Esse é o código do botão para escolher a foto

JFileChooser jfc = new JFileChooser();
        jfc.setDialogTitle("Selecionar arquivo");
        jfc.setFileFilter(new FileNameExtensionFilter("Arquivo de imagens(*.PNG,*.JPG,*.JPEG)","png","jpg","jpeg"));
        int resultado  = jfc.showOpenDialog(this);
        if (resultado == JFileChooser.APPROVE_OPTION){
            File selectedFile = jfc.getSelectedFile();
            try{
                
                fis = new FileInputStream(jfc.getSelectedFile());
                tamanho = (int) jfc.getSelectedFile().length();
                Image foto = ImageIO.read(jfc.getSelectedFile()).getScaledInstance(lblfoto.getWidth(), lblfoto.getHeight(), Image.SCALE_SMOOTH);
                lblfoto.setIcon(new ImageIcon(foto));
                lblfoto.updateUI();
                
                 byte[] fileData = new byte[(int) selectedFile.length()];
                 try (FileInputStream fis = new FileInputStream(selectedFile)) {
                    fis.read(fileData);
                }
            } catch (Exception e) {
                System.out.println(e);
            }
        }

E este é o botão salvar

Funcionario f = new Funcionario();
        FuncionarioDAO dao = new FuncionarioDAO();

        f.setNome_funcionario(nome.getText());
        f.setCpf_funcionario(CPF.getText());
        f.setRg_funcionario(RG.getText());
        f.setEmail_funcionario(email.getText());
        f.setEndereco_funcionario(end.getText());
        f.setTelefone_funcionario(cel.getText());
        f.setTelefone2_funcionario(tel.getText());
        f.setData_nascimento_funcionario(new java.sql.Date(data.getDate().getTime()));
        f.setIdade_funcionario(Integer.parseInt(ida.getText()));
        f.setSexo_funcionario(sexo.getSelectedItem().toString());
        f.setCargo(car.getSelectedItem().toString());
        f.setTurno(tur.getSelectedItem().toString());
        f.setSalario(Double.parseDouble(sala.getText()));
        f.setSenha(sen.getText());                
        f.setFoto_funcionario(fileData);
        dao.salvar(f);

        limpar();

        readJTable();

O problema que eu to tendo, o fileData não esta sendo reconhecido f.setFoto_funcionario(fileData); , fazendo com que não salve no banco de dados.

Poderiam me ajudar nisso?

Como assim não está sendo reconhecido? Está vindo null?

fica assim, comparado aos outros

E quando vc passa o mouse sobre essa linha vermelha de erro, qual erro está aparecendo?

O fileData está a ser declarado dentro de um try. O scope dele é restrito a esse try.
Onde estás a tentar utilizador depois, já “não existe”…

fala para criar uma variavel local chamada fileData ou um campo chamando fileData no GUI.funcionario

então como eu posso fazer para que ele não seja restrito?

Declare a variável fileData fora do try e dentro do try apenas faça a atribuição do valor.

agora ele reconheceu, mas não está salvando no banco de dados a foto

A variável está vindo preenchida? Está ocorrendo algum erro? Qual o tipo de dado que vc usou para a coluna no banco de dados?

não esta ocorrendo nenhum erro.
O tipo de dado esta como Blob.
Como assim a variável tá vindo preenchida?

Se por acaso a fileData data esteja vindo null por alguma razão.

quando eu aperto no botão salvar, aperece a mensagem que eu coloquei quando salvar o funcionário, mas quando vejo o banco de dados o campo da foto está vazio.

Veja se depois da execução dessa parte:

try (FileInputStream fis = new FileInputStream(selectedFile)) {
  fis.read(fileData);
}

a variável fileData está preenchida ou null.

a variável que vc diz, é o label que vai ser preenchido pela imagem? pq se for ele preenche normalmente

A variável que falo é a fileData, que vc estava preenchendo assim:

byte[] fileData = new byte[(int) selectedFile.length()];
try (FileInputStream fis = new FileInputStream(selectedFile)) {
  fis.read(fileData);
}