Mybatis-02-基础操作(增删改查、模糊查询、单行查询、总数查询)

一共三步完成基础操作

第一步 在IUserDao中增加方法

注意事项:方法要求的参数类型,在删除这一方法中是根据ID删除,数据类型为int/Integer都可以

/**
 * 〈一句话功能简述〉<br>
 * 〈用户的持久层接口〉
 *
 * @author Lucius
 * @create 2020/2/8
 * @since 1.0.0
 */


package com.lucius.dao;

import com.lucius.domain.User;

import java.util.List;

public interface IUserDao {
    /**
     * 提供一个方法,返回值是User,查询所有操作
     */
    List<User>findAll();

    /**
     * 保存用户
     * */

    void saveUser(User user);
    /**
     * 更新用户
     * */
    void updateUser(User user);
    /**
     * 根据Id删除用户
     * */
    void deleteUser(Integer userId);
    /**
     * 根据Id查询用户
     *返回值是一个User类型,在xml中自然也要配置resultType
     * @return*/
    User findById(Integer userId);
    /**
     * 模糊查询用户
     *返回值是一个User类型的列表,在xml中自然也要配置resultType
     * @return*/
    List<User> findByName(String username);
    /**
     * 查询总用户数
     * @return*/
    int findTotal();
}

}

第二步 配置IUserDao.xml文件

注意事项:在删除操作中

delete from user where id=#{Id}

此处的Id参数名称可以随意设置,因为对应的方法就一个参数值

