Mybatis-增删改查&模糊查询&分页&注解(普通类型参数、引用类型参数、Map类型参数)

代码地址icon-default.png?t=LA92https://www.lanzouw.com/ihOmnwdtbrc

请先看项目目录结构,然后再写代码。target是编译后的输出目录,只需要保证src目录目录一致就行。

1、创建数据库mybatis和表User,并插入数据

DROP DATABASE IF EXISTS mybatis;
CREATE DATABASE mybatis;
USE mybatis;
CREATE TABLE User(
	id int(11) NOT NULL AUTO_INCREMENT,
	name VARCHAR(32) NOT NULL,
	age int(3),
	PRIMARY KEY (id)

)ENGINE=INNODB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8;
USE mybatis;
INSERT INTO User(name, age) 
VALUES
("张三", 12),
("李四", 14),
("王华", 10),
("lucy", 20),
("mary", 22);

2、创建maven工程,创建实体类User

  • 导入lombok、mysql驱动、mybatis、junit四个jar包。使用lombok注解可以帮我们自动实现setter和getter、toString功能,让代码看起来更简洁,更容易修改。
<!-- https://mvnrepository.com/artifact/mysql/mysql-connector-java -->
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>8.0.25</version>
        </dependency>
        <dependency>
            <groupId>org.mybatis</groupId>
            <artifactId>mybatis</artifactId>
            <version>3.5.6</version>
        </dependency>

        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <version>1.18.20</version>
        </dependency>

        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>4.12</version>
            <scope>compile</scope>
        </dependency>
  • 创建实体类User,其中注解@Data会帮我们自动生成类的setter、getter、toString方法
package com.changqing.pojo;

import lombok.Data;

//实体类,对应数据表User
@Data
public class User {
    private int id;
    private String name;
    private int age;

    public User(){

    }
    public User(int id, String name, int age) {
        this.id = id;
        this.name = name;
        this.age = age;
    }

    public User(String name, int age){
        this.name=name;
        this.age=age;
    }


}

3、定义UserDao接口和UserMapper.xml映射文件

  • 定义UserDao接口,定义我们所需要的数据库操作方法,增删改查等等
package com.changqing.dao;


import com.changqing.pojo.Student;
import com.changqing.pojo.User;

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

public interface UserDao {
    //获取所有数据
    public List<User> getUserList();

    //根据id查询数据
    public Map<String, String> selectById(int id);

    //增加数据
    public void addUser(User user);

    //通过map来增加数据
    public void addUser2(Map<String, Object>map);

    //通过map来修改数据
    public void updateUser(Map<String, Object>map);

    //删除数据
    public void deleteUser(int id);

    //批量删除数据>id
    public void deleteBatch(int id);

    //模糊查询
    public List<User> selectNameLike(String value);

      //分页查询
    public List<User> getLimitUser(Map<String, Object> map);

    
   //使用注解不使用参数来获取Users, 不需要在xml写sql语句,但是适用范围很小
    @Select("select * from user")
    public List<User> getUsers();

    
      //测试注解,使用参数, 多个参数必须加上@Param, 仅有一个参数,可以加@Param也可以不加,但是规范写法都应该加上
    @Select("select * from user where id=#{id} and name=#{name}")
    User getUser(@Param("id") int id,  @Param("name") String name);
  
}
  • 定义UserMapper.xml映射文件。这个文件的作用相当于UserDao接口的实现类作用。在JDBC中,我们需要定义接口然后实现接口,这里的UserMapper.xml文件相当于JDBC中的实现类。其中namespace对应UserDao的全限定名,即com.changqing.dao.UserDao。id对应UserDao中的方法名,ParameterType是方法参数类型,resultType对应返回的类型,这里就是User对象。
<?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">

