首页 > 其他分享 >14. MyBatis注解式开发

14. MyBatis注解式开发

时间:2022-10-24 20:34:53浏览次数:38  
标签:14 people age public sqlSession MyBatis 注解 id name

一、什么是MyBatis注解式开发

  MyBatis 中也提供了注解式开发方式,采用注解可以减少 SQL映射文件 的配置。如果使用注解式开发的话,SQL语句 是写在 Java程序 中的,这种方式也会给 SQL语句 的维护带来成本。

  使用注解来映射简单的语句会使代码更加简洁,但对于稍微复杂一点的语句,Java注解 不仅会力不从心,还会让你本就复杂的 SQL语句 更加混乱不堪。因此,如果你需要做一些复杂的操作,最好用 XML 来映射语句。

二、MyBatis环境搭建

2.1、数据的准备

CREATE DATABASE IF NOT EXISTS db_test;
USE db_test;

CREATE TABLE IF NOT EXISTS t_people(
	id INT PRIMARY KEY auto_increment,
	name VARCHAR(30) NOT NULL,
	age INT
);

1.2、导入jar包

  通过 maven 的方式导入 jar包,打包方式设置为 jar 包即可。

<dependency>
    <groupId>org.mybatis</groupId>
    <artifactId>mybatis</artifactId>
    <version>3.5.7</version>
</dependency>

<!-- https://mvnrepository.com/artifact/mysql/mysql-connector-java -->
<dependency>
    <groupId>mysql</groupId>
    <artifactId>mysql-connector-java</artifactId>
    <version>8.0.29</version>
</dependency>

<!-- junit 测试程序 -->
<dependency>
    <groupId>junit</groupId>
    <artifactId>junit</artifactId>
    <version>4.12</version>
    <scope>test</scope>
</dependency>

1.3、创建核心配置文件

  创建 MyBatis 的核心配置文件,习惯上命名为 mybatis-config.xml,这个文件名仅仅只是建议,并非强制要求。配置 MyBatis 的核心配置文件中的标签必须按照固定的顺序:

properties --> settings --> typeAliases --> typeHandlers --> objectFactory --> objectWrapperFactory --> reflectorFactory --> plugins --> environments --> databaseIdProvider --> mappers

<?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>

    <!-- 引入数据库连接信息的配置文件 -->
    <properties resource="jdbc.properties"/>

    <!-- settings标签的内容是MyBatis极为重要的调整设置,它们会改变MyBatis的运行时行为 -->
    <settings>
        <!-- 指定MyBatis所有日志的具体实现,未指定时将自动查找 -->
        <setting name="logImpl" value="STDOUT_LOGGING"/>
        <!-- 开启驼峰命名自动映射 -->
        <setting name="mapUnderscoreToCamelCase" value="true"/>
    </settings>

    <typeAliases>
        <!-- 将这个包下的所有的类全部起别名,别名就是类简名,不区分大小写 -->
        <package name="star.light.pojo"/>
    </typeAliases>

    <!-- environments:配置多个连接数据库环境 -->
    <environments default="development">
        <!-- environment:配置某个具体的环境 -->
        <environment id="development">
            <!-- 设置事务管理方式 -->
            <transactionManager type="JDBC"/>
            <!-- 配置数据源 -->
            <dataSource type="POOLED">
                <!-- 设置连接数据库的驱动 -->
                <property name="driver" value="${jdbc.driver}"/>
                <!-- 设置连接数据库的地址 -->
                <property name="url" value="${jdbc.url}"/>
                <!-- 设置连接数据库的用户名 -->
                <property name="username" value="${jdbc.username}"/>
                <!-- 设置连接数据库的密码 -->
                <property name="password" value="${jdbc.password}"/>
            </dataSource>
        </environment>
    </environments>

    <!--引入映射文件-->
    <mappers>
        <!-- 从Mapper接口所在的包的路径中加载 -->
        <package name="star.light.mapper"/>
    </mappers>
