Adição, exclusão, modificação e consulta simples de banco de dados de demonstração MyBatis

1. Introdução ao MyBatis (retirado de documentos oficiais): MyBatis é uma excelente estrutura de camada de persistência que suporta SQL personalizado, procedimentos armazenados e mapeamento avançado. MyBatis evita quase todo o código JDBC e configuração manual de parâmetros e obtenção de conjuntos de resultados. MyBatis pode usar XML simples ou anotações para configuração e mapas nativos, e interfaces de mapas e POJOs Java (Plain Old Java Objects) para registros no banco de dados.
Composição: SqlSessionFactoryBuilder ——> Construir SqlSessionFactory por meio do arquivo de configuração xm ——> Obter SqlSession

1.
A classe sqlSessionFactoryBuilder pode ser instanciada, usada e descartada.Uma vez que a SqlSessionFactory é criada, ela não é mais necessária. Portanto, o melhor escopo da instância SqlSessionFactoryBuilder é o escopo do método (ou seja, variáveis ​​do método local). Você pode reutilizar SqlSessionFactoryBuilder para criar várias instâncias de SqlSessionFactory, mas é melhor não mantê-lo sempre para garantir que todos os recursos de análise XML estejam abertos para coisas mais importantes.

2.
SqlSessionFactory Depois que a SqlSessionFactory é criada, ela sempre deve existir durante a execução do aplicativo. Não há razão para limpá-la ou reconstruí-la. A prática recomendada para usar SqlSessionFactory é não recriá-lo várias vezes durante a execução do aplicativo. Reconstruir o SqlSessionFactory várias vezes é considerado um código "mau cheiro". Portanto, o melhor escopo de SqlSessionFactory é o escopo do aplicativo. Há muitas maneiras de fazer isso, a mais fácil é usar o modo singleton ou o modo singleton estático.

3.
Cada thread de SqlSession deve ter sua própria instância de SqlSession. A instância de SqlSession não é thread-safe, portanto, não pode ser compartilhada; portanto, seu melhor escopo é a solicitação ou o escopo do método. Você não deve colocar a referência da instância SqlSession no campo estático de uma classe, mesmo as variáveis ​​de instância de uma classe. Nunca coloque a referência da instância SqlSession em qualquer tipo de escopo de gerenciamento, como a HttpSession na arquitetura Serlvet. Se você estiver usando uma estrutura da web, considere colocar SqlSession em um escopo semelhante ao objeto de solicitação HTTP. Em outras palavras, sempre que receber uma solicitação HTTP, você pode abrir uma SqlSession, retornar uma resposta e fechá-la. Esta operação de fechamento é muito importante, você deve colocar esta operação de fechamento no bloco finally para garantir que possa executar o fechamento todas as vezes.

2. Realização de demonstração.

数据库 : mysql
1. 学生 表 :
CREATE TABLE student(
idint (11) NOT NULL AUTO_INCREMENT,
namevarchar (10) DEFAULT NULL,
sexvarchar (10) DEFAULT NULL,
PRIMARY KEY ( id)
) ENGINE = InnoDB AUTO_INCREMENT = 10 DEFAULT CHARSET = utf8 |

2. Estrutura do diretório do projeto

3.pom.xml, adicionar pacote de dependência

<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 http://maven.apache.org/maven-v4_0_0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <groupId>com.mybatis</groupId>
    <artifactId>MybatisDemo</artifactId>
    <packaging>war</packaging>
    <version>0.0.1-SNAPSHOT</version>
    <name>MybatisDemo Maven Webapp</name>
    <url>http://maven.apache.org</url>
    <dependencies>
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>3.8.1</version>
            <scope>test</scope>
        </dependency>
        <dependency>
            <groupId>org.mybatis</groupId>
            <artifactId>mybatis</artifactId>
            <version>3.4.1</version>
        </dependency>
        <!-- https://mvnrepository.com/artifact/mysql/mysql-connector-java -->
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>5.1.38</version>
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-jdbc</artifactId>
            <version>3.0.5.RELEASE</version>
        </dependency>
        <dependency>
            <groupId>org.mybatis</groupId>
            <artifactId>mybatis-spring</artifactId>
            <version>1.3.0</version>
        </dependency>
    </dependencies>
    <build>
        <finalName>MybatisDemo</finalName>
        <defaultGoal>compile</defaultGoal>
    </build>
</project>

