初学Mybatis之使用注解开发

面向接口编程:解耦

接口是定义与实现的分离

接口有两类:

第一类是对一个个体的抽象,对应为一个抽象体(abstract class)

第二类是对一个个体某一方面的抽象,即形成一个抽象面(interface)

一个个体有多个抽象面

注解本质是反射机制实现

底层原理是动态代理

使用注解开发,不需要 mapper.xml

准备工作:

mysql 建 user 表(id、name、pwd)

pom.xml 导入依赖(mysql、mybatis、junit)

db.properties:

driver=com.mysql.cj.jdbc.Driver
url=jdbc:mysql://localhost:3306/mybatis?useSSL=false&useUnicode=true&characterEncoding=UTF-8
username=root
password=root

mybatis-config.xml:

<?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核心配置文件 -->
<configuration>

    <!-- 引入外部配置文件 -->
    <properties resource="db.properties"/>

    <settings>
        <!-- 日志工厂实现 -->
        <setting name="logImpl" value="STDOUT_LOGGING"/>
    </settings>

    <!-- 扫描实体类的包 -->
    <typeAliases>
        <package name="com.demo.pojo"/>
    </typeAliases>

    <environments default="development">
        <environment id="development">
            <transactionManager type="JDBC"/>
            <dataSource type="POOLED">
                <property name="driver" value="${driver}"/>
                <property name="url" value="${url}"/>
                <property name="username" value="${username}"/>
                <property name="password" value="${password}"/>
            </dataSource>
        </environment>
    </environments>

    <!-- 绑定接口 -->
    <mappers>
        <mapper class="com.demo.dao.UserMapper"/>
    </mappers>

</configuration>

二者均放在 resources 目录下

MybatisUtils 工具类:

package com.demo.utils;

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;
import java.io.InputStream;

public class MybatisUtils {

    private static SqlSessionFactory sqlSessionFactory;

