MyBatis

一:准备工作:

1.在idea中实现

2.首先先创建一个MyBatisDemoTest项目

3.点击创建之后,在设置中的文件和代码模板之后新建两个文件

3.1mybatis-mapper.xml(注意扩展名是xml)

3.2SqlMapConfig(扩展名也是xml)

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>
    <environments default="mysql">
        <environment id="mysql">
            <!--配置事务的类型,使用本地事务策略-->
            <transactionManager type="JDBC"></transactionManager>
            <!--是否使用连接池 POOLED表示使用链接池,UNPOOLED表示不使用连接池-->
            <dataSource type="POOLED">
                <property name="driver" value="com.mysql.cj.jdbc.Driver"/>
                <property name="url" value="jdbc:mysql://localhost:3306/mybatis_demo?serverTimezone=UTC"/>
                <property name="username" value="root"/>
                <property name="password" value="root"/>
            </dataSource>
        </environment>
    </environments>
    <mappers>
        <mapper resource="mapper/UserDao.xml"></mapper>
    </mappers>
</configuration>

3.3这是SqlMapConfig对应的代码,要将下面的代码都改成自己的对应数据库的内容(property name="driver",这一行要根据自己MySQL的版本来写,我是8版本的)

XML 复制代码
<property name="driver" value="com.mysql.cj.jdbc.Driver"/>
<property name="url" value="jdbc:mysql://localhost:3306/mybatis_demo?serverTimezone=UTC"/>
<property name="username" value="root"/>
<property name="password" value="root"/>

4.在pom.xml中写下面的内容

4.1这是相对应的代码

XML 复制代码
<dependencies>
    <!--mybatis核心包-->
    <dependency>
        <groupId>org.mybatis</groupId>
        <artifactId>mybatis</artifactId>
        <version>3.4.5</version>
    </dependency>
    <!--mysql驱动包-->
    <dependency>
        <groupId>mysql</groupId>
        <artifactId>mysql-connector-java</artifactId>
        <version>8.0.33</version>
    </dependency>
    <!-- 单元测试 -->
    <dependency>
        <groupId>junit</groupId>
        <artifactId>junit</artifactId>
        <version>4.10</version>
    </dependency>
    <!-- 日志 -->
    <dependency>
        <groupId>log4j</groupId>
        <artifactId>log4j</artifactId>
        <version>1.2.17</version>
    </dependency>
</dependencies>

5.mysql要根据自己的版本写,写好之后点击右边的Maven,之后点击刷新按钮,重新加载Maven依赖

这样准备工作就做完了

二:实现阶段:

1.创建型对应的软件包

2.在软件包内创建相对应的内容(dao包中是接口)

3.mapper中要用之前创建的xml去创建

4.在SqlMapConfig里面要写上对应的mapper文件(以防发生意外建议用数据库中的表明去创建文件)

5.entity.User文件的代码就是放数据库中字段和实现方法

java 复制代码
package com.qcby.entity;

import java.util.Date;

/**
 * 对应数据库中的user表
 */
public class User {
    private Integer id;
    private String username;
    private Date birthday;
    private String sex;
    private String address;
    private String password;
    private Integer pageSize;
    private Integer pageStart;

    public User() {
    }

    public User(String username, Date birthday, String sex, String address) {
        this.username = username;
        this.birthday = birthday;
        this.sex = sex;
        this.address = address;
    }

    public Integer getPageSize() {
        return pageSize;
    }

    public void setPageSize(Integer pageSize) {
        this.pageSize = pageSize;
    }

    public Integer getPageStart() {
        return pageStart;
    }

    public void setPageStart(Integer pageStart) {
        this.pageStart = pageStart;
    }

    public Integer getId() {
        return id;
    }

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

    public String getUsername() {
        return username;
    }

    public void setUsername(String username) {
        this.username = username;
    }

    public Date getBirthday() {
        return birthday;
    }

    public void setBirthday(Date birthday) {
        this.birthday = birthday;
    }

    public String getSex() {
        return sex;
    }

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

    public String getAddress() {
        return address;
    }

    public void setAddress(String address) {
        this.address = address;
    }

    public String getPassword() {
        return password;
    }

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

