mybatis基本用法

 

mybatis 架构

mybatis开发dao的方法:

         1、原始dao开发方法,需要程序员编写dao接口和实现类,此方法在当前企业中还有使用,因为ibatis使用的就是原始dao开发方法。

         2、mapper代理方法,程序员只需要写mapper接口(相当于dao接口),mybatis自动根据mapper接口和mapper接口对应的statement自动生成代理对象(接口实现类对象)。

         开发需要遵循规则:

          1)mapper.xml中namespace是mapper接口的全限定名

          2)mapper.xml中statement的id为mapper接口方法名

          3)mapper.xml中statement的输入映射类型(parameterType)和mapper接口方法输入参数类型一致

          4) mapper.xml中statement的输出映射类型(resultType)和mapper接口方法返回结果类型一致

 传入多个参数的情况

方案1

public List<XXXBean> getXXXBeanList(String xxId, String xxCode);  

<select id="getXXXBeanList" resultType="XXBean">

  select t.* from tableName where id = #{0} and name = #{1}  

</select>  

由于是多参数那么就不能使用parameterType, 改用#{index}是第几个就用第几个的索引,索引从0开始

方案2(推荐)基于注解

public List<XXXBean> getXXXBeanList(@Param("id")String id, @Param("code")String code);  

<select id="getXXXBeanList" resultType="XXBean">

  select t.* from tableName where id = #{id} and name = #{code}  

</select>  

由于是多参数那么就不能使用parameterType, 这里用@Param来指定哪一个

三、Map封装多参数:  

public List<XXXBean> getXXXBeanList(HashMap map);  

<select id="getXXXBeanList" parameterType="hashmap" resultType="XXBean">

  select 字段... from XXX where id=#{xxId} code = #{xxCode}  

</select>  

其中hashmap是mybatis自己配置好的直接使用就行。map中key的名字是那个就在#{}使用那个,map如何封装就不用了我说了吧。 

 

resultType和resultMap都可以完成输出映射:

         resultType映射要求sql查询的列名和输出映射pojo类型的属性名一致

         resultMap映射时对sql查询的列名和输出映射pojo类型的属性名作一个对应关系。

 

动态sql:

         #{}和${}完成输入参数的属性值获取,通过OGNL获取parameterType指定pojo的属性名。

    #{}:占位符号,好处防止sql注入

         ${}:sql拼接符号

 

 

步骤:

  1、编写SqlMapConfig.xml

  2、编写mapper.xml

           定义了statement

  3、编程通过配置文件创建SqlSessionFactory

  4、通过SqlSessionFactory获取SqlSession

  5、通过SqlSession操作数据库

           如果执行添加、更新、删除需要调用SqlSession.commit()

  6、SqlSesion使用完成要关闭

 

首先创建dao层接口和相关方法

复制代码
package com.dao;

import java.awt.List;

import org.apache.ibatis.annotations.Param;

import com.pojo.User;

public interface IUserDao {
    User getUserById(@Param(value = "id") int id);   //

    User getUserByName(String username);

    void deleteByid(int id);

    void insert(User u);
    java.util.List<User> getUsers();
}
复制代码

 

其次 在IUserDao.xml 中写相关的方法的实现

