MyBatis:注解增删改查(狂神)

 

 

 

 

 

但是MyBatis大多不使用注解,而使用配置文件,因为注解不能处理复杂的语句,不能使用resultMap处理表的列名和实体类属性名不一致问题,注解只适合处理简单的语句

 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">
        <property name="username" value="root"/>
        <!--默认优先使用外部的db.properties配置文件中的-->
        <property name="password" value="111"/>
    </properties>


<!--    设置日志-->
    <settings>
        <!-- 标准的日志工厂实现:STDOUT_LOGGING控制台输出0-->
        <setting name="logImpl" value="STDOUT_LOGGING"/>
        <!--log4j日志-->
<!--     <setting name="logImpl" value="LOG4J"/>-->
    </settings>


    
<!--    可以给实体类起别名-->
    <typeAliases>
        <typeAlias type="com.kuang.pojo.User11" alias="User"></typeAlias>
    </typeAliases>

    <environments default="development"><!--default:默认的环境这里可以配置:多个环境-->
        <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>

<!-- 映射器   每一个Mapper.xml文件,都需要在Mybatis核心配置文件中注册-->
   <!-- <mappers>
        <mapper resource="com/kuang/dao/UserMapper.xml"/>
    </mappers>-->


<!--    绑定接口-->
    <mappers>
        <mapper class="com.kuang.dao.UserDao"/>
    </mappers>
</configuration>

db.properties:

driver=com.mysql.jdbc.Driver
url=jdbc:mysql://localhost:3306/mybatis?useSSL=&amp;useUnicode=true&amp;characterEncoding=utf-8
username=root
password=123456

MybatisUtils:

package com.kuang.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;

//sqlSessionFactory --sqlSession
public class MybaitsUtils {
    private static SqlSessionFactory sqlSessionFactory;//提升作用域
    /*
    所谓的代码块就是一段独立的代码空间,那什么是静态代码块呢?说白了,静态代码块就是用static修饰的代码块,关于静态代码块的概念不多说,不过你需要知道它的一个特点,那就是

   随着类的加载而执行,而且只执行一次
     */
    static{
        try {
            //使用MyBaits获取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 命令所需的所有方法。
    public static SqlSession getSqlSession(){
        //获取SqlSession对象
         SqlSession sqlSession=sqlSessionFactory.openSession(true);//true设置事务自动提交,执行增删改,sql不用手动提交
         return sqlSession;
    }
}

User11:使用注解的实体类的属性名话尽量和表的列名一样,否则查询的时候为空

package com.kuang.pojo;

import org.apache.ibatis.type.Alias;

//实体类
@Alias("user") //注解自定义别名的名字
public class User11 {
    private int id;
    private String name;
    private String password;

    public User11() {
    }

    public User11(int id, String name, String password) {
        this.id = id;
        this.name = name;
        this.password = password;
    }

    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 getPassword() {
        return password;
    }

    public void setPassword(String password) {
        this.password = password;
    }

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

 

Userdao:

package com.kuang.dao;

import com.kuang.pojo.User11;
import org.apache.ibatis.annotations.*;

import java.util.List;
import java.util.Map;

public interface UserDao {

    @Select("select * from user11")  //通过注解就不用写UserMapper.xml配置文件了,还需要在主配置文件上绑定接口
    List<User11> getUsers();

    //方法存在多个参数,所有的参数前面必须加上@Param("id")注解 id=#{id} id对应@Param("id")里的id
    @Select("select *from user11 where id=#{id}")
    User11 getUserByID(@Param("id") int id);

    @Insert("insert into user11(id,name,pwd) values(#{id},#{name},#{password})")
    int addUser(User11 user11);

    @Update("update user11 set name=#{name},pwd=#{password} where id=#{id}")
    int updateUser(User11 user11);

    //这里使用了@Param注解里面写的uid sql获取就要用uid
    @Delete("delete from user11 where id=#{uid}")
    int deleteUser(@Param("uid") int id);
}

UserMappperTest:

import com.kuang.dao.UserDao;
import com.kuang.pojo.User11;
import com.kuang.utils.MybaitsUtils;
import org.apache.ibatis.session.SqlSession;
import org.junit.Test;

import java.util.List;

public class UserMapperTest {
    //查询所有
    @Test
    public void test1(){
        SqlSession sqlSession= MybaitsUtils.getSqlSession();
        //底层主要应用反射
        UserDao mapper = sqlSession.getMapper(UserDao.class);

        List<User11> users=mapper.getUsers();
        for (User11 user : users) {
            System.out.println(user);
        }
        sqlSession.close();
    }
    //根据id查询
    @Test
    public void test2(){
        SqlSession sqlSession= MybaitsUtils.getSqlSession();
        //底层主要应用反射
        UserDao mapper = sqlSession.getMapper(UserDao.class);

       User11 user11=mapper.getUserByID(1);
        System.out.println(user11);

        sqlSession.close();
    }
    //添加一条数据
    @Test
    public void test3(){
        SqlSession sqlSession= MybaitsUtils.getSqlSession();
        //底层主要应用反射
        UserDao mapper = sqlSession.getMapper(UserDao.class);

        int res=mapper.addUser(new User11(8,"xiaohong","1232"));
        if (res>0){
            System.out.println("插入成功");
        }
        //因为设置了自动提交事务,这里增删改操作不用提交事务
        sqlSession.close();
    }
    //修改数据
    @Test
    public void test4(){
        SqlSession sqlSession= MybaitsUtils.getSqlSession();
        //底层主要应用反射
        UserDao mapper = sqlSession.getMapper(UserDao.class);

        int res=mapper.updateUser(new User11(8,"TOto","12322"));
        if (res>0){
            System.out.println("更新成功");
        }
        //因为设置了自动提交事务,这里增删改操作不用提交事务
        sqlSession.close();
    }

    //删除数据
    @Test
    public void test5(){
        SqlSession sqlSession= MybaitsUtils.getSqlSession();
        //底层主要应用反射
        UserDao mapper = sqlSession.getMapper(UserDao.class);

        int res=mapper.deleteUser(8);
        if (res>0){
            System.out.println("删除成功");
        }
        //因为设置了自动提交事务,这里增删改操作不用提交事务
        sqlSession.close();
    }
}

1.实体类的的属性名password和表的列不一样,不能再配置文件中使用resultMap结果集映射,导致查询的password为空

2.

 

 

3.

 

 4.

 

5.

 

 

 

#{ }和${ }区别?

 

  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

喵俺第一专栏

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值