随笔 - 122,  文章 - 2,  评论 - 2,  阅读 - 54649

map

interface BlogAdminMapper

int addBlogAdmin1(Map<String,Object> map);

BlogAdminMapper.xml

<!--  map  -->
    <insert id="addBlogAdmin1" parameterType="map">
        insert into blog_admin (id,name,password) value (#{id},#{name},#{pwd});
    </insert>

Test

   @Test
    /**
     * map
     */
    public void AddBlogAdmin1(){
        SqlSession sqlSession = MybatisUtils.getsqlSession();
        BlogAdminMapper mapper = sqlSession.getMapper(BlogAdminMapper.class);
        Map<String,Object> map = new HashMap<String,Object>();
        map.put("id",4);
        map.put("name","test1");
        map.put("pwd","123");
        mapper.addBlogAdmin1(map);
        sqlSession.commit();

        sqlSession.close();
    }

模糊查询

interface BlogAdminMapper

List<BlogAdmin> getLikeList(String value);

BlogAdminMapper.xml

<!-- 控制死,避免出现SQL注入安全问题 -->
<select id="getLikeList" parameterType="String" resultType="com.depressiom.Pojo.BlogAdmin">
        select * from blog_admin where name like "%"#{name}"%"
    </select>

Test

 public void getLikeList(){
        SqlSession sqlSession = MybatisUtils.getsqlSession();
        BlogAdminMapper mapper = sqlSession.getMapper(BlogAdminMapper.class);
        List<BlogAdmin> list = mapper.getLikeList("test");
        for (BlogAdmin blogAdmin : list) {
            System.out.println(blogAdmin);
        }
        sqlSession.close();
    }

配置详解

环境配置(environments)

MyBatis 可以配置成适应多种环境。例如,开发、测试和生产环境需要有不同的配置;或者想在具有相同 Schema 的多个生产数据库中使用相同的 SQL 映射。还有许多类似的使用场景。

不过要记住:尽管可以配置多个环境,但每个 SqlSessionFactory 实例只能选择一种环境
每个数据库对应一个 SqlSessionFactory 实例

<?xml version="1.0" encoding="UTF8" ?>
<!DOCTYPE configuration
        PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
        "https://mybatis.org/dtd/mybatis-3-config.dtd">

<configuration>
    <environments default="test">
        <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/blog"/>
                <property name="username" value="root"/>
                <property name="password" value="root"/>
            </dataSource>
        </environment>
        <environment id="test">
            <transactionManager type="JDBC"/>
            <dataSource type="POOLED">
                <property name="driver" value="com.mysql.jdbc.Driver"/>
                <property name="url" value="jdbc:mysql://localhost:3306/blog"/>
                <property name="username" value="root"/>
                <property name="password" value="root"/>
            </dataSource>
        </environment>
    </environments>
    <mappers>
        <mapper resource="com/depressiom/dao/BlogAdminMapper.xml"/>
    </mappers>
</configuration>

事务管理器(transactionManager) 默认 type = JDBC

在 MyBatis 中有两种类型的事务管理器(也就是 type="[JDBC|MANAGED]")

  • JDBC – 这个配置直接使用了 JDBC 的提交和回滚功能,它依赖从数据源获得的连接来管理事务作用域。默认情况下,为了与某些驱动程序兼容,它在关闭连接时启用自动提交。然而,对于某些驱动程序来说,启用自动提交不仅是不必要的,而且是一个代价高昂的操作。因此,从 3.5.10 版本开始,你可以通过将 "skipSetAutoCommitOnClose" 属性设置为 "true" 来跳过这个步骤。例如:
<transactionManager type="JDBC">
  <property name="skipSetAutoCommitOnClose" value="true"/>
</transactionManager>
  • MANAGED – 这个配置几乎没做什么。它从不提交或回滚一个连接,而是让容器来管理事务的整个生命周期(比如 JEE 应用服务器的上下文)。 默认情况下它会关闭连接。然而一些容器并不希望连接被关闭,因此需要将 closeConnection 属性设置为 false 来阻止默认的关闭行为。例如:
<transactionManager type="MANAGED">
  <property name="closeConnection" value="false"/>
</transactionManager>

数据源(dataSource)默认 type="POOLED"

dataSource 元素使用标准的 JDBC 数据源接口来配置 JDBC 连接对象的资源。

  • UNPOOLED– 这个数据源的实现会每次请求时打开和关闭连接。
  • POOLED– 这种数据源的实现利用“池”的概念将 JDBC 连接对象组织起来,避免了创建新的连接实例时所必需的初始化和认证时间。 这种处理方式很流行,能使并发 Web 应用快速响应请求。
  • JNDI – 这个数据源实现是为了能在如 EJB 或应用服务器这类容器中使用,容器可以集中或在外部配置数据源,然后放置一个 JNDI 上下文的数据源引用。

属性(properties)

可以使用properties属性来实现 引用配置文件(这些属性可以在外部进行配置,并可以进行动态替换。你既可以在典型的 Java 属性文件中配置这些属性,也可以在 properties 元素的子元素中设置。)

编写一个配置文件 db.properties

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

在核心配置文件中引入

<?xml version="1.0" encoding="UTF8" ?>
<!DOCTYPE configuration
        PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
        "https://mybatis.org/dtd/mybatis-3-config.dtd">

<configuration>
    <properties resource="db.properties">
        <property name="username" value="admin"/>
        <property name="password" value="123456"/>
    </properties>
  <!-- 引入外部文件 -->
    <environments default="development">
        <environment id="development">
            <transactionManager type="JDBC"/>
            <dataSource type="POOLED">
                <property name="driver" value="${driver}"/>
                <property name="url" value="${url}"/>
                <property name="username" value="${username}"/>
                <property name="password" value="${password}"/>
            </dataSource>
        </environment>
    </environments>
    <mappers>
        <mapper resource="com/depressiom/dao/BlogAdminMapper.xml"/>
    </mappers>
</configuration>

注意:
1.可直接引入外部文件,不加property
2.可在引入之后添加,property属性
3.如果两种方式重名,引入外部的文件优先级高于property属性

类型别名(typeAliases)

类型别名可为 Java 类型设置一个缩写名字。 它仅用于 XML 配置,意在降低冗余的全限定类名书写。

<?xml version="1.0" encoding="UTF8" ?>
<!DOCTYPE configuration
        PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
        "https://mybatis.org/dtd/mybatis-3-config.dtd">

<configuration>
    <!--  引入属性  -->
    <properties resource="db.properties">
        <property name="username" value="admin"/>
        <property name="password" value="123456"/>
    </properties>
    <!--  给实体类取别名  -->
    <typeAliases>
        <typeAlias type="com.depressiom.pojo.BlogAdmin" alias="admin" />
    </typeAliases>
    <environments default="development">
        <environment id="development">
            <transactionManager type="JDBC"/>
            <dataSource type="POOLED">
                <property name="driver" value="${driver}"/>
                <property name="url" value="${url}"/>
                <property name="username" value="${username}"/>
                <property name="password" value="${password}"/>
            </dataSource>
        </environment>
    </environments>
    <mappers>
        <mapper resource="com/depressiom/dao/BlogAdminMapper.xml"/>
    </mappers>
</configuration>
  • 也可以指定一个包名,MyBatis 会在包名下面搜索需要的 Java Bean,比如:
<typeAliases>
        <package name="com.depressiom.pojo"/>
    </typeAliases>
  • 每一个在包 domain.blog 中的 Java Bean,在没有注解的情况下,会使用 Bean 的首字母小写的非限定类名来作为它的别名。 比如 domain.blog.Author 的别名为 author;若有注解,则别名为其注解值
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
        PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
        "https://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.depressiom.dao.BlogAdminMapper">
    <select id="getAdminList" resultType="admin">
        select * from blog_admin
    </select>

    <select id="getAdminId" parameterType="int" resultType="admin">
        select * from blog_admin where id = #{id}
    </select>
    <!-- Properties of the object type can be retrieved directly -->
    <insert id="addBlogAdmin" parameterType="admin">
        insert into blog_admin (id,name,password) value (#{id},#{name},#{password});
    </insert>

    <update id="UpdateBlogAdmin" parameterType="admin">
        update blog_admin set password = #{password} where id = #{id};
    </update>

</mapper>

如果实体类较少,建议第一种,如果实体类较多,建议第二种,第一种可以DIY别名,第二种要改只能通过实体类注解

下面是一些为常见的 Java 类型内建的类型别名。它们都是不区分大小写的,注意,为了应对原始类型的命名重复,采取了特殊的命名风格。

别名 映射的类型
_byte byte
_char (since 3.5.10) char
_character (since 3.5.10) char
_long long
_short short
_int int
_integer int
_double double
_float float
_boolean boolean
string String
byte Byte
char (since 3.5.10) Character
character (since 3.5.10) Character
long Long
short Short
int Integer
integer Integer
double Double
float Float
boolean Boolean
date Date
decimal BigDecimal
bigdecimal BigDecimal
biginteger BigInteger
object Object
date[] Date[]
decimal[] BigDecimal[]
bigdecimal[] BigDecimal[]
biginteger[] BigInteger[]
object[] Object[]
map Map
hashmap HashMap
list List
arraylist ArrayList
collection Collection
iterator Iterator

设置(settings)

这是 MyBatis 中极为重要的调整设置,它们会改变 MyBatis 的运行时行为。
设置
设置

映射器(mappers)

方式一:使用相对于类路径的资源引用

<mappers>
        <mapper resource="com/depressiom/dao/BlogAdminMapper.xml"/>
    </mappers>

方式二:使用映射器接口实现类的完全限定类名

<mappers>
<!--        <mapper resource="com/depressiom/dao/BlogAdminMapper.xml"/>-->
        <mapper class="com.depressiom.dao.BlogAdminMapper"></mapper>
    </mappers>

注意点:
1.接口和对应的mapper配置文件必须同名
2.接口和对应的mapper配置文件必须在同一个目录下
注意

方式三: 将包内的映射器接口全部注册为映射器

<mappers>
        <package name="com.depressiom.dao"/>
    </mappers>

注意点:同上方式二

作用域(Scope)和生命周期

不同作用域和生命周期类别是至关重要的,因为错误的使用会导致非常严重的并发问题
生命周期

SqlSessionFactoryBuilder

  • 一旦创建了 SqlSessionFactory,就不再需要它了
  • SqlSessionFactoryBuilder 实例的最佳作用域是方法作用域(也就是局部方法变量)

SqlSessionFactory

  • 可以当做数据库连接池
  • SqlSessionFactory 一旦被创建就应该在应用的运行期间一直存在,没有任何理由丢弃它或重新创建另一个实例
  • SqlSessionFactory 的最佳作用域是应用作用域。
  • 有很多方法可以做到,最简单的就是使用单例模式或者静态单例模式。

SqlSession

  • 连接到连接池的一个请求
  • 每个线程都应该有它自己的 SqlSession 实例。
  • SqlSession 的实例不是线程安全的,因此是不能被共享的,所以它的最佳的作用域是请求或方法作用域。
  • 绝对不能将 SqlSession 实例的引用放在一个类的静态域,甚至一个类的实例变量也不行。
  • 每次收到 HTTP 请求,就可以打开一个 SqlSession,返回一个响应后,就关闭它。
    SqlSession
    每一个mapper就是一个业务

解决属性名和字段名不一致的问题

数据库中的字段

数据库中的字段

测试实体类字段名与数据库不一致

public class BlogAdmin {
    private int id;
    private String name;
    private String  pwd;
}

测试出现的结果为null

测试出现的结果

select * from blog_admin where id = #{id}
--类型处理器 等同于
select id,name,password from blog_admin where id = #{id}

解决方案:

  • 起别名
select id,name,password as pwd from blog_admin where id = #{id}

起别名

ResultMap结果集映射

<?xml version="1.0" encoding="UTF8" ?>
<!DOCTYPE mapper
        PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
        "https://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.depressiom.dao.BlogAdminMapper">
<!--    <select id="getAdminId" parameterType="int" resultType="admin">-->
<!--        select id,name,password as pwd from blog_admin where id = #{id}-->
<!--    </select>-->
<!-- 结果集映射  resultMap id 对应 select resultMap-->
    <resultMap id="mapAdmin" type="admin">
    <!--  column数据库中的字段    property 实体类中的属性    -->
        <result column="id" property="id"/>
        <result column="name" property="name"/>
        <result column="password" property="pwd"/>
    </resultMap>
    <select id="getAdminId" parameterType="int" resultMap="mapAdmin">
        select * from blog_admin where id = #{id}
    </select>

</mapper>

  • resultMap 元素是 MyBatis 中最重要最强大的元素
  • ResultMap 的设计思想是,对简单的语句做到零配置,对于复杂一点的语句,只需要描述语句之间的关系就行了。
  • 没有一个需要显式配置 ResultMap,这就是 ResultMap 的优秀之处——你完全可以不用显式地配置它们
 <resultMap id="mapAdmin" type="admin">
    <!--  column数据库中的字段    property 实体类中的属性    -->
      <!--   <result column="id" property="id"/>-->
        <!--  <result column="name" property="name"/>-->
        <result column="password" property="pwd"/>
    </resultMap>
posted on   depressiom  阅读(28)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· .NET10 - 预览版1新功能体验(一)
< 2025年3月 >
23 24 25 26 27 28 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 1 2 3 4 5

点击右上角即可分享
微信分享提示