day14_mybatis1
day14_mybatis1
1mybatis框架介绍
dao层框架 数据持久层 对jdbc做了封装 简化程序编码
ORM框架 实体关系映射 半自动的orm框架 支持sql语句 主要做结果集(ResultSet)的自定封装
数据库 关系型数据库
java 面向对象的语言
2mybatis基本示例(了解)

1引入jar包
pom.xml中增加
<dependencies>
<!-- https://mvnrepository.com/artifact/org.mybatis/mybatis -->
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.5.19</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.projectlombok/lombok -->
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.18.38</version>
</dependency>
<!-- https://mvnrepository.com/artifact/com.mysql/mysql-connector-j -->
<dependency>
<groupId>com.mysql</groupId>
<artifactId>mysql-connector-j</artifactId>
<version>8.3.0</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.junit.jupiter/junit-jupiter-api -->
<dependency>
<groupId>org.junit.jupiter</groupId>
<artifactId>junit-jupiter-api</artifactId>
<version>5.13.4</version>
<scope>test</scope>
</dependency>
<!-- https://mvnrepository.com/artifact/javax.servlet/javax.servlet-api -->
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>javax.servlet-api</artifactId>
<version>4.0.1</version>
<scope>provided</scope>
</dependency>
<!-- https://mvnrepository.com/artifact/com.alibaba/fastjson -->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>1.2.83</version>
</dependency>
</dependencies>
2配置mybatis全局配置文件
mybatis配置文件 加载和启动的参数
mybatis-config.xml
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configuration
PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
"https://mybatis.org/dtd/mybatis-3-config.dtd">
<!--XML 可扩展标记语言
可以使用自定义标签
dtd 模板文件 规范了 不同的xml文件可写的标签不同
配置文件报红 配置错误 通常无法正常启动和使用
-->
<!-- configuration 配置 -->
<configuration>
<environments default="development">
<environment id="development">
<transactionManager type="JDBC"/>
<dataSource type="POOLED">
<property name="driver" value="com.mysql.cj.jdbc.Driver"/>
<property name="url" value="jdbc:mysql://127.0.0.1:3306/mydb"/>
<property name="username" value="root"/>
<property name="password" value="root"/>
</dataSource>
</environment>
</environments>
<mappers>
<mapper resource="mapper/userMapper.xml"/>
</mappers>
</configuration>
3配置sql映射文件
存放需要指定的sql语句 根据实体类对应存放
userMapper.xml

