Mybatis基于接口的动态代理实现CRUD操作及使用函数聚合查询

创建maven工程,pom文件添加坐标

在这里插入图片描述
pom.xml

<dependencies>
        <dependency>
            <groupId>org.mybatis</groupId>
            <artifactId>mybatis</artifactId>
            <version>3.5.3</version>
        </dependency>
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>5.1.6</version>
        </dependency>
        <dependency>
            <groupId>log4j</groupId>
            <artifactId>log4j</artifactId>
            <version>1.2.12</version>
        </dependency>
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>4.12</version>
            <scope>test</scope>
        </dependency>
    </dependencies>

User实体类:

public class User {
    
    
    private Integer id;
    private String username;
    private Date birthday;
    private String sex;
    private String address;
    //此处省略了getXXX(),setXXX(),toString()方法
 }

UserMapper接口:

public interface UserMapper {
    
    
    //在这里面添加CRUD方法
}

SqlMapConfig.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">
<!-- mybatis的主配置文件 -->
<configuration>
    <!--读取jdbc配置文件-->
    <properties resource="jdbc\jdbc.properties"></properties>
    <environments default="mysql">
        <!-- 配置mysql的环境-->
        <environment id="mysql">
            <!-- 配置事务的类型-->
            <transactionManager type="JDBC"></transactionManager>
            <!-- 配置数据源(连接池) -->
            <dataSource type="POOLED">
                <!-- 配置连接数据库的4个基本信息 -->
                <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>
    <!-- 指定映射配置文件的位置,映射配置文件指的是每个dao独立的配置文件 -->
    <mappers>
       <mapper resource="com/zy/dao/UserMapper.xml"/>
    </mappers>
</configuration>

UserMapper.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.zy.dao.UserMapper">
     <!--这里写具体的sql语句-->
</mapper>

jdbc.properties:

jdbc.driver=com.mysql.jdbc.Driver
jdbc.url=jdbc:mysql://localhost:3306/mybatis
jdbc.username=root
jdbc.password=123456

根据id查询用户

UserMapper接口添加方法

    /***
    * @Description 根据id查询用户
    * @Param: [userId]
    * @return: com.zy.domin.User
    * @Date: 2021/2/24
    */
    User findUserById(Integer userId);

UserMapper.xml添加sql语句

    <!--
    根据id查询用户
      resultType属性:指定结果集的类型
      parameterType属性:指定传入参数的类型
    -->
    <select id="findUserById" resultType="com.zy.domin.User" parameterType="java.lang.Integer">
        select * from user where id = #{
    
    userId}
    </select>

测试代码:

public class MybatisTest {
    
    
    private InputStream in;
    private SqlSessionFactoryBuilder builder;
    private SqlSessionFactory factory;
    private SqlSession session;
    private UserMapper userMapper;
    @Before//在test方法执行之前执行
    public void befor() throws Exception {
    
    
        //读取SqlMapConfig.xml配置文件
        in = Resources.getResourceAsStream("SqlMapConfig.xml");
        //创建SqlSessionFactory工厂
        builder = new SqlSessionFactoryBuilder();
        factory = builder.build(in);
        //使用工厂生产SqlSession
        session = factory.openSession();
        //使用SqlSession创建dao接口代理对象
        userMapper = session.getMapper(UserMapper.class);
    }
    @After//在test方法执行之后执行
    public void after() throws Exception{
    
    
        session.commit();
        session.close();
        in.close();
    }
    /*** 
    * @Description 根据id查询用户
    * @Param: []
    * @return: void
    * @Date: 2021/2/24
    */ 
    @Test
    public void testFindUserById(){
    
    
        User user = userMapper.findUserById(2);
        System.out.println(user);
    }

保存用户操作

UserMapper接口添加方法

    /***
    * @Description 保存用户
    * @Param: [user]
    * @return: void
    * @Date: 2021/2/24
    */
    void saveUser(User user);

UserMapper.xml添加sql语句

    <!--保存用户-->
    <insert id="saveUser" parameterType="com.zy.domin.User" useGeneratedKeys="true" keyProperty="id">
        insert into user (username,birthday,sex,address) values(#{
    
    username}, #{
    
    birthday}, #{
    
    sex}, #{
    
    address})
    </insert>

测试代码:

    @Test
    public void testSaveUser(){
    
    
        User user = new User();
        user.setUsername("李四");
        user.setBirthday(new Date());
        user.setSex("男");
        user.setAddress("河南省郑州市");
        System.out.println("保存之前的数据为:" + user);
        userMapper.saveUser(user);
        System.out.println("保存之后的数据为:" + user);
    }

