【Mybatis】Day 02 -- 基本CRUD操作

文中代码托管在码云平台,点击进入

单表CRUD操作

实现流程

  • 在Dao接口类中定义操作方法
  • 在Dao接口类的对应映射配置文件中的相应标签内添加并写入对应的 sql 语句
  • 在使用类中调用Dao接口类的方法使用(https://gitee.com/RaceK/Learn)

IUserDao.java 接口类

/**
* 查询所有操作
* @return 返回user列表
**/
List<User> findAll();

IUserDao.xml 映射配置文件

<mapper namespace="com.learn.dao.IUserDao">
    <!-- 配置查询所有 -->
    <!-- resultType 表示指定返回的是哪一种对象 -->
    <select id="findAll" resultType="com.learn.domain.User">
        select * from user;
    </select>

test.java 测试类

/**
 * 测试查找所有
 * 使用传统方法
 * @throws IOException 异常
 */
@Test
public void testFindAll() throws IOException {
    // 1 读取配置文件
    InputStream in = Resources.getResourceAsStream("SqlMapConfig.xml");
    // 2 创建SqlSessionFactory工厂
    // Mybatis把工厂的创建细节封装在SqlSessionFactoryBuilder
    SqlSessionFactoryBuilder builder = new SqlSessionFactoryBuilder();
    SqlSessionFactory factory = builder.build(in);
    // 3 使用工厂生产SqlSession对象
    SqlSession session = factory.openSession();
    // 4 使用SqlSession创建dao接口的代理对象
    IUserDao userDao = session.getMapper(IUserDao.class);
    // 5 使用代理对象的执行方法
    List<User> users = userDao.findAll();
    for (User user : users) {
        System.out.println(user);
    }
    // 6 释放资源
    session.close();
    in.close();
}

使用细节

  • 增删改查的对应 xml 标签:insert delete update select
  • 若要在保存了数据之后获取其id值,要在映射配置文件的增加标签中添加selectKey标签
<!-- 在保存完成后获取当前保存的id值 -->
<!-- keyProperty属性名,对应实体类  order取值为AFTER代表插入后的行为 keyColumn列名,对应数据库表中的列 -->
<selectKey keyProperty="id" keyColumn="id" resultType="int" order="AFTER">
    select last_insert_id();
</selectKey>

mybatis 参数传递

参数传递方法类型

  • 通过 parameterType 传入参数类型为自定义类或 int整形和String类型

SQL语句传入参数

  • 在配置文件中表示传入参数的类型,后面使用参数的时候名称要与传入对象的属性名一致
  • 使用#{}${}均可将参数传入到sql语句中,前者使用preparedStatement的参数占位符方式,后者使用语句拼接的方式,通常使用#{}
  • ${}外面要用单引号括住,然后大括号里面的值必须是名为value,即'%${value}%',在模糊查询中就可以不再传入带%的字符串
    在这里插入图片描述

传递pojo对象

  • pojo对象就是JavaBean对象(实体类对象)
  • Mybatis 使用ognl表达式解析对象字段的值,#{}或者${}括号中的至为pojo属性名称
  • OGNL表达式(Object Graphic Navigation Language 对象 图 导航 语言)它是通过对象中的取值方法获取数据,在写法上把get给省略了,比如获取用户的名称,一般是user.getUserName(),ONGL 表达式写法:user.userName
  • 为什么在Mybatis中可以直接写userName而不用user呢?是因为在parameterType中已经提示了属性所属的类,所以此时不需要写对象名,直接写属性名
  • 开发过程中查询条件是综合的查询条件,可能会包括多方的查询条件,这时就可以组成一个我们自己定义的称为查询条件的对象
  • 使用过程
    (1)自定义一个类,包含了需要的查询条件
    (2)在Dao接口类中定义方法
    (3)在映射配置文件中配置
    (4)在方法中将要查询的条件放入到pojo对象中
    (5)调用查询方法查询用户
  • 具体代码可在仓库中的text.java中查看

输出结果封装 resultType

  • 可以是一个简单类型,可以是pojo对象,还可以是pojo对象列表
  • 封装结果时要求实体类属性名和数据库表列名一致,如果不一致,封装时会不匹配,数据封装不进去
  • 如果要解决不匹配的问题
    (1)最简单的是在 sql 语句中起别名select id as userId from user,由于直接在sql语句上操作,所以效率也是最高的
    (2)在映射配置文件中配置查询结果列名和实体类的属性名的对应关系
 <!-- 如果数据库表列名和实体类属性名不一致时需要配置对应关系 -->
 <!-- 配置 查询结果列名和实体类的属性名的对应关系 -->
 <resultMap id="userMap" type="com.learn.domain.User">
     <!-- 主键字段的对应 -->
     <id property="userId" column="id"/>
     <!-- 非主键字段的对应 -->
     <result property="userName" column="name"/>
     <result property="userSex" column="sex" />
     <!-- 因为是java语言,因此严格区分大小写 -->
     <!-- property:实体类中的属性名  column:数据库表的列名 -->
     <!-- javaType:java中的属性类型 jdbcType:数据库中的列表类型 -->
 </resultMap>
 <!-- 下面的CRUd操作中的resultType就不能用了,要用resultMap属性 resultMap="userMap" -->

mybatis Dao编写

实现流程

  • 新建一个接口实现类UserDaoImpl
  • 实现接口
  • 调用执行
// 1 创建类并实现接口
public class UserDaoImpl implements IUserDao {

    private SqlSessionFactory factory;

    public UserDaoImpl(SqlSessionFactory factory) {
        this.factory = factory;
    }

    @Override
    public List<User> findAll() {
        //1 根据factory 获取SqlSession对象
        SqlSession session = factory.openSession();
        //2 调用SqlSession中的方法,实现查询列表
        //参数就是能获取配置信息的key  配置文件中的 namespace + id
        List<User> users = session.selectList("com.learn.dao.IUserDao.findAll");
        //3 释放资源
        session.close();
        return users;
    }
}
// 2 调用执行
public class testDao {
    private InputStream in;
    private IUserDao userDao;

    @Before//用于在测试方法之前执行
    public void init() throws IOException {
        // 1 读取配置文件
        in = Resources.getResourceAsStream("SqlMapConfig.xml");
        // 2 创建SqlSessionFactory工厂
        SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(in);
        // 3 使用工厂对象创建dao对象
        userDao = new UserDaoImpl(factory);
    }

    @After//用于在测试方法之后执行
    public void close() throws IOException {
        in.close();
    }

    /**
     * 测试查找所有
     */
    @Test
    public void testFindAll() {
        // 5 使用代理对象的执行方法
        List<User> users = userDao.findAll();
        for (User user : users) {
            System.out.println(user);
        }
    }
}
  • 查询用select方法,查询一个用selectOne方法,查询多个用selectList方法,插入,删除,更新分别用insert delete update方法
  • 增删改的方法最后调用的都是 update 方法

mybatis 的配置(SqlMapConfig.xml)

  • properties标签
    (1)配置数据库连接信息
    (2)可以在标签内部配置,也可以通过 resource 属性引用外部配置信息
# SqlMapConfig.xml 文件
## 内部配置
<properties>
    <property name="driver" value="com.mysql.jdbc.Driver"/>
    <property name="url" value="jdbc:mysql://localhost:3306/user"/>
    <property name="username" value="root"/>
    <property name="password" value="123"/>
</properties>
<!--  下面的environment标签中配置数据源(连接池)  -->
<dataSource type="POOLED">
    <!--  配置连接数据库的4个基本属性  -->
    <!--  有了这些便能创建Connection对象  -->
    <property name="driver" value="${driver}"/>
    <property name="url" value="${url}"/>
    <property name="username" value="${username}"/>
    <property name="password" value="${password}"/>
</dataSource>

## 外部引用
<properties resource="jdbcConfig.properties">
</properties>
<!--  下面的environment标签中配置数据源(连接池)  -->
<dataSource type="POOLED">
    <!--  配置连接数据库的4个基本属性  -->
    <!--  有了这些便能创建Connection对象  -->
    <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>

# jdbcConfig.properties 文件
jdbc.driver = com.mysql.jdbc.Driver
jdbc.url = jdbc:mysql://localhost:3306/user
jdbc.username = root
jdbc.password = 123
  • typeAliases标签
    (1)当映射配置文件中的parameterType的值如果是简单类型,可以直接使用intString,这是因为自立用了别名,Mybatis已经设置了一些简单类型的别名方便使用,那么我们自定义的实体类就可以通过在主配置文件中使用typeAliases配置
    (2) typeAlias用于配置别名 type属性指定的是实体类的全限定类名 alias属性指定别名,当指定了别名就不再区分大小写
    (3)package用于指定要配置别名的包,当指定之后,该包下的实体类都会注册别名,并且类名就是别名,不再区分大小写

在这里插入图片描述

 <!-- 使用typeAliases 配置别名,它只能配置domain中类的别名 -->
 <typeAliases>
     <typeAlias type="com.learn.domain.User" alias="user"/>
     <package name="com.learn.domain"/>
 </typeAliases>

在这里插入图片描述

  • mappers标签
    (1)用于指定映射配置文件的位置,通过mapper设置,可以知道映射配置文件的位置和信息,有mapper和package两个标签
    (2)mapper标签用于指定单个映射配置文件,有class、resource和url三个属性,用于标识文件路径,如果使用注解则用class,使用传统方法用resource和url(区别在于路径的形式)
    (3)package标签用于指定dao接口所在的包,指定了之后就不用再写mapper以及resource或class了,可用于多个配置文件的指定
发布了27 篇原创文章 · 获赞 12 · 访问量 5182

猜你喜欢

转载自blog.csdn.net/Kobe_k/article/details/104062249