<?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="aa.bb">
<select id="selectUser" resultType="com.javasm.entity.User">
select * from user where id = 16
</select>
</mapper>
4 创建mybatis对象 执行sql语句
import com.javasm.entity.User;
import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
import org.junit.jupiter.api.Test;
import java.io.IOException;
import java.io.InputStream;
/**
* @className: MyBatisTest
* @description:
* @author: gfs
* @date: 2025/8/12 10:00
* @version: 0.1
* @since: jdk17
*/
public class MyBatisTest {
@Test
public void selectUserTest() throws IOException {
//创建mybatis公共对象
String resource = "mybatis-config.xml";
InputStream inputStream = Resources.getResourceAsStream(resource);
//SqlSession sql会话
//SqlSessionFactory sql会话 工厂 mybatis全局对象
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
//使用mysql连接
SqlSession sqlSession = sqlSessionFactory.openSession();
User user =(User) sqlSession.selectOne("aa.bb.selectUser");
System.out.println(user);
sqlSession.close();
}
}
3mybatis-config.xml 全局配置文件
mybatis-config.xml
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configuration
PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
"https://mybatis.org/dtd/mybatis-3-config.dtd">
<!--XML 可扩展标记语言
可以使用自定义标签
dtd 模板文件 规范了 不同的xml文件可写的标签不同
配置文件报红 配置错误 通常无法正常启动和使用
-->
<!-- configuration 配置 -->
<configuration>
<!-- 引入独立的sql连接参数配置文件 xxx.properties -->
<properties resource="jdbc.properties">
</properties>
<!-- settings mybatis运行参数 -->
<settings>
<!-- 开启驼峰转换 -->
<setting name="mapUnderscoreToCamelCase" value="true"/>
<!-- 开启mybatis日志输出 -->
<setting name="logImpl" value="STDOUT_LOGGING"/>
</settings>
<!-- 别名配置 给对象类型起别名 sql映射文件xxxMapper.xml文件中 可以直接使用别名
别名配置有的公司不用
mybatis有内置别名 比如 string java.lang.String
80种内置别名
-->
<typeAliases>
<typeAlias alias="User" type="com.javasm.entity.User"/>
</typeAliases>
<!-- 连接数据库的环境 -->
<environments default="development">
<!-- 允许配置多种环境 使用时通过 default参数 指定dao一个环境
开发环境
测试环境
生产环境
-->
<environment id="development">
<!-- 事务控制 使用jdbc事务控制 -->
<transactionManager type="JDBC"/>
<!-- 数据源配置 连接基本参数
数据库连接池 数据库连接 tcp连接
维持一定数量的连接 减少建立连接和断开连接的消耗
-->
<dataSource type="POOLED">
<property name="driver" value="${jdbc.driver}"/>
<property name="url" value="${jdbc.url}"/>
<property name="username" value="${jdbc.username}"/>
<property name="password" value="${jdbc.password}"/>
</dataSource>
</environment>
</environments>
<!-- 配置mybatis要使用的sql映射文件
支持 配置路径
配置报名
配置包扫描
-->
<mappers>
<mapper resource="mapper/userMapper.xml"/>
</mappers>
</configuration>
注意:
1全局配置文件 只需要配置一次 了解即可
2官网地址 https://mybatis.org/mybatis-3/zh_CN/configuration.html 可以参考官网查看配置参数
3全局配置 在启动mybatis时 会读取并加载入sqlSessionFactory对象

4mybatis接口映射

5.接口映射相关插件
1.mybatisCodeHelperPro 代码提示插件

2easyCode 通过mybatis数据库插件 连接数据库 生成代码
配置jar包 位置

D:\maven\repository\com\mysql\mysql-connector-j\8.3.0
在库表上可以生成需要的java代码