在这里插入图片描述insert语句中用到了这个useGeneratedKeys="true"属性,该属性的默认值false,在lnsert操作后是获取不到自增的id。如果我们需要用到自增的id需要将属性的值设置为true。还有另外一种获取新增数据自增的id,下面代码。

    <!--保存用户-->
    <insert id="saveUser" parameterType="com.zy.domin.User">
        <!--
        order AFTER 表示 SELECT LAST_INSERT_ID() 在insert执行之后执行  
              BEFORE 表示 SELECT LAST_INSERT_ID() 在insert执行之前执行,这样的话就拿不到主键了
        -->
        <selectKey keyProperty="id" resultType="Integer" order="AFTER">
            SELECT LAST_INSERT_ID()
        </selectKey>
        insert into user (username,birthday,sex,address) values(#{
    
    username}, #{
    
    birthday}, #{
    
    sex}, #{
    
    address})
    </insert>

测试上面代码:

    /***
    * @Description 测试保存用户
    * @Param: []
    * @return: void
    * @Date: 2021/2/24
    */
    @Test
    public void testSaveUser(){
    
    
        User user = new User();
        user.setUsername("李四2");
        user.setBirthday(new Date());
        user.setSex("男");
        user.setAddress("河南省郑州市");
        System.out.println("保存之前的数据为:" + user);
        userMapper.saveUser(user);
        System.out.println("保存之后的数据为:" + user);
    }

在这里插入图片描述

更新,删除操作

UserMapper接口添加方法

    /*** 
    * @Description 更新用户
    * @Param: [user]
    * @return: void
    * @Date: 2021/2/24
    */ 
    void updateUser(User user);

    /***
    * @Description 根据id删除用户
    * @Param: [userId]
    * @return: java.lang.Integer
    * @Date: 2021/2/24
    */
    Integer deleteUserById(Integer userId);

UserMapper.xml添加sql语句

    <!--更新用户-->
    <update id="updateUser" parameterType="com.zy.domin.User">
        update user set username=#{
    
    username},birthday=#{
    
    birthday},sex=#{
    
    sex},address=#{
    
    address} where id=#{
    
    id}
    </update>
    <!--删除用户信息-->
    <delete id="deleteUserById" parameterType="java.lang.Integer">
        delete from user where id = #{
    
    id}
    </delete>

测试代码

    @Test
    public void testUpdateUser(){
    
    
        //查询出我们要更新的数据
        User user = userMapper.findUserById(1);
        //设置值
        user.setSex("女");
        //执行更新
        userMapper.updateUser(user);
        System.out.println(user);
    }

    /***
    * @Description 删除用户
    * @Param: []
    * @return: void
    * @Date: 2021/2/24
    */
    @Test
    public void testDeleteUserById(){
    
    
        Integer i = userMapper.deleteUserById(12);
        System.out.println(i);
    }

模糊查询

UserMapper接口添加方法

    /***
    * @Description 根据用户名模糊查询
    * @Param: [name]
    * @return: java.util.List<com.zy.domin.User>
    * @Date: 2021/2/24
    */
    List<User> findUserByName(String name);

UserMapper.xml添加sql语句

    <!--模糊查询-->
    <select id="findUserByName" parameterType="java.lang.String" resultType="com.zy.domin.User">
        SELECT * FROM user WHERE username LIKE #{
    
    name};
    </select>

测试代码

    /*** 
    * @Description 根据名字模糊查询
    * @Param: []
    * @return: void
    * @Date: 2021/2/24
    */ 
    @Test
    public void testFindUserByName(){
    
    
        List<User> users = userMapper.findUserByName("%张%");
        for (User user : users){
    
    
            System.out.println(user);
        }
    }

在这里插入图片描述模糊查询的另一种写法:
修改UserMapper.xml中的sql语句

    <!--模糊查询-->
    <select id="findUserByName" parameterType="java.lang.String" resultType="com.zy.domin.User">
         <!-这种${
    
    value}是固定写法,必须是value,因为源码中指定了读取的 key 的名字就是”value”,所以我们在绑定参数时就只能叫value了-->
         select * from user where username like '%${value}%'
    </select>

修改测试代码

    @Test
    public void testFindUserByName(){
    
    
        List<User> users = userMapper.findUserByName("张");
        for (User user : users){
    
    
            System.out.println(user);
        }
    }

在这里插入图片描述

查询数据总记录数

UserMapper接口添加方法

    /*** 
    * @Description 查询总记录数
    * @Param: []
    * @return: java.lang.Integer
    * @Date: 2021/2/24
    */ 
    Integer findTotal();

UserMapper.xml添加sql语句

    <!--查询总记录数-->
    <select id="findTotal" resultType="java.lang.Integer">
        select count(*) from user;
    </select>

测试代码

    /*** 
    * @Description 查询总记录数
    * @Param: []
    * @return: void
    * @Date: 2021/2/24
    */ 
    @Test
    public void testFindTotal(){
    
    
        Integer total = userMapper.findTotal();
        System.out.println("查询的总记录数为:" + total);
    }

在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/qq_42494654/article/details/114035970