</configuration>

  数据库连接信息的配置文件:jdbc.properties

jdbc.driver=com.mysql.cj.jdbc.Driver
jdbc.url=jdbc:mysql://localhost:3306/db_test
jdbc.username=root
jdbc.password=abc123

1.5、创建mapper接口

  MyBatis 中的 mapper 接口相当于以前的 dao。但是区别在于,mapper 仅仅是接口,我们不需要提供实现类。

package star.light.mapper;

public interface PeopleMapper {
  
}

1.6、创建实体类

package star.light.pojo;

public class People {
    private Integer id;
    private String name;
    private Integer age;

    public People() {
    }

    public People(Integer id, String name, Integer age) {
        this.id = id;
        this.name = name;
        this.age = age;
    }

    public Integer getId() {
        return id;
    }

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

    public String getName() {
        return name;
    }

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

    public Integer getAge() {
        return age;
    }

    public void setAge(Integer age) {
        this.age = age;
    }

    @Override
    public String toString() {
        return "People{" +
                "id=" + id +
                ", name='" + name + '\'' +
                ", age=" + age +
                '}';
    }
}

1.7、封装SqlSessionUtil工具类


import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;

import java.io.IOException;

public class SqlSessionUtil {
    private static SqlSessionFactory sqlSessionFactory;

    // 为了防止new对象,工具类的构造方法一般都是私有的
    // 工具类中所有的方法都是静态的,直接采用类型即可调用,不需要new对象
    private SqlSessionUtil(){}

    // 静态代码块在类加载的时候执行
    // SqlSesionUtil工具类在进行第一次加载的时候,解析MyBatis和核心配置文件,创建SqlSessionFactory对象
    static {
        try {
            sqlSessionFactory = new SqlSessionFactoryBuilder().build(Resources.getResourceAsStream("mybatis-config.xml"));
        } catch (IOException e) {
            e.printStackTrace();
            throw new RuntimeException(e);
        }
    }

    /**
     * 获取会话对象
     * @return 会话对象
     */
    public static SqlSession getSqlSession(){
        return sqlSessionFactory.openSession();
    }
}

三、@Insert注解

在 Mapper 接口中添加如下内容

@Insert("insert into t_people(id,name,age) values(#{id},#{name},#{age})")
int insertPeople(People people);

测试程序

package star.light.test;

import org.apache.ibatis.session.SqlSession;
import org.junit.Test;
import star.light.mapper.PeopleMapper;
import star.light.pojo.People;
import star.light.util.SqlSessionUtil;

public class AnnotationTest {

    @Test
    public void testInsertPeople(){
        SqlSession sqlSession = SqlSessionUtil.getSqlSession();
        PeopleMapper mapper = sqlSession.getMapper(PeopleMapper.class);
        People people = new People(null,"Sakura",10);
        int affectedRowCount = mapper.insertPeople(people);
        System.out.println("affectedRowCount = " + affectedRowCount);
        sqlSession.commit();
        sqlSession.close();
    }
}

四、@Delete注解

在 Mapper 接口中添加如下内容

@Delete("delete from t_people where id = #{id}")
int deletePeopleById(Integer id);

在测试程序中添加如下测试方法

@Test
public void testDeletePeopleById(){
    SqlSession sqlSession = SqlSessionUtil.getSqlSession();
    PeopleMapper mapper = sqlSession.getMapper(PeopleMapper.class);
    int affectedRowCount = mapper.deletePeopleById(1);
    System.out.println("affectedRowCount = " + affectedRowCount);
    sqlSession.commit();
    sqlSession.close();
}

五、@Update注解

在 Mapper 接口中添加如下内容

@Update("update t_people set name = #{name}, age = #{age} where id = #{id}")
int updatePeople(People people);

在测试程序中添加如下测试方法

