当前位置: 首页 > article >正文

MyBatis---代理Dao方式的CRUD、MyBatis参数详解、MyBatis的配置文件

目录

第一章:代理Dao方式的CRUD操作

1. 代理Dao方式的增删改查

1.创建maven的java项目

2.UserMapper接口代码

3.UserTest的代码

4.UserMapper.xml的配置文件代码

5.模糊查询符号使用的区别

第二章:MyBatis参数详解

1. parameterType

2. resultType

第三章:SqlMapConfig.xml配置文件

1.在项目中定义jdbc.properties属性文件,存储数据库的相关的信息,统一管理。

2. 类型别名定义


 

第一章:代理Dao方式的CRUD操作

1. 代理Dao方式的增删改查

1.创建maven的java项目

2.UserMapper接口代码

package com.qcby.mapper;

import com.qcby.domain.User;

import java.util.List;

public interface UserMapper {
    /**
     * 查询所有
     * @return
     */
    public List<User> findAll();

    /**
     * 通过id更新数据
     * @param userId
     * @return
     */
    public User findById(Integer userId);

    /**
     * 添加数据
     * @param user
     */
    public void insert(User user);

    /**
     * 通过id更新数据
     * @param user
     */
    public void update(User user);

    /**
     * 通过id删除数据
     * @param userId
     */
    public void delete(Integer userId);

    /**
     * 通过名称来模糊查找
     * @param username
     * @return
     */
    public List<User> findByName(String username);

    /**
     * 统计总数据个数
     * @return
     */
    public Integer findByCount();
}

3.UserTest的代码

package com.qcby.mapper;
import java.io.IOException;
import java.io.InputStream;
import java.util.Date;
import java.util.List;

import com.qcby.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 org.omg.CORBA.PUBLIC_MEMBER;

public class UserTest {

    private InputStream in;
    private SqlSession session;
    private UserMapper mapper;

    @Before
    public void init() throws Exception{
        //加载配置文件
        in = Resources.getResourceAsStream("SqlMapConfig.xml");
        // 创建工厂对象
        SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(in);
        // 创建Session对象
        session = factory.openSession();
        // 获取到代理对象
        mapper = session.getMapper(UserMapper.class);
    }

    @After
    public void destory() throws IOException {
        in.close();
        session.close();
    }
    /**
     * 测试查询所有的方法
     * @throws Exception
     */
    @Test
    public void testFindAll() throws Exception{
        List<User> list = mapper.findAll();
        //遍历
        for (User user : list) {
            System.out.println(user);
        }
        in.close();
    }

    /**
     * 添加
     * @throws Exception
     */
    @Test
    public void testInsert() throws Exception{
        User user = new User();
        user.setUsername("美美");
        user.setBirthday(new Date());
        user.setSex("女");
        user.setAddress("保定");
        mapper.insert(user);
        session.commit();
        System.out.println(user.getId());
    }

    /**
     *通过id查找数据并更新数据    使用了两个sql语句
     * @throws Exception
     */
    @Test
    public void testUpdate() throws Exception {
        User user = mapper.findById(4);
        user.setUsername("小凤");
        mapper.update(user);
        session.commit();
    }

    /**
     * 通过id删除数据
     * @throws Exception
     */
    @Test
    public void testDelete() throws Exception {
        mapper.delete(5);
        session.commit();
    }

    /**
     * 模糊查找
     * @throws Exception
     */
    // 第一种
    @Test
    public void testFindByName() throws Exception{
        List<User> list = mapper.findByName("%王%");
        for(User user:list){
            System.out.println(user);
        }
    }

    // 第二种
    /*@Test
    public void testFindByName() throws Exception{
        List<User> list = mapper.findByName("王");
        for(User user:list){
            System.out.println(user);
        }
    }*/

    /**
     * 统计总数据个数
     * @throws Exception
     */
    @Test
    public void testFindByCount() throws Exception {
        Integer count = mapper.findByCount();
        System.out.println("总记录数:"+count);
    }
}