4. O
arquivo de configuração XML mybatis-config.xml (XML de configuração) contém as configurações básicas para o sistema MyBatis, incluindo a fonte de dados (DataSource) para obter instâncias de conexão de banco de dados e o gerenciador de transações (TransactionManager) que determina o escopo e controle de a transação

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE configuration
  PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
  "http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>

    <environments default="development">
        <environment id="development">
            <transactionManager type="JDBC"/>       
            <dataSource type="POOLED">
                <property name="driver" value="com.mysql.jdbc.Driver"/>
                <property name="url" value="jdbc:mysql://localhost:3306/mybatisDemo?characterEncoding=GBK"/>
                <property name="username" value="root"/>
                <property name="password" value="root"/>
            </dataSource>
        </environment>
    </environments> 

    <mappers>
        <mapper resource="com/entity/StudentMapper.xml"/>
    </mappers>

</configuration>
  1. Tabela de mapeamento de StudentMapper.xml
    5.1 typeAliases
    tipo alias é para definir um nome abreviado para o tipo Java. Ele está relacionado apenas à configuração XML e seu significado é apenas para reduzir a redundância do nome totalmente qualificado da classe

Tal como:

<typeAlias alias="Student" type="com.example.student.Student"/>

5.2 resultMap e resultType não podem ser usados ​​ao mesmo tempo .

resultType: o tipo de resultado. Você pode usar JavaBeans ou POJOs como o objeto de mapeamento.
resultMap: conjunto de resultados. Ele pode resolver a incompatibilidade do nome da coluna, definir o conjunto de resultados que você deseja retornar do SQL e mapear objetos de domínio mais complexos.

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper
  PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
  "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
  <!--namespace对应dao接口路径-->