<?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.lucius.dao.IUserDao">
    <!--映射配置文件的mapper标签namespace属性的取值必须是dao接口的全限定类名-->
    <!--配置查询所有-->
    <!--此处的名称不能随便写,要写之前的方法名称
    映射配置文件的操作配置(select),id属性的取值必须是dao接口的方法名-->
    <select id="findAll" resultType="com.lucius.domain.User">
        select * from user
    </select>

    <!--保存用户-->
    <insert id="saveUser" parameterType="com.lucius.domain.User">
        insert into user (username,address,sex,birthday)values(#{username},#{address},#{sex},#{birthday});
    </insert>

    <!--更新用户-->
    <update id="updateUser" parameterType="com.lucius.domain.User">
        update user set username=#{username},address=#{address},sex=#{sex},birthday=#{birthday}where id=#{id}
    </update>

    <!--删除用户-->
    <delete id="deleteUser" parameterType="Integer">
        delete from user where id=#{Id}
    </delete>

    <!--查询一个用户-->
    <select id="findById" parameterType="Integer" resultType="com.lucius.domain.User">
        select * from user where id=#{Id}
    </select>

    <!--模糊查询用户-->
    <select id="findByName" parameterType="String" resultType="com.lucius.domain.User">
        select * from user where username like #{name}
    </select>

    <!--查询总用户数-->
    <select id="findTotal" resultType="Integer">
        /*select count(Id) from user;*/
        select count(Id) from user;
    </select>

</mapper>

第三步

写测试方法,为了避免重复,增加了初始化注解。

/**
 * Copyright (C), Lucius
 * FileName: MybatisTest
 * Author:
 * Date:     2020/2/8 13:55
 * Description: Mybatis的入门案例
 * History:
 * <author>          <time>          <version>          <desc>
 * 作者姓名           修改时间           版本号              描述
 */
package com.lucius.test;

import com.lucius.dao.IUserDao;
import com.lucius.domain.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.InputStream;
import java.util.Date;
import java.util.List;

public class MybatisTest {

    private InputStream in;
    private SqlSession sqlSession;
    private IUserDao userDao;

    @Before//用于在测试方法之前执行
    public void init() throws Exception {
        //1.读取配置文件
        in = Resources.getResourceAsStream("SqlMapConfig.xml");
        //2.创建SqlSessionFactory工厂
        SqlSessionFactoryBuilder builder = new SqlSessionFactoryBuilder();
        SqlSessionFactory factory = builder.build(in);
        //3.使用工厂生产一个SqlSession对象
        sqlSession = factory.openSession();
        //4.使用SqlSession创建Dao接口的代理对象(动态代理)
        userDao = sqlSession.getMapper(IUserDao.class);
    }

    @After//用于在测试方法之后执行
    public void destory() throws Exception {
        //提交事务
        sqlSession.commit();
        //6.释放资源
        sqlSession.close();
        in.close();
    }

    /**
     * 测试查询所有操作
     */
    @Test
    public void testFindAll() {
        //5.使用代理对象执行方法
        List<User> users = userDao.findAll();
        for (User user : users) {
            System.out.println(user);
        }
    }

    /**
     * 测试保存操作
     */

    @Test
    public void testSave() {
        User user = new User();
        user.setUsername("mybatisTest");
        user.setAddress("武汉市");
        user.setSex("男");
        user.setBirthday(new Date());
        //5.执行保存方法
        userDao.saveUser(user);

    }
    /**
     * 测试更新操作
     */

    @Test
    public void testUpdate() {
        User user = new User();
        user.setId(49);
        user.setUsername("mybatisTest");
        user.setAddress("武汉市");
        user.setSex("女");
        user.setBirthday(new Date());
        //5.执行保存方法
        userDao.updateUser(user);
    }
    /**
     * 测试删除操作
     */
    @Test
    public void testDelete() {
        //5.执行删除方法
        userDao.deleteUser(49);
    }
    /**
     * 测试查询一个用户操作
     */
    @Test
    public void testFindOne() {
        //5.执行查询一个用户方法
        User user=userDao.findById(48);
        System.out.println(user);
    }
    /**
     * 测试模糊查询用户操作
     */
    @Test
    public void testFindByName() {
        //5.模糊查询用户方法
        //注意格式需要加入百分号
        List<User> users=userDao.findByName("%王%");
        for(User user:users){
            System.out.println(user);
        }
    }
    /**
     * 测试查询总记录条数操作
     */
    @Test
    public void testFindTotal() {
        //5.查询用户总记录方法
        int count=userDao.findTotal();
        System.out.println(count);
    }
}


properties标签使用方法

为了使用properties标签,我们需要田间一个properties的配置文件取名jdbcConfig.properties,在其中我们设置了链接数据库的相关信息

jdbc.driver=com.mysql.jdbc.Driver
jdbc.url=jdbc:mysql://localhost:3306/mybatis?&amp;useSSL=true
jdbc.username=****
jdbc.password=****

然后在主配置文件中做出以下修改

改变1:
添加了properties属性,在其中resource参数指定了配置文件的地址(在此处还可以用url方式,但是麻烦不常用)
改变2:
注意要使用配置文件中相同的名称,并用${ }

            <dataSource type="POOLED">
                <!--  配置链接数据库的四个基本信息-->
                <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>
<?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>
    <!--  配置properties
    可以在标签内部配置链接数据库的信息。也可以通过属性引用外部配置文件信息
    resource属性:常用的
            用于指定配置文件的位置,是按照类路径的写法来写,并且必须存在于类路径下
    urls属性:
    是按照url的写法来写地址
    URL:Uniform Resource Locator 统一资源定位符。它是可以唯一标识一个资源的位置

    -->
    <properties resource="jdbcConfig.properties">

    </properties>

    <!--  环境配置-->
    <environments default="mysql">
        <!--  环境mysql配置-->
        <environment id="mysql">
            <!--  配置事务类型-->
            <transactionManager type="JDBC"></transactionManager>
            <!--  配置数据源(连接池)-->
            <dataSource type="POOLED">
                <!--  配置链接数据库的四个基本信息-->
                <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/lucius/dao/IUserDao.xml"/>
    </mappers>
</configuration>

package标签的使用方法

目的是为了解决类和接口大小写的问题,可以使用别名提高效率

实体类

在主配置文件中添加以下代码

    <!--  使用typeAliases配置别名,他只能配置domain中类的别名-->
    <typeAliases>
        <!--  使用typeAliases配置别名,type用于指定实体类的全限定类名,alias用于指定别名,指定后就不在区分大小写-->
        <!--  但是过多的时候就很麻烦,所以用package-->
        <!--<typeAlias type="com.lucius.domain.User" alias="user"></typeAlias>-->
        <!--用于指定要配置别名的包,当指定之后,该包下的实体类都会注册别名,并且类名就是别名,不再区分大小写-->
        <package name="com.lucius.domain"></package>
    </typeAliases>

此后我们在IUserDao.xml文件中使用该实体类名就能够直接使用user,无需再写全称,例如此处的resultType

    <!--模糊查询用户-->
    <select id="findByName" parameterType="String" resultType="user">
        select * from user whuere username like #{name}
    </select>

接口

既然实体类能够别名,那么接口也可以做到

    <mappers>
        <!--<mapper resource="com/lucius/dao/IUserDao.xml"/>-->
        <!--此处的package标签是用于指定dao接口所在的包,指定之后就不需要再写mapper以及resource或者class-->
        <package name="com.lucius.dao"></package>
    </mappers>

当数据库中的列名与实体类中的属性名对应不上的时候

1.起别名
select id as userId
2.resultmap 结果集映射
**resulyMap:**建立实体类和数据库表的对应关系
**id属性:**给定一个唯一标识,时查询select标签引用用的
**type属性:**指定实体类的全限定类型

 <resultMap id="userMap" type="com.daniel.domain.User">
        <!--主键字段的对应 property实体属性的id(严格区分大小写)  column数据库列表中的id-->
        <id property="userId" column="id"></id>
        <!--非主键字段的对应-->
        <result property="userName" column="username"></result>
        <result property="userAddress" column="address"></result>
        <result property="userSex" column="sex"></result>
        <result property="userBirthday" column="birthday"></result>
    </resultMap>

    <!--配置查询所有  使用resultMap的时候   这样写开发效率快!!但是运行效率慢-->
    <select id="findAll" resultMap="userMap">
        <!--select id as userId   这样起别名的方法 运行效率快-->
        select * from user;
    </select>

**id标签:**用于指定主键字段
**result标签:**用于指定非主键字段
**column属性:**用于指定数据库列名
**property属性:**用于指定实体类属性名称

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值