    static {
        try {
            //获取sqlSessionFactory对象
            String resource = "mybatis-config.xml";
            InputStream inputStream = Resources.getResourceAsStream(resource);
            sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

        /*
        有了SqlSessionFactory,就可以获得SqlSession的实例
        SqlSession提供了在数据库执行SQL命令所需的所有方法
        可以通过SqlSession实例来执行已映射的SQL语句
         */
        public static SqlSession getSqlSession(){
            return sqlSessionFactory.openSession();
        }
}

User 实体类:

package com.demo.pojo;
//实体类
public class User {
    private int id;
    private String name;
    private String pwd;

    //无参构造
    public User() {
    }

    //有参构造
    public User(int id, String name, String pwd) {
        this.id = id;
        this.name = name;
        this.pwd = pwd;
    }

    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 getPwd() {
        return pwd;
    }

    public void setPwd(String pwd) {
        this.pwd = pwd;
    }

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

UserMapper 接口:使用注解

@Select("select * from user") 

package com.demo.dao;

import com.demo.pojo.User;
import org.apache.ibatis.annotations.Select;

import java.util.List;

public interface UserMapper {
    @Select("select * from user")
    List<User> getUsers();
}

使用了注解就需要在 mybatis-config.xml 中绑定接口

    <!-- 绑定接口 -->
    <mappers>
        <mapper class="com.demo.dao.UserMapper"/>
    </mappers>

测试类:

package com.demo.dao;

import com.demo.pojo.User;
import com.demo.utils.MybatisUtils;
import org.apache.ibatis.session.SqlSession;
import org.junit.Test;

public class UserMapperTest {
    @Test
    public void getUsers(){
        SqlSession sqlSession = MybatisUtils.getSqlSession();
        UserMapper mapper = sqlSession.getMapper(UserMapper.class);

        for (User user : mapper.getUsers()) {
            System.out.println(user);
        }

        sqlSession.close();

    }
}

运行结果如下:

Mybatis 的执行流程:

1. Resources 获取加载全局配置文件

2. 实例化 SqlSessionFactoryBuilder

3. 解析配置文件流 XMLConfigBuilder(源码)

4. 所有的配置信息在 Configuration(源码)

5. SqlSessionFactory 实例化

6. transactional 事务管理器(debug)

7. 创建 executor 执行器(debug)

8. 创建 sqlSession

9. 实现 CRUD 增删改查(回滚到 transactional 事务管理器)

10. 查看是否执行成功(true 则提交事务,false 则回滚到 transactional 事务管理器)

11. 关闭

注解增删改查:

MybatisUtils 工具类:

为 true 自动提交,无需 commit

        public static SqlSession getSqlSession(){
            return sqlSessionFactory.openSession(true);
        }

UserMapper 接口:

@Select(),查询

@Insert(),插入

@Update(),修改

@Delete(),删除

@Param(" ") 里的属性名与 sql 语句 #{ } 一致

package com.demo.dao;

import com.demo.pojo.User;
import org.apache.ibatis.annotations.*;

import java.util.List;

public interface UserMapper {
    //select查询
    @Select("select * from user")
    List<User> getUsers();

    //方法存在多个参数,所有的参数前面必须加 @Param()注解
    @Select("select * from user where id = #{uid} and name = #{name}")
    User getUserById(@Param("uid") int id,@Param("name") String name);

    //insert插入数据
    @Insert("insert into user(id,name,pwd) values (#{id},#{name},#{pwd})")
    int addUser(User user);

    //update修改数据
    @Update("update user set name = #{name},pwd = #{pwd} where id = #{id}")
    int updateUser(User user);

    //delete删除数据
    @Delete("delete from user where id = #{id}")
    int deleteUser(@Param("id") int id);
}

测试类:

package com.demo.dao;

import com.demo.pojo.User;
import com.demo.utils.MybatisUtils;
import org.apache.ibatis.session.SqlSession;
import org.junit.Test;

public class UserMapperTest {

    //select查询,遍历数组
    @Test
    public void getUsers(){
        SqlSession sqlSession = MybatisUtils.getSqlSession();
        UserMapper mapper = sqlSession.getMapper(UserMapper.class);

        for (User user : mapper.getUsers()) {
            System.out.println(user);
        }

        sqlSession.close();
    }

    //根据ID查询
    @Test
    public void getUserById(){
        SqlSession sqlSession = MybatisUtils.getSqlSession();
        UserMapper mapper = sqlSession.getMapper(UserMapper.class);

        User id = mapper.getUserById(1, "张三1");
        System.out.println(id);

        sqlSession.close();
    }

    //insert插入数据
    @Test
    public void addUser(){
        SqlSession sqlSession = MybatisUtils.getSqlSession();
        UserMapper mapper = sqlSession.getMapper(UserMapper.class);

        mapper.addUser(new User(4, "张三4", "123"));

        sqlSession.close();
    }

    //update修改数据
    @Test
    public void updateUser(){
        SqlSession sqlSession = MybatisUtils.getSqlSession();
        UserMapper mapper = sqlSession.getMapper(UserMapper.class);

        mapper.updateUser(new User(3,"张三3","123"));

        sqlSession.close();
    }

    //delete删除数据
    @Test
    public void deleteUser(){
        SqlSession sqlSession = MybatisUtils.getSqlSession();
        UserMapper mapper = sqlSession.getMapper(UserMapper.class);

        mapper.deleteUser(4);

        sqlSession.close();
    }

}

总结:

查询注解:

    //方法存在多个参数,所有的参数前面必须加 @Param()注解
    @Select("select * from user where id = #{id} and name = #{name}")
    User getUserById(@Param("id") int id,@Param("name") String name);

插入注解:

    //insert插入数据
    @Insert("insert into user(id,name,pwd) values (#{id},#{name},#{pwd})")
    int addUser(User user);

修改注解:

    //update修改数据
    @Update("update user set name = #{name},pwd = #{pwd} where id = #{id}")
    int updateUser(User user);

删除注解:

    //delete删除数据
    @Delete("delete from user where id = #{id}")
    int deleteUser(@Param("id") int id);

注意:必须将接口注册绑定到核心配置文件中 

关于 @Param() 注解:

1.基本类型的参数或 String 类型需要加上

2.引用类型不需要加

3.如果只有一个基本类型可以不加

4.在 SQL 中引用的就是 @Param() 中设定的属性名

其实还有种写法 ${ },但会导致 sql 注入,对方可以通过拼接的方式修改你的 sql 语句,非常危险

  • 4
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值