4.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.qcby.mapper.UserMapper">
    <!--
    namespace 叫做名称空间,表明以后查找UserMapper接口中的findAll的方法
    -->
    <!--
    select id="findAll" 中的id属性编写为UserMapper接口方法的名称
    resultType 表示findAll方法的返回值类型
    -->
    <select id="findAll" resultType="com.qcby.domain.User">
        select * from user;
    </select>

    <!--
        通过id查询
        SQL语句使用#{占位符的名称,名称可以任意},仅限于基本数据类型和String类型
    -->
    <select id="findById" resultType="com.qcby.domain.User" parameterType="int">
        select * from user where id = #{id};
    </select>

    <!-- 保存操作 -->
    <insert id="insert" parameterType="com.qcby.domain.User">
        /*
        keyProperty表示要返回的属性名称
        order取值AFTER表示插入数据后的行为
        resultType表示返回值的类型
        */
        <selectKey keyProperty="id" order="AFTER" resultType="java.lang.Integer">
            select last_insert_id();
        </selectKey>
        insert into user (username,birthday,sex,address) values (#{username},#{birthday},#{sex},#{address})
    </insert>

    <!-- 通过id来修改 -->
    <update id="update" parameterType="com.qcby.domain.User">
        update user set username = #{username},birthday = #{birthday},sex = #{sex},address= #{address} where id= #{id}
    </update>

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

    <!-- 模糊查询 -->
    <select id="findByName" resultType="com.qcby.domain.User" parameterType="string">
        <!-- 第一种方式的SQL语句 -->
        select * from user where username  like #{username}

        <!-- 第二章SQL语句的编写 强调:'%${value}%'不能修改,固定写法(不推荐使用)
        select * from user where username like '%${value}%'
        -->
    </select>

    <!-- 具体函数的查询 -->
    <select id="findByCount" resultType="int">
        select count(*) from user
    </select>




</mapper>
<!-- 保存操作 -->
<insert id="insert" parameterType="com.qcby.domain.User">
    /*
    keyProperty表示要返回的属性名称
    order取值AFTER表示插入数据后的行为
    resultType表示返回值的类型
    */
    <selectKey keyProperty="id" order="AFTER" resultType="java.lang.Integer">
        select last_insert_id();
    </selectKey>
    insert into user (username,birthday,sex,address) values (#{username},#{birthday},#{sex},#{address})
</insert>

保存操作解释

<selectKey>标签用于在插入数据后获取自增主键的值

比如在一个数据库中,我新添加了一条数据,如果想知道新添加的数据的id,有两种方法

1.传统方法 再写一条查询id的sql语句,但是如果数据足够多,且有重复部分,如通过名称查询,相同名称的数据有很多条(不建议)

2.通过<selectKey>标签并使用select last_insert_id() 在执行完插入数据的sql语句后获取插入的记录的主键ID

/*

keyProperty表示要返回的属性名称

order取值AFTER表示插入数据后的行为

resultType表示返回值的类型

*/

5.模糊查询符号使用的区别

        #{}:通过#{}可以实现preparedStatement向占位符中设置值,自动进行java类型和jdbc类型转换,#{}可以有效防止sql注入 #{}可以接收简单类型值或pojo属性值。 如果parameterType传输单个简单类型值,#{}括号中可以是value或其它名称。

        ${}:通过$可以将传入的内容拼接在中且不进行类型转换,${}可以将parameterType 传入的内容拼接在sql中且不进行jdbc类型转换, ${}可以接收简单类型值或pojo属性值,如果parameterType传输单个简单类型值,${}括号中只能是value。

第二章:MyBatis参数详解

1. parameterType

用于指定映射 SQL 语句时,传入参数的类型

parameterType 的常见值

  • 简单类型:如 String, Integer, int, long, double, boolean 等。
  • Java 对象:如 com.example.User 或其他 Java 类。
  • Map:如果你需要传递多个参数,可以使用 Map 或 @Param 注解。
  • 集合类型:如 List 或 Array,可以用来传递多个相同类型的参数。简单数据类型

1.简单数据类型

int double类型 String类型 long

简单的写法:java.lang.Integer --> int integer Int Integer 都可以,框架提供简写的方式。

//简单数据类型查询
User findById(int id);
<!-- 使用简单数据类型int查询-->
<!--<select id="findById" resultType="com.qcby.domain.User" parameterType="int">
    select * from user where id = #{id};
</select>-->

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

测试

/**
 * 使用简单数据类型int作为参数
 * @throws Exception
 */
@Test
public void findByIdTest() throws Exception{
    User user = mapper.findById(1);
    System.out.println(user);
}

2.POJO(JavaBean实体类)对象类型,默认是不能简写,可以配置。

User对象

//通过对象查询用户id
Integer findIdByUser(User user);
select id="findIdByUser" parameterType="com.qcby.domain.User" resultType="java.lang.Integer">
    select id from user where username = #{username} and sex = #{sex}
</select>
@Test
public void findIdByUserTest() throws Exception{
    User user = new User();
    user.setUsername("熊大");
    user.setSex("女");
    Integer idByUser = mapper.findIdByUser(user);
    System.out.println("User id:"+idByUser);
}

3.POJO包装对象类型

包含更多的实体类

package com.qcby.domain;

import javax.management.relation.Role;
import java.io.Serializable;

public class QueryVo implements Serializable{

    /**
     * 自己属性
     */
    private String name;
    /**
     * user属性
     */
    private User user;
    /**
     * role属性
     */
    private Role role;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public User getUser() {
        return user;
    }

    public void setUser(User user) {
        this.user = user;
    }

    public Role getRole() {
        return role;
    }

    public void setRole(Role role) {
        this.role = role;
    }
}

包装类查询方法

//包装类查询
List<User> findByVo(QueryVo vo);
<!-- resultType 表示findByVo方法的返回值类型 -->
<!-- 包装类测试查询 -->
<select id="findByVo" parameterType="com.qcby.domain.QueryVo" resultType="com.qcby.domain.User">
    select * from user where username = #{user.username}
</select>

测试

package com.qcby.mapper;

import com.qcby.domain.QueryVo;
import com.qcby.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.IOException;
import java.io.InputStream;
import java.util.List;

public class UserTest {

    private InputStream in;
    private SqlSession session;
    private UserMapper mapper;

    @Before
    public void init() throws Exception{
        //加载配置文件
        in = Resources.getResourceAsStream("SqlMapConfig.xml");
        //创建工厂对象
        SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(in);
        // 创建Session对象
        session = factory.openSession();
        // 获取到代理对象
        mapper = session.getMapper(UserMapper.class);
    }

    @After
    public void destory() throws IOException {
        //关闭资源
        in.close();
        session.close();
    }

    @Test
    public void findByVoTest() throws Exception {
        // 创建 QueryVo 对象
        QueryVo vo = new QueryVo();
        User user = new User();
        user.setUsername("老王"); // 设置查询条件
        vo.setUser(user);

        // 执行查询
        List<User> list = mapper.findByVo(vo);
        for (User u : list) {
            System.out.println(u);
        }
}

2. resultType

  1. 返回简单数据类型

                int double long String

  1. 返回POJO数据类型

                返回User对象类型

  1. resultMap结果类型

                resultType可以指定pojo将查询结果映射为pojo,但需要pojo的属性名和sql查询的列名一致方可映射成功。 如果sql查询字段名和pojo的属性名不一致,可以通过resultMap将字段名和属性名作一个对应关系 ,resultMap实质上还需要将查询结果映射到pojo对象中。 resultMap可以实现将查询结果映射为复杂类型的pojo,比如在查询结果映射对象中包括pojo和list实现一对一查询和一对多查询。

  • resultMap 用于定义数据库字段与Java实体类属性之间的映射关系。
  • id="userMap" 是映射的唯一标识,方便后续复用。
  • 每个<result>标签将数据库表字段映射到对应的 Java 属性。
//使用resultMap映射,查询所有用户
List<User> findUsers();
<!-- 演示resultMap配置 -->
<select id="findUsers" resultMap="userMap">
    select id as _id,username as _username,birthday as _birthday,sex as _sex,address as _address from user
</select>
<!-- 
    配置resultMap,用来进行数据封装
    id="唯一的名称,用来被引用的"
    type="进行封装数据的类型"
-->
<resultMap id="userMap" type="com.qcby.domain.User">
    <!--
        property="JavaBean中的属性"
        column="表中的字段"
    -->
    <result property="id" column="_id"/>
    <result property="username" column="_username"/>
    <result property="birthday" column="_birthday"/>
    <result property="sex" column="_sex"/>
    <result property="address" column="_address"/>
</resultMap>

property 和 column:

  • property:对应 Java 类中的属性。
  • column:对应数据库表中的字段。

SQL查询:

  • 使用别名(AS)重命名数据库字段,使其与 resultMap 的 column 配置一致。
  • 查询的字段 id, username, birthday, sex, address 分别重命名为 _id, _username, _birthday, _sex, _address。

测试

@Test
public void findUsersTest() throws Exception{
    //查询所有用户信息
    List<User> users = mapper.findUsers();
    for(User user : users){
        System.out.println(user);
    }
}

第三章:SqlMapConfig.xml配置文件

1.在项目中定义jdbc.properties属性文件,存储数据库的相关的信息,统一管理。

<?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>
    <!--
        <properties resource="jdbc.properties"></properties>读取外部的配置文件
        resource="文件的相对路径写法"。例如:jdbc.properties 或者 com/qcby/xxx/jdbc.properties
    -->
    <properties resource="jdbc.properties"></properties>
    <!-- 定义别名 -->
    <typeAliases>
        <!--
            把com.qcby.domain.User使用user别名来显示,别名user User USER 都可以,默认是忽略大写的
            <typeAlias type="com.qcby.domain.User" alias="user"/>
        -->
        <!-- 针对com.qcby.domain包下所有的类,都可以使用当前的类名做为别名 -->
        <package name="com.qcby.domain"/>
    </typeAliases>

    <!--<properties>
        <property name="jdbc.driver" value="com.mysql.jdbc.Driver"/>
        <property name="jdbc.url" value="jdbc:mysql://localhost:3306/mybatis_db"/>
        <property name="jdbc.username" value="root"/>
        <property name="jdbc.password" value="2020"/>
    </properties>-->
    <!--
        配置连接数据库的环境
        environments:可以配置多个连接数据库的环境
        属性:default:设置默认使用的环境的id
    -->
    <environments default="mysql">
        <!--
            environment:用来配置莫格具体的环境
            属性:id,表示连接数据库的环境的唯一表示,不能重复
        -->
        <environment id="mysql">
            <!--
                transactionManager:设置事务管理方式
                属性:type:"JDBC|MANAGED"
                JDBC:表示当前环境中,执行sql时,使用的是JDBC中原生的事务管理方法
                    事务的提交或回滚需要手动处理
                MANAGED:被管理,例如Spring
            -->
            <transactionManager type="JDBC"/>
            <!--
                dataSource:配置数据源
                属性type:“POOLED|UNPOOLED|JNDI”
                POOLED:表示使用数据库连接池缓存数据库的连接
                UNPOOLED:表示不使用数据库连接池
                JNDI:表示使用上下文中的数据源
            -->
            <!-- 配置是否需要使用连接池,POOLED使用,UNPOOLED不使用,这里使用的是mybatis自带的数据库连接池-->
            <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>

    <!-- 加载映射的配置文件 -->
    <mappers>
        <mapper resource="com/qcby/mapper/UserMapper.xml"/>
        <!--<package name="com.qcby.mapper"/>-->
    </mappers>
</configuration>

jdbc.properties属性文件

jdbc.driver=com.mysql.jdbc.Driver
jdbc.url=jdbc:mysql://localhost:3306/mybatis_db
jdbc.username=root
jdbc.password=2020

2. 类型别名定义

  1. MyBatis自已有类型别名的注册类,咱们编写int或者integer通过注册可以找到java.lang.Integer
  2. 咱们自己也可以进行别名的注册

SqlMapConfig.xml的配置文件

<!-- 定义别名 -->
<typeAliases>
    <!--
        把com.qcby.domain.User使用user别名来显示,别名user User USER 都可以,默认是忽略大写的
        <typeAlias type="com.qcby.domain.User" alias="user"/>
    -->
    <!-- 针对com.qcby.domain包下所有的类,都可以使用当前的类名做为别名 -->
    <package name="com.qcby.domain"/>
</typeAliases>

UserMapper.xml的配置文件使用别名

<!--
    resultType="com.qcby.domain.User"原来是全路径
    resultType="user" 现在使用的是别名的方式
 -->
<select id="findAll" resultType="user">
    select * from user
</select>


http://www.kler.cn/a/408263.html

相关文章:

  • 【Linux】安装cuda
  • excel版数独游戏(已完成)
  • Python操作neo4j库py2neo使用之创建和查询(二)
  • 自监督学习:从概念到应用的全面解析
  • Maven 依赖管理
  • uniapp发布android上架应用商店权限
  • Tri Mode Ethernet MAC IP核详解
  • 摆烂仙君传——深度学习秘境奇缘
  • 网络爬虫总结与未来方向
  • maven传递性依赖的原则
  • Photino:通过.NET Core构建跨平台桌面应用程序,.net国产系统
  • C++ 中的模板特化和偏特化
  • R虚拟环境中安装ncdf4库包编译库问题
  • 骑砍2霸主MOD开发(29)-顶点动画
  • # DBeaver 连接hive数仓
  • 标贝科技大模型声音复刻 快速获取高品质专属AI声音
  • 【Rhino】【Python】Create a series of Blocks according to Value of object Property
  • 【042C】基于51RFID门禁系统(LCD12864显示)【Proteus仿真+Keil程序+报告+原理图】
  • Java基础:日期时间相关类
  • python基础导包
  • springmvc-04-Controller及RestFul
  • cocos creator 3.8 3D模型、天空盒、雾 6
  • 基于SpringBoot的京东绿谷旅游信息服务平台设计与实现(源码+定制+开发)
  • 第六届国际科技创新学术交流大会暨新能源科学与电力工程国际学术会议(NESEE 2024)
  • [高阶数据结构三] B-树详解
  • 【Linux】线程的互斥和同步