1
2
<!-- namespace 表示命名空间 必须和 该mapper对应的接口的全路径 -->
<mapper namespace="com.dao.IUserDao">
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
<?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">
<!-- namespace 表示命名空间 必须和 该mapper对应的接口的全路径 -->
<mapper namespace="com.dao.IUserDao">
    <!-- id表示 标号 必须和接口的方法一致 -->
    <!-- #里面的变量名 必须和方法里面参数一致 -->
    <!-- resultType 返回类型 必须数据库字段和属性名相同才可以赋值 -->
    <resultMap type="com.pojo.User" id="uid">
        <id property="userId" column="user_id" />
        <!-- 名字不一样必须配置 名字一样 可以不配的  -->
    </resultMap>
    <select id="getUserById" resultMap="uid">
 
        select * from user where
        user_id =#{id} ;
    </select>
    <!-- # id和方法id一样就可以了 但是 $ 最后和@param一起使用 指定名字 -->
    <select id="getUserByName" resultType="com.pojo.User">
        select * from user where
        username =#{username} ;
    </select>
    <delete id="deleteByid">
        delete from user where
        user_id =#{id}
 
    </delete>
    <!-- 如果穿入对象的时候 我们写法 直接写#{该class属性的属性} -->
    <insert id="insert" parameterType="com.pojo.User" keyProperty="userId"
        useGeneratedKeys="true">
        insert into user values(null,#{username},1);
 
    </insert>
     
     
    <!-- 返回list 跟返回单个是一样的   resultMap-->
    <select id="getUsers" resultMap="uid">
 
        select * from user ;
    </select>
</mapper>

  

 

按照上面的架构具体操作如下:

1   SqlMapConfig.xml的配置  包含两个部分   1mybatis全局配置 ,运行环境   2 mapper.xml(<mapper resource="com/dao/UserMapper.xml" />)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
<!DOCTYPE configuration
PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
    <settings>
        <setting name="logImpl" value="STDOUT_LOGGING" />
        <!-- 全局配置参数 -->
        <!-- 延迟加载总开关 -->
        <setting name="lazyLoadingEnabled" value="true" />
        <!-- 设置按需加载 -->
        <setting name="aggressiveLazyLoading" value="true" />
        <!-- 开启二级缓存 -->
        <setting name="cacheEnabled" value="true" />
    </settings>
    <!-- 和spring整合后 environments配置将废除 -->
    <environments default="development">
        <environment id="development">
 
            <transactionManager type="JDBC" />
 
            <dataSource type="POOLED">
                <property name="driver" value="com.mysql.jdbc.Driver" />
                <property name="url" value="jdbc:mysql://localhost:3306/test" />
                <property name="username" value="root" />
                <property name="password" value="mysql" />
            </dataSource>
        </environment>
    </environments>
 
    <!--加載mapper.xml -->
    <mappers>
        <mapper resource="com/dao/UserMapper.xml" />
    </mappers>
 
</configuration>

  2  创建测试类

    注意  :   在执行增加,修改,删除等操作的时候应该要手动提交事务,

        Resources.getResourceAsReader加载文件时  默认在src目录下

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
import java.io.Reader;
 
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
 
import com.dao.IUserDao;
import com.pojo.User;
 
public class Test1Hello {
    public static void main(String[] args) throws Exception {
        // 1加载核心配置文件
 
        Reader inputStream = org.apache.ibatis.io.Resources.getResourceAsReader("SqlMapConfig.xml");
        // 2获取Factory
        SqlSessionFactory sf = new SqlSessionFactoryBuilder().build(inputStream);
        // 获取session
        //
        SqlSession session = sf.openSession();
        IUserDao userDao = session.getMapper(IUserDao.class);
        User u = userDao.getUserById(6);
        System.out.println("==========" + userDao.getUsers());
        // System.out.println(u.getUsername());
        // 删除操作 以及插入 需要提交事务
        // userDao.deleteByid(4);
        // session.commit();
        // 插入
        // User insertUser = new User(1, "cca");
        // userDao.insert(insertUser);
        // System.out.println(insertUser.getUserId());
        // session.commit();
        // 查询所有的时候
    }
}

  

 

主键返回:

1
2
3
4
5
6
<!-- 如果穿日入对象的时候 我们写法 直接写#{该class属性的属性} -->
    <insert id="insert" parameterType="com.pojo.User" keyProperty="userId"
        useGeneratedKeys="true">
        insert into user values(null,#{username},1);
 
</insert><br><br>

    #{}

表示一个占位符,向占位符输入参数,mybatis自动进行java类型和jdbc类型的转换。

程序员不需要考虑参数的类型,比如:传入字符串,mybatis最终拼接好的sql就是参数两边加单引号。

#{}接收pojo数据,可以使用OGNL解析出pojo的属性值

    ${}

表示sql的拼接,通过${}接收参数,将参数的内容不加任何修饰拼接在sql中。

${}也可以接收pojo数据,可以使用OGNL解析出pojo的属性值

缺点:不能防止sql注入。

 输入和输出映射[重要]

通过parameterType完成输入映射,通过resultType和resultMap完成输出映射。

 

 

resultType :指定输出结果的类型(pojo、简单类型、hashmap..),将sql查询结果映射为java对象 。

         使用resultType注意:sql查询的列名要和resultType指定pojo的属性名相同,指定相同 属性方可映射成功,如果sql查询的列名要和resultType指定pojo的属性名全部不相同,list中无法创建pojo对象的。

 

resultMap:将sql查询结果映射为java对象。

         如果sql查询列名和最终要映射的pojo的属性名不一致,使用resultMap将列名和pojo的属性名做一个对应关系 (列名和属性名映射配置)

 

Collection里面的值表示类型,和mapper.java里面的属性无关

 

使用foreach遍历list:

<delete id="deleteByids">

                   delete from user where user_id in (

                   <foreach collection="list" item="item" separator=",">

                            #{item}

                   </foreach>

                   )

         </delete>

 

     自定义别名

 

     使用别名

在parameterType、resultType中使用别名:

 

 

 

 ResultMap的用法

 where  if 用法

 

posted @   温一壶月光当茶饮  阅读(636)  评论(0编辑  收藏  举报
编辑推荐:
· ASP.NET Core 模型验证消息的本地化新姿势
· 对象命名为何需要避免'-er'和'-or'后缀
· SQL Server如何跟踪自动统计信息更新?
· AI与.NET技术实操系列:使用Catalyst进行自然语言处理
· 分享一个我遇到过的“量子力学”级别的BUG。
阅读排行:
· dotnet 源代码生成器分析器入门
· 官方的 MCP C# SDK:csharp-sdk
· 从零开始:基于 PyTorch 的图像分类模型
· [WPF] 在RichTextBox中输出Microsoft.Extension.Logging库的
· 一步一步教你部署ktransformers,大内存单显卡用上Deepseek-R1
点击右上角即可分享
微信分享提示