<!--这里的namesapce的值位UserDao,即将这个UserMapper配置文件绑定到UserDao接口上,相当于这个xml文件实现UserDao接口, 其中的id对应UserDao中的方法名-->
<mapper namespace="com.changqing.dao.UserDao">
    <select id="getUserList" resultType="com.changqing.pojo.User">
        select * from User
    </select>

    <select id="selectById" parameterType="int" resultType="hashmap">
        select * from User where id=#{id}
    </select>

    <insert id="addUser" parameterType="com.changqing.pojo.User">
        insert into User(name, age) values(#{name}, #{age})
    </insert>

    <insert id="addUser2" parameterType="map">
        insert into User(id, name, age) values (#{userid}, #{username}, #{userage})
    </insert>

    <update id="updateUser" parameterType="map">
        update User set name=#{username}, age=#{userage} where id=#{userid}
    </update>

    <delete id="deleteUser" parameterType="int">
        delete from User where id=#{id}
    </delete>

    <delete id="deleteBatch" parameterType="int">
        delete  from User where id>#{id}
    </delete>

    <!--因为在myatis中建立别名 typeAliases,所以可以直接使用类名-->
    <select id="selectNameLike" parameterType="String" resultType="User">
           select * from   User  where name like concat('%',#{0},'%')
    </select>

    <!--    分页查询-->
    <select id="getLimitUser" parameterType="map" resultType="com.changqing.pojo.User">
        select * from User limit #{startIndex}, #{pageSize}
    </select>



</mapper>

4、定义Mybatis-config.xml主配置文件

  • 这里的<properties reouse="jdbc.properties">是导入外部的数据源的xml,目的是将数据源信息和主配置文件解耦。Mybatis-config.xml使用<property name="***" value="***">来引入具体的配置参数。好处是如果以后需要修改数据源信息,只用在jdbc.propertis文件中修改,不需要修改Mybatis-config.xml文件。
  • <typeAliases>可以使用别名,会自动导入所有com.changqing.pojo包下的所有类,并直接使用类名作为别名,这样的好处使得UserMapper文件的resultType值可以直接使用非全限定名,不需要使用全限定名 。
  • <mappers>标签用于将UserMapper.xml注册到Mybatis中,后续的代码才能使用UserDao接口。
<?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>
    <!--引用jdbc.properties文件,可以在下面直接应用jdbc.properties的值-->
    <properties resource="jdbc.properties"/>
    <typeAliases>
        <package name="com.changqing.pojo"/>
    </typeAliases>
    <environments default="development">
        <environment id="development">
            <transactionManager type="JDBC"/>
            <dataSource type="POOLED">

<!--                不使用jdbc.properties配置文件,直接在mybatis配置文件里填入参数-->
                <property name="driver" value="com.mysql.cj.jdbc.Driver"/>
                <property name="url" value="jdbc:mysql://localhost:3306/mybatis?userSSL=true&amp;useUnicode=true&amp;characterEncoding=UTF-8&amp;serverTimezone=UTC"/>
                <property name="username" value="root"/>
                <property name="password" value="199604"/>

<!--                使用jdbc.properties配置文件-->
<!--                <property name="driver" value="${driver}"/>-->
<!--                <property name="url" value="${url}"/>-->
<!--                <property name="username" value="${username}"/>-->
<!--                <property name="password" value="${password}"/>-->
            </dataSource>
        </environment>
    </environments>

    <mappers>
        <!--将UserMapper注册到mybatis中,-->
        <mapper resource="mapper/UserMapper.xml"/>
    </mappers>
</configuration>

(可选)5、编写jdbc的配置文件jdbc.properties

这样的好处是将jdbc和mybatis配置文件解耦,修改jdbc连接信息只需要修改jdbc.properties文件即可。如果使用这个文件,请将上面的被注释的<property>取消注释。

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

6、创建工具类MybatisUtils来返回SqlSession

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

public class MybatisUtils {
    private static SqlSessionFactory sqlSessionFactory;

    static {
        try{
            String resource = "mybatis-config.xml";
            InputStream inputStream = Resources.getResourceAsStream(resource);
            sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
        }catch (Exception e){
            e.printStackTrace();
        }
    }

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

7、编写测试类进行测试

package test;

import com.changqing.dao.UserDao;
import com.changqing.pojo.Student;
import com.changqing.pojo.User;

import com.changqing.utils.MybatisUtils;
import org.apache.ibatis.session.SqlSession;
import org.junit.AfterClass;
import org.junit.Test;


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

public class TestUser {

    private static final SqlSession sqlSession = MybatisUtils.getSqlSession();
    private static final UserDao userDao = sqlSession.getMapper(UserDao.class);

    //查找全部数据
    @Test
    public void testUser(){

        List<User> userList = userDao.getUserList();
        for(User user: userList){
            System.out.println(user);
        }

    }

    //按id查找
    @Test
    public void test2(){
        Map<String, String> user = userDao.selectById(1);
        System.out.println(user);

    }

    //添加数据,使用对象来传入参数
    @Test
    public void addUser(){
        User user = new User("张明",23);
        userDao.addUser(user);
        sqlSession.commit();

    }

    //添加数据,使用map传入多个参数
    @Test
    public void addUser2(){
        Map<String, Object> map = new HashMap<>();
        map.put("userid", 12);
        map.put("username", "李明");
        map.put("userage", 25);
        userDao.addUser2(map);

        sqlSession.commit();

    }

    //更新数据
    @Test
    public void updateUser(){
        Map<String, Object> map = new HashMap<>();
        map.put("userid", 7);
        map.put("username", "nancy");
        map.put("userage", 34);
        userDao.updateUser(map);
        sqlSession.commit();

    }

    //删除指定id的数据
    @Test
    public void deleteUser(){
        userDao.deleteUser(18);
        sqlSession.commit();
    }

    @Test
    //批量删除数据,删除>id的数据
    public void deleteBatch(){
        userDao.deleteBatch(5);
        sqlSession.commit();
    }

    //根据姓名进行模糊查询
    @Test
    public void selectNameLike(){
        List<User> userList = userDao.selectNameLike("张");
        for(User user: userList){
            System.out.println(user);
        }

    }

      //测试分页查询
    @Test
    public void getLimitUser(){
        Map<String, Object> map = new HashMap<>();
        map.put("startIndex", 2); ///索引是从0开始计算的, 会从索引为startIndex的数据开始返回,返回pageSize个数据, 即会从第startIndex+1数开始返回
        map.put("pageSize", 2);
        List<User> userList = userMapper.getLimitUser(map);
        for(User user: userList){
            System.out.println(user);
        }
    }


    //测试mybatis注解功能,只能实现简单功能,而且必须保证数据库的列名和实体类User的属性名一致才可以用,局限性比较大
    @Test
    public void testAnnotation(){
        List<User> userList = userMapper.getUsers();
        for(User user: userList){
            System.out.println(user);
        }
    }

     //测试注解,使用参数
    @Test
    public void testAnnotationWithArgs(){
        User user = userMapper.getUser(1, "张三");
        System.out.println(user);
    }

 

    //在上面每个方法执行后,都会默认执行这个方法来关闭sqlSession
    @AfterClass
    public static void closeSql(){
        //查询
        System.out.println(".......................................");
        List<User> userList = userDao.getUserList();
        for(User user: userList){
            System.out.println(user);
        }
        sqlSession.close();
    }
}

Guess you like

Origin blog.csdn.net/stay_zezo/article/details/121189808