<mapper namespace="com.example.dao.StudentDao">
<!--id="studentList",在命名空间中唯一的标识符,后面查询结果会使用这个id-->
    <resultMap type="com.example.student.Student" id="studentList">
    <!--column对应数据库中表字段-->
        <id property="id" column="id" javaType="java.lang.Integer"/>
        <result property="name" column="name" javaType="java.lang.String"/>
        <result property="sex" column="sex" javaType="java.lang.String"/>
    </resultMap>
    <!--select insert update delete中的id名对应dao接口的方法名字 -->
    <select id="queryOneStudent" parameterType="int" resultType="com.example.student.Student"><--! 这就是全名(包含包路径),如果设置了别名就可以只用别名 -->
        select * from student where id=#{id}
    </select>
    <insert id="addStudent">
        insert into student (name,sex) values(#{name},#{sex})
    </insert>
    <delete id="deleteOneStudent" parameterType="int">
        delete from student where id=#{id}
    </delete>
    <update id="updateOneStudent" >
        update student set name=#{student.name},student.sex=#{student.sex} where id=#{id}
    </update>
    <!--这个resultMap则是之前定义的id -->
    <select id="queryAllStudent"  resultMap="studentList">
        select * from student
    </select>
</mapper>

6. Classe MybatisUtil, a inicialização da sessionFactory comissionada na classe util para evitar a duplicação de código.

public class MybatisUtil {
    public static SqlSessionFactory initSqlSessionFactory() {
        String resource = "mybatis/mybatis-config.xml";
        InputStream inputStream = null;
        SqlSessionFactoryBuilder sessionFactoryBuilder = null;
        SqlSessionFactory sessionFactory = null;
        try {
            inputStream = Resources.getResourceAsStream(resource);
            sessionFactoryBuilder = new SqlSessionFactoryBuilder();
            sessionFactory = sessionFactoryBuilder.build(inputStream);
        } catch (Exception e) {
            e.printStackTrace();
        }
        return sessionFactory;
    }

    public static SqlSession initSqlSession() {
        SqlSession session = initSqlSessionFactory().openSession();
        return session;
    }

    public static void closeOrCommitSession(SqlSession session,int flag) {
        if (flag == 0) {
            session.close();
        } else {
            session.commit();
            session.close();
        }
    }
}

7.
Aviso StudentDao : Se você não usar a anotação @Param, uma exceção será relatada:
Causa: org.apache.ibatis.binding.BindingException: Parameter'id 'não encontrado. Os parâmetros disponíveis são [0, aluno, param1, param2]

public interface StudentDao {
    public Student queryOneStudent(int id);
    public void addStudent(Student student);
    public void deleteOneStudent(int id);
    public void updateOneStudent(@Param("id") int id, @Param("student") Student student);
    public List<Student> queryAllStudent();
}

8.
Aviso StudentDaoImpl : Lembre-se de fechar a sessão todas as vezes. Além disso, o método commit deve ser usado para operações de inserção, atualização e exclusão. Para legibilidade do código, um método utilitário comum é proposto aqui.

public class StudentDaoImpl implements StudentDao {
    
    
    private static final int ONLY_CLOSE_FLAG = 0;
    private static final int COMMIT_CLOSE_FLAG = 1;
    public Student queryOneStudent(int id) {
        SqlSession session = MybatisUtil.initSqlSession();
        StudentDao studentDao = session.getMapper(StudentDao.class);
        Student student = studentDao.queryOneStudent(id);
        System.out.println("queryOneStudent-->>" + id);
        MybatisUtil.closeOrCommitSession(session, ONLY_CLOSE_FLAG);
        return student;
    }

    public void addStudent(Student student) {
        SqlSession session = MybatisUtil.initSqlSession();
        StudentDao studentDao = session.getMapper(StudentDao.class);
        studentDao.addStudent(student);
        System.out.println("addStudent-->>" + student.getName());
        MybatisUtil.closeOrCommitSession(session, COMMIT_CLOSE_FLAG);
    }

    public void deleteOneStudent(int id) {
        SqlSession session = MybatisUtil.initSqlSession();
        StudentDao studentDao = session.getMapper(StudentDao.class);
        studentDao.deleteOneStudent(id);
        System.out.println("deleteOneStudent-->>" + id);
        MybatisUtil.closeOrCommitSession(session, COMMIT_CLOSE_FLAG);

    }

    public void updateOneStudent(int id, Student student) {
        SqlSession session = MybatisUtil.initSqlSession();
        StudentDao studentDao = session.getMapper(StudentDao.class);
        studentDao.updateOneStudent(id, student);
        System.out.println("updateOneStudent-->>" + id + student.getName());
        MybatisUtil.closeOrCommitSession(session, COMMIT_CLOSE_FLAG);
    }

    public List<Student> queryAllStudent() {
        SqlSession session = MybatisUtil.initSqlSession();
        StudentDao studentDao = session.getMapper(StudentDao.class);
        List<Student> studentList = studentDao.queryAllStudent();
        System.out.println("queryAllStudent-->>" );
        MybatisUtil.closeOrCommitSession(session, ONLY_CLOSE_FLAG);
        return studentList;
    }

}

7. Classe de entidade do aluno

public class Student {
    private int id;
    private String name;
    private String sex;

    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getSex() {
        return sex;
    }

    public void setSex(String sex) {
        this.sex = sex;
    }

    @Override
    public String toString() {
        return "Student [id=" + id + ", name=" + name + ", sex=" + sex + "]";
    }

}

8. A classe Teste também propõe alguns métodos para testar a função.

public class Test {


    public static void main(String[] args) {
        StudentDao studentDao = new StudentDaoImpl();
        //StudentService studentService = new StudentServiceImpl();
        queryAllStudent(studentDao);
        //addStudent(studentDao);
        //deleteOneStudent(studentDao);
        //updateOneStudent(studentDao);
    }

    public static void queryOneStudent(StudentDao studentDao) {
        Student student = studentDao.queryOneStudent(3);
        System.out.println(student.toString());
    }

    public static void addStudent(StudentDao studentDao) {
        Student student = new Student();
        student.setName("huang2");
        student.setSex("female");
        studentDao.addStudent(student);
    }

    public static void deleteOneStudent(StudentDao studentDao) {
        studentDao.deleteOneStudent(4);
    }

    public static void updateOneStudent(StudentDao studentDao) {
        Student student = new Student();
        student.setName("wu1");
        student.setSex("male");
        studentDao.updateOneStudent(5, student);
    }

    public static void queryAllStudent(StudentDao studentDao) {
        List<Student> students = studentDao.queryAllStudent();
        for (Student student : students) {
            System.out.println(student.toString());
        }
    }
}

Esta é apenas uma demonstração introdutória. A configuração ainda é relativamente primitiva e inconveniente de usar. Haverá uma demonstração combinada com a primavera no futuro, que é mais inteligente, mais conveniente e mais eficiente.

Consulte o documento oficial da mybatis: clique aqui

Acho que você gosta

Origin blog.csdn.net/u010857795/article/details/71499616
Recomendado
Clasificación