Problemas com inserção de dados com java

Estou desenvolvendo uma aplicação em java para o estagio, porem, na hora do cadastro, a minha aplicação não salva os dados no banco, poderiam me ajudar? As classes foram feitas a partir de um tutorial no youtube
Classe FabricanteBean

package br.com.drogaria.bean;

import java.sql.SQLException;
import java.util.ArrayList;

import javax.annotation.PostConstruct;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.ViewScoped;
import javax.faces.model.ListDataModel;

import br.com.drogaria.dao.FabricanteDAO;
import br.com.drogaria.domain.Fabricante;

@ManagedBean(name = "MBFabricante")
@ViewScoped
public class FabricanteBean {
	private Fabricante fabricante;


public Fabricante getFabricante() {
	return fabricante;
}

public void setFabricante(Fabricante fabricante) {
	this.fabricante = fabricante;
}

private ListDataModel<Fabricante> itens;

public ListDataModel<Fabricante> getItens() {
	return itens;
}

public void setItens(ListDataModel<Fabricante> itens) {
	this.itens = itens;
}

@PostConstruct
public void prepararPesquisa() {
	FabricanteDAO dao = new FabricanteDAO();

	try {
		ArrayList<Fabricante> lista;
		lista = dao.listar();
		itens = new ListDataModel<Fabricante>(lista);
	} catch (SQLException e) {

		e.printStackTrace();
	}

}


public void prepararNovo() {
	fabricante = new Fabricante();
}
public void novo() {
	try {
		FabricanteDAO dao = new FabricanteDAO();
		dao.salvar(fabricante);
		
		ArrayList<Fabricante> lista = dao.listar();
		itens = new ListDataModel<Fabricante>(lista);
	} catch (SQLException ex) {
		ex.printStackTrace();
	}

}

}

Classe FabricanteDAO

package br.com.drogaria.dao;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;



import br.com.drogaria.domain.Fabricante;
import br.com.drogaria.factory.ConexaoFactory;

public class FabricanteDAO {
	public void salvar(Fabricante f) throws SQLException {
		StringBuilder sql = new StringBuilder(); // utiliza um metodo de junção de strings.
		sql.append("INSERT INTO drogaria_fabricante "); // juntar coisas
		sql.append("(descricao) ");
		sql.append("VALUES(?)");

		Connection conexao = ConexaoFactory.conectar();

		PreparedStatement comando = conexao.prepareStatement(sql.toString());

		comando.setString(1, f.getDescricao());

		comando.executeUpdate(); // execute o comando sql

	}

	public void excluir(Fabricante f) throws SQLException {
		// Definir a query
		StringBuilder sql = new StringBuilder();
		sql.append("DELETE FROM drogaria_fabricante ");
		sql.append("WHERE codigo = ?");
		// Conectar ao banco de dados
		Connection conexao = ConexaoFactory.conectar();
		// Substituir os valores
		PreparedStatement comando = conexao.prepareStatement(sql.toString());
		comando.setLong(1, f.getCodigo());
		// Executa a query
		comando.executeUpdate();

	}

	public void editar(Fabricante f) throws SQLException {
		StringBuilder sql = new StringBuilder();
		sql.append("UPDATE drogaria_fabricante ");
		sql.append("SET descricao = ? ");
		sql.append("WHERE codigo = ? ");

		Connection conexao = ConexaoFactory.conectar();

		PreparedStatement comando = conexao.prepareStatement(sql.toString());

		comando.setString(1, f.getDescricao());
		comando.setLong(2, f.getCodigo());

		comando.executeUpdate();
	}

	public Fabricante buscarPorCodigo(Fabricante f) throws SQLException {
		// defenir a query
		StringBuilder sql = new StringBuilder();
		sql.append("SELECT codigo, descricao ");
		sql.append("FROM drogaria_fabricante ");
		sql.append("WHERE codigo = ? ");

		// conectar ao banco
		Connection conexao = ConexaoFactory.conectar();

		// substituir os valores das interrogações
		PreparedStatement comando = conexao.prepareStatement(sql.toString());
		comando.setLong(1, f.getCodigo());

		// ResultSet = interface usada para guardar os dados vindos do banco de dados. O
		// resultado sera guardado na variavel resultado
		ResultSet resultado = comando.executeQuery();

		// a variavel vai guardar o fabricante da pesquisa. Quando não for encontrado
		// nenhum fabricante, o retorno sera igual a null.
		Fabricante retorno = null;

		
		if (resultado.next()) {
			retorno = new Fabricante();
			retorno.setCodigo(resultado.getLong("codigo"));
			retorno.setDescricao(resultado.getString("descricao"));
		}

		return retorno;
	}