    @Override
    public String toString() {
        return "User{" +
                "id=" + id +
                ", username='" + username + '\'' +
                ", birthday=" + birthday +
                ", sex='" + sex + '\'' +
                ", address='" + address + '\'' +
                ", password='" + password + '\'' +
                '}';
    }
}

6.UserMapper.cml中放对数据库的增删改查语句(这里要写自己对应的dao包中名字)

XML 复制代码
<?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">
<mapper namespace="com.qcby.dao.UserDao">

    <!--id:方法的名称-->
    <!--resultType:数据返回的类型-->
    <select id="findAll" resultType="com.qcby.entity.User">
        select * from user;
    </select>
    
    <delete id="delete" parameterType="java.lang.Integer">
        delete from user where id = #{id}
    </delete>

    <select id="findById" resultType="com.qcby.entity.User" parameterType="java.lang.Integer">
        select * from user where id = #{id}
    </select>

    <select id="findByName" resultType="com.qcby.entity.User" parameterType="java.lang.String">
        select * from user where username = #{username}
    </select>

    <!--多个参数可以直接使用user对象-->
    <select id="findByUser1" resultType="com.qcby.entity.User" parameterType="com.qcby.entity.User">
        select * from user where username = #{username} and password = #{password}
    </select>
    
    <insert id="insert" parameterType="com.qcby.entity.User">
        insert into user (username,sex,address,password) value(#{username},#{sex},#{address},#{password})
    </insert>

    <!--返回主键,我们的主键需要设置自动递增(例如:注册)-->
    <insert id="insertGetId" parameterType="com.qcby.entity.User">
        <selectKey keyProperty="id" resultType="java.lang.Integer" order="AFTER">
            SELECT LAST_INSERT_ID()
        </selectKey>
        insert into user (username,sex,address,password,birthday) values (#{username},#{sex},#{address},#{password},#{birthday})
    </insert>

    <!--分页查询-->
    <select id="findAllUser" resultType="com.qcby.entity.User" parameterType="java.lang.Integer">
        select * from user limit #{param1} offset #{param2}
    </select>
    
    <select id="findAllUserByUserName" parameterType="com.qcby.entity.User" resultType="com.qcby.entity.User">
        select * from user where username = #{username} Limit #{pageSize} offset #{pageStart}
    </select>
    
    <!--模糊查询  '%${value}%'这也写容易引发sql注入-->
    <select id="findUserByUserName" resultType="com.qcby.entity.User" parameterType="java.lang.String">
        select * from user where username like #{value}
    </select>
    
    下面是动态sql,上面是静态sql

    <!--where if-->
    <select id="findUser" resultType="com.qcby.entity.User" parameterType="com.qcby.entity.User">
        select * from user
        <where>
            <if test="username!= null and username !=''">
                username = #{username}
            </if>
            <if test="birthday != null">
                and birthday = #{birthday}
            </if>
            <if test="address != null and address!=''">
                and address = #{address}
            </if>
            <if test="password !=null and password!=''">
                and password = #{password}
            </if>
        </where>
    </select>

    <!--在传统的修改中需要将修改的值和所有不变的值都要写上,否则除了修改的值其他的值都会成null,所以使用下面的方法-->
    <update id="update" parameterType="com.qcby.entity.User">
        update user
        <set>
            <if test="username !=null and username!=''">
                username = #{username},
            </if>
            <if test="birthday !=null">
                birthday = #{birthday},
            </if>
            <if test="address != null and address !=''">
                address = #{address},
            </if>
            <if test="password !=null and password !=''">
                password = #{password},
            </if>
        </set>
        where id = #{id}
    </update>

    <!--当下面得内容满足第一个when时就会执行,不会去运行后面得when和otherwise,同理要是第一个when不满足而第二个满足,则运行第二个也不会运行otherwise,只用当when都不满足才会去运行otherwise-->
    <select id="selectUserByChoose" resultType="com.qcby.entity.User" parameterType="com.qcby.entity.User">
        select * from user
        <where>
            <choose>
                <when test="username!=null and username!=''">
                    username = #{username}
                </when>
                <when test="birthday !=null">
                    and birthday = #{birthday}
                </when>
                <otherwise>
                    and id=#{id}
                </otherwise>
            </choose>
        </where>
    </select>

    <!--trim标签,能够取代where和set  prefixOverrides(前缀取代):覆盖前面的and|or-->
    <select id="selectUserByUsernameAndSex" parameterType="com.qcby.entity.User" resultType="com.qcby.entity.User">
        select * from user
        <trim prefix="where" prefixOverrides="and | or">
            <if test="username !=null and username!=''">
                username = #{username}
            </if>
            <if test="birthday !=null">
                and birthday = #{birthday}
            </if>
            <if test="address != null and address !=''">
                and address = #{address}
            </if>
            <if test="password !=null and password !=''">
                and password = #{password}
            </if>
        </trim>
    </select>

    <!--suffixOverrides:取代后缀-->
    <update id="trimUpdate" parameterType="com.qcby.entity.User">
        update user
        <trim prefix="set" suffixOverrides=",">
            <if test="username != null and username!=''">
                username = #{username},
            </if>
            <if test="birthday !=null">
                birthday = #{birthday},
            </if>
            <if test="address !=null and address!=''">
                address = #{address},
            </if>
            <if test="password !=null and password!=''">
                password = #{password},
            </if>
        </trim>
        where id = #{id}
    </update>

    <!--批量删除的sql语句:delete from 表名 where id in(1,2,3,4,5);-->
    <!--批量删除-->
    <delete id="deleteMoreByArray">
        delete from user where id in
        <foreach collection="ids" item="id" separator="," open="(" close=")">
            #{id}
        </foreach>
    </delete>
    <!--collection:当前要循环的数组或者集合-->
    <!--item:我们指定要循环的数组的每一个元素-->
    <!--separator:每一个元素应该用什么来做分割-->
    <!--open:当前循环是以什么开始-->
    <!--close:当前循环是以什么结束-->

    <!--批量添加-->
    <!--批量添加的sql语句:insert into 表名 (字段) values (值),(值)-->
    <insert id="insertMoreByList">
        insert into user(username,birthday,sex,address) values
        <foreach collection="users" item="user" separator=",">
            (#{user.username},#{user.birthday},#{user.sex},#{user.address})
        </foreach>
    </insert>
</mapper>

7.然后写UserDao接口中的内容

java 复制代码
package com.qcby.dao;

import com.qcby.entity.User;
import org.apache.ibatis.annotations.Param;

import java.util.List;

public interface UserDao {
    List<User> findAll();
    Integer delete(Integer id);
    User findById(Integer id);
    List<User> findByName(String username);
    List<User> findByUser1(User user);
    Integer insert(User user);
    Integer insertGetId(User user);
    List<User> findAllUser(Integer pageSize,Integer pageStart);
    List<User> findAllUserByUserName(User user);
    List<User> findUserByUserName(String username);
    List<User> findUser(User user);
    int update(User user);
    List<User> selectUserByChoose(User user);
    List<User> selectUserByUsernameAndSex(User user);
    int trimUpdate(User user);
    int deleteMoreByArray(@Param("ids") Integer[] ids);
    int insertMoreByList(@Param("users") List<User> users);
}

8.之后在UserTast.java中实现(每一个Test就是对应的一个sql方法,并且能够运行)

java 复制代码
import com.qcby.dao.UserDao;
import com.qcby.entity.User;
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 org.junit.After;
import org.junit.Before;
import org.junit.Test;

import java.io.IOException;
import java.io.InputStream;
import java.util.Arrays;
import java.util.Date;
import java.util.List;
public class UserTest {
    private InputStream in = null;
    private SqlSession session = null;
    private UserDao mapper = null;

    @Before  //前置通知, 在方法执行之前执行
    public void init() throws IOException {
        //加载主配置文件,目的是为了构建SqlSessionFactory对象
        in = Resources.getResourceAsStream("SqlMapConfig.xml");
        //创建SqlSessionFactory对象
        SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(in);
        //通过SqlSessionFactory工厂对象创建SqlSesssion对象
        session = factory.openSession();
        //通过Session创建UserDao接口代理对象
        mapper = session.getMapper(UserDao.class);
    }

    @After  //@After: 后置通知, 在方法执行之后执行 。
    public void destory() throws IOException {
        //释放资源
        session.close();
        in.close();
    }

    @Test
    public void aaa(){
        List<User>  users = mapper.findAll();
        for (User user: users) {
            System.out.println(user.toString());
        }
    }

    @Test
    public void delete(){
        mapper.delete(4);
        session.commit();
    }

    @Test
    public void findById(){
        User user = mapper.findById(1);
        System.out.println(user.toString());
    }

    @Test
    public void findByName(){
        List<User> users = mapper.findByName("熊大");
        for (User user: users) {
            System.out.println(user.toString());
        }
    }

    @Test
    public void findByUser1(){
        User user = new User();
        user.setUsername("熊大");
        user.setPassword("123");
        List<User> byUser1 = mapper.findByUser1(user);
        for(User user1 : byUser1){
            System.out.println(user1.toString());
        }
    }

    @Test
    public void insert(){
        User user = new User();
        user.setSex("女");
        user.setAddress("石家庄");
        user.setUsername("ssss");
        user.setPassword("123");
        mapper.insert(user);
        session.commit();
    }

    @Test
    public void insertGetId(){
        User user = new User();
        user.setSex("女");
        user.setAddress("石家庄");
        user.setUsername("哈哈");
        user.setPassword("123");
        mapper.insertGetId(user);
        session.commit();
    }

    @Test
    public void findAllUser(){
        Integer pageSize = 5;
        Integer pageindex= 1;
        Integer pageStart = pageSize *(pageindex-1);
        List<User> users = mapper.findAllUser(pageSize,pageStart);
        for(User user1 : users){
            System.out.println(user1.toString());
        }
    }

    @Test
    public void findUserByUserName(){
        List<User> users = mapper.findUserByUserName("%熊%");
        for(User user : users){
            System.out.println(user.toString());
        }
    }

    @Test
    public void findUser(){
        User user = new User();
//        user.setUsername("熊大");
        user.setAddress("上海");
        user.setPassword("123");
        List<User> user1 = mapper.findUser(user);
        for(User user2 : user1){
            System.out.println(user2.toString());
        }
    }

    @Test
    public void update(){
        User user = new User();
        user.setUsername("哈哈");
        user.setId(1);
        mapper.update(user);
        session.commit();
    }

    @Test
    public void selectUserByChoose(){
        User user = new User();
        user.setId(1);
//        user.setUsername("哈哈");
        List<User> users = mapper.selectUserByChoose(user);
        for(User user1 : users){
            System.out.println(user1.toString());
        }
    }

    @Test
    public void selectUserByUsernameAndSex(){
        User user = new User();
        user.setUsername("熊大");
        user.setAddress("上海");
        user.setPassword("123");
        List<User> users = mapper.selectUserByUsernameAndSex(user);
        for(User user1 : users){
            System.out.println(user1.toString());
        }
    }

    @Test
    public void trimUpdate(){
        User user = new User();
        user.setUsername("啦啦");
        user.setId(1);
        mapper.trimUpdate(user);
        session.commit();
    }

    @Test
    public void deleteMoreByArray(){
        Integer[] integer = new Integer[]{7,8};
        mapper.deleteMoreByArray(integer);
        session.commit();
    }

    @Test
    public void insertMoreByList(){
        User user1 = new User("小赵",new Date(),"男","保定");
        User user2 = new User("小李",new Date(),"男","保定");
        User user3 = new User("小韩",new Date(),"女","河南");
        List<User> users = Arrays.asList(user1,user2,user3);
        mapper.insertMoreByList(users);
        session.commit();
    }
}
相关推荐
小贾要学习3 分钟前
【C++】stack,queue和priority_queue(优先级队列)
java·c++·rpc
weixin_5150696613 分钟前
线程池详解:原理、使用与优化
java·开发语言
ganjiee000731 分钟前
新电脑配置五 jdk8,maven,idea,vscode
vscode·maven·intellij-idea
武昌库里写JAVA1 小时前
Quartus 开发可实现人工智能加速的 FPGA 系统
java·vue.js·spring boot·课程设计·宠物管理
xujinwei_gingko1 小时前
服务发现Nacos
java·服务发现
心想好事成1 小时前
尚硅谷redis7 47-48 redis事务之理论简介
java·数据库·redis
bloglin999992 小时前
java的vscode扩展插件
java·开发语言·vscode
Magnum Lehar2 小时前
vulkan游戏引擎的pipeline管道实现
java·开发语言·游戏引擎
Magnum Lehar2 小时前
vulkan游戏引擎的vulkan/shaders下的image实现
java·前端·游戏引擎