6工具类封装
package com.javasm.utils;
import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
import java.io.InputStream;
/**
* @className: MyBatisHealper
* @description:
* @author: gfs
* @date: 2025/8/12 14:32
* @version: 0.1
* @since: jdk17
*/
public class MyBatisHealper {
private static SqlSessionFactory sqlSessionFactory;
static{
try{
//创建mybatis公共对象
String resource = "mybatis-config.xml";
InputStream inputStream = Resources.getResourceAsStream(resource);
//SqlSession sql会话
//SqlSessionFactory sql会话 工厂 mybatis全局对象
sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
} catch (Exception e) {
throw new RuntimeException(e);
}
}
//获得连接
public static SqlSession getSqlSession(){
SqlSession sqlSession = sqlSessionFactory.openSession();
return sqlSession;
}
//归还连接
public static void backSqlSession(SqlSession sqlSession){
sqlSession.close();
}
//提交事务 归还连接
public static void backAndSaveSqlSession(SqlSession sqlSession){
sqlSession.commit();
sqlSession.close();
}
}
7sql映射文件的 用法
1传参
动态参数标记 #{} 动态参数标记 需要配合传参使用
${} 动态参数标记
{} 与 ${} 区别
{} 使用 ? 占位符 主要用于 参数传参
${} sql 硬拼接 主要用于 拼接sql语法
//切换排序顺序场景使用
select * from emp
order by sal ${sort}
1 简单数据 字符串 数字 bol
在接口方法的形参中标记 在sql映射文件中 使用#{xxx}取值 可以不对应 尽量还是用形参名
2 对象数据 自定义数据对象
标记传入对象
List<Emp> listEmpByJobAndDept(Emp emp);
在sql映射文件中 直接使用对象的属性
select * from emp where job = #{job} and deptno = #{deptno}
注意 核对属性与sql语句的对应关系
如果使用的属性名错误 会报错
3 使用map传参 (尽量少用)
如果要使用map 使用mybatis提供的自动封装map功能
List<Emp> listEmpByJobAndDept3(@Param("myjob") String job,@Param("mydeptno")Integer deptno);
sql映射文件中 直接使用map的key
select * from emp where job = #{myjob} and deptno = #{mydeptno}
4 使用list传参
很少使用
传入不同参数的案例
EmpDao.java
List<Emp> listEmp(Integer empno);
List<Emp> listEmp2(Integer empno);
List<Emp> listEmpByJobAndDept(Emp emp);
List<Emp> listEmpByJobAndDept2(Map paramMap);
// 自动封装map
List<Emp> listEmpByJobAndDept3(@Param("myjob") String job,@Param("mydeptno")Integer deptno);
List<Emp> listEmpByJobAndDept4(List paraList);
List<Emp> listEmpSortBySal(String sort);
EmpMapper.xml
<select id="listEmp" resultType="com.javasm.entity.Emp">
select * from emp where empno = #{xxxx}
</select>
<select id="listEmp2" resultType="com.javasm.entity.Emp">
select * from emp where empno = ${xxxx}
</select>
<select id="listEmpByJobAndDept" resultType="com.javasm.entity.Emp">
select * from emp where job = #{job} and deptno = #{deptno}
</select>
<select id="listEmpByJobAndDept2" resultType="com.javasm.entity.Emp">
select * from emp where job = #{paramJob} and deptno = #{paramDeptno}
</select>
<select id="listEmpByJobAndDept3" resultType="com.javasm.entity.Emp">
select * from emp where job = #{myjob} and deptno = #{mydeptno}
</select>
<select id="listEmpByJobAndDept4" resultType="com.javasm.entity.Emp">
select * from emp where job = #{list[0]} and deptno = #{list[1]}
</select>
<select id="listEmpSortBySal" resultType="com.javasm.entity.Emp">
select * from emp
order by sal ${sort}
</select>
测试类测试方法
@Test
public void listEmpTest(){
SqlSession sqlSession = MyBatisHealper.getSqlSession();
EmpDao mapper = sqlSession.getMapper(EmpDao.class);
List<Emp> emps = mapper.listEmp(1001);
List<Emp> emps1 = mapper.listEmp2(1001);
System.out.println(emps);
MyBatisHealper.backSqlSession(sqlSession);
}
@Test
public void listEmpByJobAndDeptTest(){
SqlSession sqlSession = MyBatisHealper.getSqlSession();
EmpDao mapper = sqlSession.getMapper(EmpDao.class);
Emp inputEmp = new Emp();
inputEmp.setJob("经理");
inputEmp.setDeptno(10);
List<Emp> emps = mapper.listEmpByJobAndDept(inputEmp);
System.out.println(emps);
MyBatisHealper.backSqlSession(sqlSession);
}
@Test
public void listEmpByJobAndDeptTest2(){
SqlSession sqlSession = MyBatisHealper.getSqlSession();
EmpDao mapper = sqlSession.getMapper(EmpDao.class);
HashMap<String, Object> paramMap = new HashMap<>();
paramMap.put("paramJob","12");
paramMap.put("paramDeptno",10);
List<Emp> emps = mapper.listEmpByJobAndDept2(paramMap);
System.out.println(emps);
MyBatisHealper.backSqlSession(sqlSession);
}
@Test
public void listEmpByJobAndDeptTest3(){
SqlSession sqlSession = MyBatisHealper.getSqlSession();
EmpDao mapper = sqlSession.getMapper(EmpDao.class);
List<Emp> emps = mapper.listEmpByJobAndDept3("经理",30);
System.out.println(emps);
MyBatisHealper.backSqlSession(sqlSession);
}
@Test
public void listEmpByJobAndDeptTest4(){
SqlSession sqlSession = MyBatisHealper.getSqlSession();
EmpDao mapper = sqlSession.getMapper(EmpDao.class);
List listParam = new ArrayList();
listParam.add("理塘");
listParam.add(11);
List<Emp> emps = mapper.listEmpByJobAndDept4(listParam);
System.out.println(emps);
MyBatisHealper.backSqlSession(sqlSession);
}
@Test
public void listEmpSortBySalTest(){
SqlSession sqlSession = MyBatisHealper.getSqlSession();
EmpDao mapper = sqlSession.getMapper(EmpDao.class);
List<Emp> emps = mapper.listEmpSortBySal("desc");
System.out.println(emps);
MyBatisHealper.backSqlSession(sqlSession);
}
2返回值类型
resultType 标记单条数据的类型
两种形式 1 返回实体对象 查询语句使用
2 返回Integer 添加 修改 删除语句 使用
3 返回String 个别请情况 如果只想查询某个字段 或者某个字段的集合
3 常用sql语句用法
3.1查询语句
//模糊查询
List<Emp> listEmpByEname(String ename);
//sql映射
<select id="listEmpByEname" resultType="com.javasm.entity.Emp">
select * from emp where ename LIKE CONCAT('%',#{ename},'%')
</select>
注意 模糊查询的语法
//统计查询
Integer countEmp();
//sql映射
<select id="countEmp" resultType="java.lang.Integer">
select count(1) from emp
</select>
注意 统一查询的返回值
//查询单条
Emp getEmpByEmpno(Integer empno);
//sql映射
<select id="getEmpByEmpno" resultType="com.javasm.entity.Emp">
select * from emp where empno = #{empno}
</select>
单条查询基本语法
//查询多条
List<Emp> listEmpByJob(String job);
//sql映射
<select id="listEmpByJob" resultType="com.javasm.entity.Emp">
select * from emp where job = #{job}
</select>
多条查询基本语法
3.2添加语句
//普通添加
//添加用户
Integer insertEmp(Emp inputEmp);
//sql映射
<insert id="insertEmp">
insert into emp (empno,ename,job,mgr)
VALUES (#{empno},#{ename},#{job},#{mgr})
</insert>
获取自增主键 在程序中使用
//添加用户 使用自增主键 获取自增主键
Integer insertEmp2(Emp inputEmp);
//sql映射
<!-- 获取自增主键 把自增主键的值 传入主键属性 -->
<insert useGeneratedKeys="true" keyProperty="empno" id="insertEmp2">
insert into emp (ename,job,mgr) VALUES (#{ename},#{job},#{mgr})
</insert>

3.3修改语句
//修改工资
Integer updateEmp(@Param("sal") Double sal,@Param("comm")Double comm,@Param("empno")Integer empno);
//sql映射
<update id="updateEmp">
update emp set sal = #{sal},comm = #{comm} where empno = #{empno}
</update>
3.4删除语句
//删除Emp
Integer deleteEmp(Integer empno);
//sql映射
<delete id="deleteEmp">
delete from emp where empno = #{empno}
</delete>
3.5插件能适配的dao方法名规范
查询
单条查询 getXXX
多条查询 listXXX
添加 insertXXX
修改 updateXXX
删除 deleteXXX
带条件 ByXXX
带排序 OrderXXX
作业

1 通过easyCode 生成 实体类 com.javasm.entity
dao com.javasm.dao
mapper 资源根目录 mapper
如果没有建立好 会提示建立目录
2 做dept表的增删改查
查询 查询dept列表 dname模糊 loc 精确
查询dept单条 通过deptno
添加 添加一条dept数据 获取自增主键
修改 修改部门名称
删除 删除一条部门数据

浙公网安备 33010602011771号