@Test
public void testUpdatePeople(){
    SqlSession sqlSession = SqlSessionUtil.getSqlSession();
    PeopleMapper mapper = sqlSession.getMapper(PeopleMapper.class);
    People people = new People(1,"Sakura",12);
    int affectedRowCount = mapper.updatePeople(people);
    System.out.println("affectedRowCount = " + affectedRowCount);
    sqlSession.commit();
    sqlSession.close();
}

六、@Select注解

在 Mapper 接口中添加如下内容

@Select("select id, name, age from t_people where id = #{id}")
People selectPeopleById(Integer id);

在测试程序中添加如下测试方法

@Test
public void tesSelectPeopleById(){
    SqlSession sqlSession = SqlSessionUtil.getSqlSession();
    PeopleMapper mapper = sqlSession.getMapper(PeopleMapper.class);
    People people = mapper.selectPeopleById(1);
    System.out.println(people);
    sqlSession.close();
}

  如果数据库中 表的字段名Java实体类的属性名 不对应,且在 MyBatis 的核心配置文件中没有开启驼峰自动映射,可以使用 @Result 注解手动映射。

@Select("select id, name, age from t_people where id = #{id}")
@Results({
        @Result(property = "id", column = "id"),
        @Result(property = "name", column = "name"),
        @Result(property = "age", column = "age")
})
People selectPeopleById(Integer id);

标签:14,people,age,public,sqlSession,MyBatis,注解,id,name
From: https://www.cnblogs.com/nanoha/p/16822687.html

相关文章

  • 「ARC140D」One to One - 题解
    题解若对每一块进行考虑,那么对于一个有\(n\)个点\(n\)条边的块,也就是基环树或环来说,里面一定不会存在\(a_i=-1\)。否则就是一棵树了,那么也最多只会有一个\(a_i=-1\)......
  • MyBatis
    MyBatis什么是MybatisMybatis是一款优秀的持久层框架,用于简化JDBC开发Mybatis本是Apache的一个开源项目iBatis,2010年这个项目由apachesoftwarefoundation迁移到了goog......
  • 力扣 114. 二叉树展开为链表-原地算法(O(1) 额外空间)详解
    114.二叉树展开为链表给你二叉树的根结点 root ,请你将它展开为一个单链表:展开后的单链表应该同样使用 TreeNode ,其中 right 子指针指向链表中下一个结点,而......
  • Mybatis
    ResultMap结果集映射多对一按照查询嵌套处理:需要两个查询,被嵌套的<association>需要column以及select属性按照结果嵌套处理:不需要column以及select属性对于数据......
  • springMvc整合mybatis和mybatis 的dao层
    springMvc整合mybatis1.1pom注入依赖<dependencies><dependency><groupId>org.mybatis</groupId><artifactId>mybatis</artifactId>......
  • @autowired、@autowired(required = false)注解放在方法上的作用
    1、发现DelegatingWebMvcConfiguration源码中方法上有使用@autowired(required=false),今天针对@Autowired在方法上的作用,做下研究。@ConfigurationpublicclassDeleg......
  • luogu P8275 [USACO22OPEN] 262144 Revisited P
    题面传送门这里有个sb写这道题写了一下午。首先来考虑一段子段上的答案,显然答案有一个区间,设最大值为\(E\),则最小值一定在\([E,E+\logn]\)之间。我们考虑按照最大值分......
  • 自定义注解
    1.定义某个方法的注解@Target({ElementType.METHOD})@Retention(RetentionPolicy.RUNTIME)@Documentedpublic@interfaceMethodsListener{}MethodsListener这个名......
  • 实体类上的一些注解及其依赖,方便判断
    1.@NotNull(message="有效期不能为空")<dependency><groupId>javax.validation</groupId><artifactId>validation-api</artifactId></dependency>2.@JsonForma......
  • 剑指Offer-14-剪绳子/力扣-343-整数拆分
    对于一段绳子,第一刀下去可以将绳子分成i和n-i两段,其中i的取值范围为[1,n-1]dp[n]表示n可分成的最大乘积和,dp[n]=max(dp[n],max(i*n-i,i*f(n-i)))初始化:全部初始化为1i......