Mybatis的入门(第一部分)
通过编写一个mybatis程序之后,已经了解了整个程序编写的流程,下面是对mybatis的补充,包括CRUD,配置分析…
文章目录
CRUD(增删查改)
1、namespace
namespace中的包名和mapper接口的包名一致
<mapper namespace="com.hao.dao.Usermapper">
</mapper>
2、select
选择,查询语句
- id:namespace里面的方法名
- resultType:sql语句返回值类型
- parameterType:参数类型
例子:
接口里的方法名
//根据id查询
User getUserByid(int id);
mapper配置
<!--id 绑定接口里的方法-->
<!--resultType 返回值类型-->
<!--paramterType 传入参数数据类型-->
<select id="getUserByid" resultType="com.hao.pojo.User" parameterType="_int">
select * from user where id=#{id}
</select>
junit测试
@Test
public void getUserByid(){
SqlSession session = MybatisUtils.getsqlsession();
Usermapper mapper = session.getMapper(Usermapper.class);
User user = mapper.getUserByid(1);
System.out.println(user);
session.close();
}
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-xObHnKPq-1649408569190)(C:/Users/86156/AppData/Roaming/Typora/typora-user-images/image-20220407214848361.png)]
3、insert
插入语句
例子:
接口中的方法名
//插入用户
int insertUser(User user);
mapper配置
<!--对象中的属性可以直接取出-->
<insert id="insertUser" parameterType="com.hao.pojo.User">
insert into user (id,name,pwd) values(#{id},#{name},#{pwd})
</insert>
Junit测试
@Test
public void insertUser(){
SqlSession session = MybatisUtils.getsqlsession();
Usermapper mapper = session.getMapper(Usermapper.class);
int res = mapper.insertUser(new User(4, "哈哈", "123457"));
session.commit();//提交事务
session.close();
}
4、update
改语句
例子:
接口中的方法名
//修改用户
int updateUser(User user);
mapper配置
<update id="updateUser" parameterType="com.hao.pojo.User">
update user set name = #{name},pwd = #{pwd} where id = #{id}
</update>
Junit测试
@Test
public void updateUser(){
SqlSession session = MybatisUtils.getsqlsession();
Usermapper mapper = session.getMapper(Usermapper.class);
int res = mapper.updateUser(new User(4, "呵呵", "177777"));
session.commit();//提交事务
session.close();
}
5、delete
删除
例子:
接口中的方法名
//删除用户
int deletUserByid(int id);
mapper配置
<delete id="deletUserByid" >
delete from user where id = #{id}
</delete>
Junit测试
@Test
public void deletUserByid(){
SqlSession session = MybatisUtils.getsqlsession();
Usermapper mapper = session.getMapper(Usermapper.class);
int res = mapper.deletUserByid(4);
session.commit();//提交事务
session.close();
}
Map和模糊查询拓展
万能的map
当user这种实体类属性过多时,或者数据库表中的字段过多,可以通过传入map作为参数
传入参数是map的key,可以不拘泥于实体类的属性,可自定义。
以插入作为例子:
接口中的方法名
//插入map参数
int insertUser2(Map<String,Object> map);
mapper配置
<!--传入map,key作为传入的参数-->
<insert id="insertUser2" parameterType="map">
insert into user (id,name,pwd) values(#{userid},#{username},#{password})
</insert>
Junit测试
@Test
public void insertUser2(){
SqlSession session = MybatisUtils.getsqlsession();
Usermapper mapper = session.getMapper(Usermapper.class);
Map<String,Object> map = new HashMap<String,Object>();
map.put("userid",5);
map.put("username","hello");
map.put("password","222111");
int res = mapper.insertUser2(map);
session.commit();//提交事务
session.close();
}
map传递参数,直接从sql中取出key即可
对象传递参数,直接从sql中取出对象的属性即可
只有一个参数的情况下,可以直接从sql中取到
多个参数用map或者注解
模糊查询
- java代码执行时传入通配符% %;
List<User> userlist = mapper.getUserLike("%李%");
- sql拼接中使用通配符
select * from mybatis.user where id like %#{value}%
配置解析
新建一个新模块mybatis-02用于后面配置优化
1、核心配置文件
mybaits-config.xml
- MyBatis 的配置文件包含了会深深影响 MyBatis 行为的设置和属性信息。
configuration(配置)
properties(属性)
settings(设置)
typeAliases(类型别名)
typeHandlers(类型处理器)
objectFactory(对象工厂)
plugins(插件)
environments(环境配置)
environment(环境变量)
transactionManager(事务管理器)
dataSource(数据源)
databaseIdProvider(数据库厂商标识)
mappers(映射器)
2、环境配置(environments)
-
MyBatis 可以配置成适应多种环境
-
尽管可以配置多个环境,但每个 SqlSessionFactory 实例只能选择一种环境。
<environments default="development"> <environment id="development"> <transactionManager type="JDBC"> <property name="..." value="..."/> </transactionManager> <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>
注意一些关键点:
- 默认使用的环境 ID(比如:default=“development”)。
- 每个 environment 元素定义的环境 ID(比如:id=“development”)。
- 事务管理器的配置(比如:type=“JDBC”)。
- 数据源的配置(比如:type=“POOLED”)。
默认环境和环境 ID 顾名思义。 环境可以随意命名,但务必保证默认的环境 ID 要匹配其中一个环境 ID。
事务管理器(transactionManager)
在 MyBatis 中有两种类型的事务管理器(也就是 type=“[JDBC|MANAGED]”):
- JDBC – 这个配置直接使用了 JDBC 的提交和回滚设施,它依赖从数据源获得的连接来管理事务作用域。
- MANAGED – 这个配置几乎没做什么。它从不提交或回滚一个连接,而是让容器来管理事务的整个生命周期(比如 JEE 应用服务器的上下文)。 默认情况下它会关闭连接。然而一些容器并不希望连接被关闭,因此需要将 closeConnection 属性设置为 false 来阻止默认的关闭行为。
数据源(dataSource)
dataSource 元素使用标准的 JDBC 数据源接口来配置 JDBC 连接对象的资源。
有三种内建的数据源类型(也就是 type=“[UNPOOLED|POOLED|JNDI]”):
UNPOOLED– 这个数据源的实现会每次请求时打开和关闭连接。没有连接池
POOLED– 这种数据源的实现利用“池”的概念将 JDBC 连接对象组织起来,避免了创建新的连接实例时所必需的初始化和认证时间。有连接池
JNDI – 这个数据源实现是为了能在如 EJB 或应用服务器这类容器中使用,容器可以集中或在外部配置数据源,然后放置一个 JNDI 上下文的数据源引用。
Mybatis默认的事务管理器是JDBC,连接池:POOLED
3、属性properties
通过使用properties引用来实现动态替换
-
编写一个db.properties文件
driver=com.mysql.cj.jdbc.Driver url = jdbc:mysql://localhost:3306/mybatis?useSLL=false&useUnicode=true&characterEncoding=UTF-8&serverTimezone=GMT username = root password = 123456
-
在核心配置文件中引入(在xml中所有的标签必须遵守顺序,位置不能乱放)
<!-- 第一种形式-->
<!-- <properties resource="db.properties"/> -->
<!-- 第二种形式-->
<properties resource="db.properties">
<property name="driver" value="driver"/>
<property name="url" value="url"/>
<property name="username" value="username"/>
<property name="password" value="password"/>
</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>
- 可以直接引入外部文件
- 可以在其中增加一些属性
- 在外部文件和增加的属性有同一字段,优先以外部文件为主。
4、类型别名(typeAliases)
类型别名可为 Java 类型设置一个缩写名字。 它仅用于 XML 配置,意在降低冗余的全限定类名书写。
<!--第一种-->
<typeAliases>
<typeAlias alias="user" type="com.hao.pojo.User"/>
</typeAliases>
<!--第二种-->
<typeAliases>
<package name="com.hao.pojo"/>
</typeAliases>
第二种默认别名为小写字母开头的类名,不能自定义别名,除非加注解
@Alias("uuu")
public class User {
...
}
此时别名为uuu,注意注解要配合package标签使用
下面是一些为常见的 Java 类型内建的类型别名。它们都是不区分大小写的,注意,为了应对原始类型的命名重复,采取了特殊的命名风格。
别名 | 映射的类型 |
---|---|
_byte | byte |
_long | long |
_short | short |
_int | int |
_integer | int |
_double | double |
_float | float |
_boolean | boolean |
string | String |
byte | Byte |
long | Long |
short | Short |
int | Integer |
integer | Integer |
double | Double |
float | Float |
boolean | Boolean |
date | Date |
decimal | BigDecimal |
bigdecimal | BigDecimal |
object | Object |
map | Map |
hashmap | HashMap |
list | List |
arraylist | ArrayList |
collection | Collection |
iterator | Iterator |
5、设置
这是 MyBatis 中极为重要的调整设置,它们会改变 MyBatis 的运行时行为。
以上是比较重要的设置,其余参考官方文档mybatis – MyBatis 3 | 配置
6、其他配置
typeHandlers(类型处理器)
objectFactory(对象工厂)
- plugins(插件)
- mybatis-plus
- mybatis-generator-core
- 通用mapper
7、mappers(映射器)
MapperRegistry:注册绑定Mapper文件
主要三种方式:
<!-- 使用相对于类路径的资源引用 -->
<mappers>
<mapper resource="com/hao/dao/Usermapper"/>
</mappers>
<!-- 使用映射器接口实现类的完全限定类名 -->
<mappers>
<mapper class="com.hao.dao.Usermapper"/>
</mappers>
<!-- 将包内的映射器接口实现全部注册为映射器 -->
<mappers>
<package name="com.hao.dao"/>
</mappers>
注意:
- 使用class的方式时候接口名字必须和mapper.xml名字相同,必须在同一包下面,package也是一样。
- 推荐使用第一种
8、生命周期和作用域
不同作用域和生命周期类别是至关重要的,因为错误的使用会导致非常严重的并发问题。
SqlSessionFactoryBuilder:
-
这个类可以被实例化、使用和丢弃,一旦创建了 SqlSessionFactory,就不再需要它了。
-
局部变量
SqlSessionFactory:
-
SqlSessionFactory 一旦被创建就应该在应用的运行期间一直存在,没有任何理由丢弃它或重新创建另一个实例。
-
就相当于一个数据库连接池
-
应用作用域
SqlSession:
- sqlSession 的实例不是线程安全的,因此是不能被共享的,所以它的最佳的作用域是请求或方法作用域。
- 连接连接池的一个请求
- 需要关闭