Mybatis
文章目录
- Mybatis
- 搭建环境
- 创建Maven工程
- 将数据库中的表转换为对应的实体类
- 配置文件
- 核心配置文件==mybatis-config.xml==
- 创建Mapper接口
- 映射文件==xxxMapper.xml==
- log4j日志功能
- Mybatis操纵数据库
- 示例及要点说明
- 获取参数的两种方式
- ==${}==
- ==#{}==
- 各种类型的参数处理
- 单个字面量参数
- 多个字面量参数
- map集合类型的参数
- 实体类类型的参数
- 通过==@Param==注解(常用)
- Mybatis的各种查询功能
- 查询一条数据为实体类对象
- 查询多条数据为一个list集合
- 查询单个数据
- 查询一条数据为Map集合
- 查询多条数据为Map集合
- 特殊SQL的执行
- 模糊查询
- 批量删除
- 动态设置表名
- 添加功能获取自增的主键
- 自定义映射resultMap
- 多对一
- 一对多
搭建环境
创建Maven工程
- 打包模式更改为jar包,因为mybatis只是封装了jdbc,不需要使用Tomcat
- pom.xml导入依赖(mybatis的核心驱动+Mysql驱动+junit测试)
pom.xml
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>org.example</groupId>
<artifactId>MyBaits</artifactId>
<version>1.0-SNAPSHOT</version>
<packaging>jar</packaging>
<name>MyBaits</name>
<url>http://maven.apache.org</url>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
</properties>
<dependencies>
<!-- Mybatis核心 -->
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.5.7</version>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.13.2</version>
<scope>test</scope>
</dependency>
<!-- MySQL驱动 -->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.16</version>
</dependency>
</dependencies>
</project>
将数据库中的表转换为对应的实体类
User实体类
package com.zhnx.demo1.pojo;
import lombok.Data;
/**
* ssm.t_user
*/
@Data
public class User {
private Integer id;
private String username;
private String password;
private Integer age;
private String gender;
private String email;
public User() {
}
public User(Integer id, String username, String password, Integer age, String gender, String email) {
this.id = id;
this.username = username;
this.password = password;
this.age = age;
this.gender = gender;
this.email = email;
}
}
补充:使用@Data注解需要在pom.xml中配置lombok的依赖
lombok依赖
<!-- lombok,简化实体类-->
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.18.26</version>
<scope>compile</scope>
</dependency>
配置文件
核心配置文件mybatis-config.xml
核心配置文件主要功能,与数据库和映射文件进行绑定
- 存放位置:src/main/resources
mybatis-config.xml
<?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>
<!-- Mybatis 核心配置文件,标签的顺序
properties?,settings?,typeAliases?,typeHandlers?,
objectFactory?,objectWrapperFactory?,reflectorFactory?,
plugins?,environments?,databaseIdProvider?,mappers?
-->
<!--引入properties文件,然后才可以在当前文件中使用的方式访问 -->
<!-- ”jdbc.properties“ 的文件名 -->
<properties resource="jdbc.properties"/>
<!--设置类型别名 -->
<typeAliases>
<!-- 比较 好的方式就是以包为单位,将报下所有的类型设置成默认的类型别名,类名不区分大小写 -->
<!-- 类所在包的全类名:com.zhnx.mybatis.pojo-->
<package name="com.zhnx.demo1.pojo"/>
</typeAliases>
<!--设置连接数据库的环境-->
<environments default="development">
<environment id="development">
<transactionManager type="JDBC"/>
<dataSource type="POOLED">
<!-- 设置数据库连接的驱动 ${jdbc.driver}-->
<property name="driver" value="${jdbc.driver}"/>
<!-- 设置数据库的连接地址 ${jdbc.url}-->
<property name="url" value="${jdbc.url}"/>
<!-- 设置连接数据库的用户名 ${jdbc.username}-->
<property name="username" value="${jdbc.username}"/>
<!-- 设置连接数据库的密码 ${jdbc.password}-->
<property name="password" value="${jdbc.password}"/>
</dataSource>
</environment>
</environments>
<!--引入映射文件-->
<mappers>
<!-- <mapper resource="mappers/UserMapper.xml"/>-->
<!-- 这种方式一定要保证mapper接口和映射文件在同一个目录下-->
<package name="com.zhnx.demo1.mapper"/>
</mappers>
</configuration>
创建Mapper接口
package com.zhnx.demo1.mapper;
import com.zhnx.demo1.pojo.User;
public interface UserMapper {
/**
* 根据用户名查询用户信息
* @param name
* @return
*/
User getUserByUsername(String name);
}
映射文件xxxMapper.xml
在映射文件中写SQL语句,操作数据库
- 一个映射文件对应一个实体类,一张表
- mapper接口的全类名和映射文件的namespace要一致
- Mapper接口中的方法名需要和映射文件中的SQL语句的id保持一致
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">
<!-- namespace = ”当前接口的全类名“ 如com.zhnx.mybatis.mapper.UserMapper-->
<mapper namespace="com.zhnx.demo1.mapper.UserMapper">
<!--mapper接口和映射文件要保持两个一致
1、mapper接口的全类名和映射文件的namespace一致
2、mapper接口中的方法的方法名要和映射设文件中的sql的id保持一致-->
<!-- int insertUser();-->
<insert id="insertUser">
insert into t_user values (null,'admin','00000000',23,'男','admin000.qq.com');
</insert>
</mapper>
log4j日志功能
在pom.xml中加入log4j的依赖
<!-- log4j日志 -->
<dependency>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
<version>1.2.17</version>
</dependency>
Mybatis操纵数据库
示例及要点说明
eg:
1、在UserMapper接口中新增方法
public interface UserMapper{ User selectUser(); }
2、在UserMapper.xml中配置SQL语句等
<select id="selectUser" resultType="User"> select * from t_user where id = 1; </select>
-
resultType:设置返回的结果类型,就是查询得到数据转换成的对应的Java类型(全类名)
-
可以在核心配置文件中使用标签设置类型别名
-
<!--设置类型别名 --> <typeAliases> <!-- 比较 好的方式就是以包为单位, 将包下所有的类型设置成默认的类型别名,类名不区分大小写 --> <package name="com.zhnx.demo1.pojo"/> </typeAliases>
-
-
resultMap:自定义映射处理多对一或者一对多映射关系
获取参数的两种方式
${}
-
字符串拼接
-
注意添加单引号
#{}
-
占位符赋值
-
不需要添加单引号
-
可以防止SQL注入
各种类型的参数处理
单个字面量参数
${}和#{}都可以,以任意键值就可以获取参数值
需要注意的是,${}需要手动添加单引号
多个字面量参数
不可以使用#{username}、#{password}的方式
因为 因为当mapper接口中的方法参数为多个时,此时MyBatis会自动将这些参数放在一个map集合中,以arg0,arg1…或param1,param2…为键,以参数为值
所以,多个字面量参数的处理方式应该为==#{arg0}…或‘${arg0}’==…
map集合类型的参数
这种参数可以直接#{==map键值对的键==值}
- eg:#{username}
实体类类型的参数
这种参数可以直接==通过实体类的属性名==获取属性值
- eg:#{username}
通过==@Param==注解(常用)
- User getUserByUsername(==@param(“name”)==String name);
- 以注解的value属性值为键和Param1、Param2…为键
- eg:#{name}
Mybatis的各种查询功能
查询一条数据为实体类对象
- resultType=“User”
查询多条数据为一个list集合
- resultType=“User”
查询单个数据
- resultType=“integer/int/Int/Integer/_integer”(类型别名不区分大小写)
查询一条数据为Map集合
- resultType=“map”
查询多条数据为Map集合
- resultType=“map”
* 查询出来的多个Map集合统一放在list集合中
** List<Map<String, Object>> getAllUserToMap();
** 查询结果: {password=123456, sex=男 ,
id=1, age=23, username=admin
}
* 查询出来的多个Map集合放在Map集合中(Map中嵌套Map)
** 使用@MapKey("id")为外层的Map集合指定键值
** @MapKey("id")
Map<String, Object> getAllUserToMap();
** 查询结果:{
1={password=123456, sex=男, id=1, age=23, username=admin},
2={password=123456, sex=男, id=2, age=23, username=张三},
3={password=123456, sex=男, id=3, age=23, username=张三}
}
特殊SQL的执行
模糊查询
-
LIKE ‘abc%’
- _ LIKE ‘_${mohu}%’
- LIKE concat(‘%’,#{mohu},‘%’)
- LIKE “%”#{mohu}“%”
-
具体情况根据SQL语句来判断
批量删除
delete from t_user where id in (${ids})
动态设置表名
select * from ${tableName}
添加功能获取自增的主键
//useGeneratedKeys=“true”
//keyProperty="id"
<insert id="insertUser" useGeneratedKeys="true" keyProperty="id">
insert into t_user values(null,#{username},#{password},#{age},#{sex})
</insert
自定义映射resultMap
//resultMap标签的和其中属性的详解
<!--
resultMap:设置自定义映射
属性:
id:表示自定义映射的唯一标识
type:查询的数据要映射的实体类的类型
子标签:
id:设置主键的映射关系
result:设置普通字段的映射关系association:设置多对一的映射关系
collection:设置一对多的映射关系
属性:
property:设置映射关系中实体类中的属性名
column:设置映射关系中表中的字段名-->
<!--简单例子 --!>
<resultMap id="userMap" type="User">
<id property="id" column="id"></id>
<result property="userName" column="user_name"></result>
<result property="password" column="password"></result>
<result property="age" column="age"></result>
<result property="sex" column="sex"></result>
</resultMap>
<select id="selectUser" resultMap="userMap">
select * from user;
<select>
多对一
例子:实体类中还有实体类
-
级联:使用 “类名.字段名” 的方式进行映射
-
<resultMap id="empDeptMap" type="Emp"> <id column="eid" property="eid"></id> <result column="ename" property="ename"></result> <result column="age" property="age"></result> <result column="sex" property="sex"></result> <result column="did" property="dept.did"></result> <result column="dname" property="dept.dname"></result> </resultMap>
-
-
association
-
<resultMap id="empDeptMap" type="Emp"> <id column="eid" property="eid"></id> <result column="ename" property="ename"></result> <result column="age" property="age"></result> <result column="sex" property="sex"></result> <association property="dept" javaType="Dept"> <id column="did" property="did"></id> <result column="dname" property="dname"></result> </association> </resultMap>
-
一对多
例子:实体类中有集合
-
collection
-
<resultMap id="deptEmpMap" type="Dept"> <id property="did" column="did"></id> <result property="dname" column="dname"></result> <collection property="emps" ofType="Emp"> <id property="eid" column="eid"></id> <result property="ename" column="ename"></result> <result property="age" column="age"></result> <result property="sex" column="sex"></result> </collection> </resultMap>
-