	public ArrayList<Fabricante> listar() throws SQLException{
		StringBuilder sql = new StringBuilder();
		sql.append("SELECT codigo, descricao ");
		sql.append("FROM drogaria_fabricante ");
		sql.append("ORDER BY codigo ASC ");
		
		Connection conexao = ConexaoFactory.conectar();
		
		PreparedStatement comando = conexao.prepareStatement(sql.toString());
		
		ResultSet resultado = comando.executeQuery();
		
		ArrayList<Fabricante> lista = new ArrayList<Fabricante>();
		
		while(resultado.next()) {
			Fabricante f = new Fabricante();
			f.setCodigo(resultado.getLong("codigo"));
			f.setDescricao(resultado.getString("descricao"));
			
			lista.add(f);
		}
		
		return lista;
	}
	
	public ArrayList<Fabricante> buscarPorDescricao(Fabricante f) throws SQLException{
		StringBuilder sql = new StringBuilder();
		sql.append("SELECT codigo, descricao ");
		sql.append("FROM drogaria_fabricante ");
		sql.append("WHERE descricao LIKE ? ");
		sql.append("ORDER BY descricao ASC ");
		
		Connection conexao = ConexaoFactory.conectar();
		
		PreparedStatement comando = conexao.prepareStatement(sql.toString());
		comando.setString(1, "%" + f.getDescricao() + "%");
		
	ResultSet resultado = comando.executeQuery();
		
		ArrayList<Fabricante> lista = new ArrayList<Fabricante>();
		
		while(resultado.next()) {
			Fabricante item = new Fabricante();
			item.setCodigo(resultado.getLong("codigo"));
			item.setDescricao(resultado.getString("descricao"));
			
			lista.add(item);
		}
		
		return lista;
	}

obs: Se eu rodar a classe como java application, ela consegue inserir.

Classe Fabricante:

package br.com.drogaria.domain;

public class Fabricante {
	private Long codigo;
	private String descricao;

	public Long getCodigo() {
		return codigo;
	}

	public void setCodigo(Long codigo) {
		this.codigo = codigo;
	}

	public String getDescricao() {
		return descricao;
	}

	public void setDescricao(String descricao) {
		this.descricao = descricao.toUpperCase();
	}
	
	@Override
	public String toString() {
		String saida = "\nCodigo do fabricante: " + codigo + "\nDescricao: " + descricao;
		return saida;
	}
}

XHTML:

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<ui:composition xmlns="http://www.w3.org/1999/xhtml"
	xmlns:ui="http://java.sun.com/jsf/facelets"
	xmlns:h="http://java.sun.com/jsf/html"
	xmlns:f="http://java.sun.com/jsf/core"
	xmlns:p="http://primefaces.org/ui"
	template="/templates/modeloSistema.xhtml">

	<ui:define name="menu">
		<ui:include src="/includes/menuPrincipal.xhtml" />
	</ui:define>

	<ui:define name="conteudo">
		<h:form id="frmFabListagem">
			<p:dataTable id="tblFabricantes" emptyMessage="Não foram encontrados registros."
				value="#{MBFabricante.itens}" var="item" paginator="true" rows="10">
				
				<f:facet name="header">
					Lista De Fabricantes
				</f:facet>
				
				<p:column headerText="Código" sortBy="#{item.codigo}"
					filterBy="#{item.codigo}">
					<h:outputText value="#{item.codigo}" />
				</p:column>

				<p:column headerText="Descrição " sortBy="#{item.descricao}"
					filterBy="#{item.descricao}">
					<h:outputText value="#{item.descricao}" />
				</p:column>
				<f:facet name="footer">
					<p:commandButton value="Novo" actionListener="#{MBFabricante.prepararNovo}" oncomplete="PF('dlgFabNovo').show();"/>
				</f:facet>
			</p:dataTable>
		</h:form>
		
		
			<p:dialog widgetVar="dlgFabNovo" closable="false"	draggable="false" resizable="false" modal="true" appendTo="@(body)" header="Cadastro de novo Fabricante">
				<h:form>
					<h:panelGrid columns="2">
						<p:outputLabel value="INSIRA A DESCRIÇÃO"/>
						<p:inputText size="55" maxlength="50" value="#{MBFabricante.fabricante.descricao}"/>
					</h:panelGrid>
					
					<h:panelGrid columns="2">
						<p:commandButton value="GRAVAR" actionListener="#{MBFabricante.novo}" oncomplete="PF('dlgFabNovo').hide();" />
						<p:commandButton value="CANCELAR" onclick="PF('dlgFabNovo').hide();"/>
					</h:panelGrid>		
				</h:form>			
			</p:dialog>
	</ui:define>
	
	
</ui:composition>

Alguém poderia me ajuda?