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,返回一个响应后,就关闭它。
每一个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>
本文来自博客园,作者:depressiom,转载请注明原文链接:https://www.cnblogs.com/depressiom/p/16935466.html
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· .NET10 - 预览版1新功能体验(一)