myBatis常用的依赖有
2.创建Dao接口,定义操作数据库的相关方法 3.创建MyBatis-mapper文件(sql映射文件)再里面些sql语句org.mybatis mybatis 3.5.1 mysql mysql-connector-java 8.0.25 com.github.pagehelper pagehelper 5.1.0
sql映射文件的模板如下:
4.在Resource目录下面创建MyBatis的主配置文件//查询 select userName,passWord,age,sex from student1; //插入//更新 //删除
主配值文件需要做到 :1.连接到数据库 2.指定Mapper文件的位置
其模板如下:
5.创建SqlSession对象来执行sql语句
其创建流程如下:
String config="MyBatis.xml"; InputStream in= Resources.getResourceAsStream(config); SqlSessionFactory sqlSessionFactory=new SqlSessionFactoryBuilder().build(in); SqlSession sqlSession=sqlSessionFactory.openSession(); StudentDao studentDao=sqlSession.getMapper(StudentDao.class);
使用要求:SqlSession对象线程不安全,需要在方法内使用,在执行sql语句之前,使用openSession()获取sqlSession对象。在执行完sql语句后,需要关闭它,执行SqlSession.close(),这样保证他的使用是线程安全的
2.MyBatis代码展示(动态代理方式) 1.加入依赖(myBatis和mysql的依赖) 2.Dao接口代码public interface StudentDao {
public List selectStudent();
}
3.Mapper文件代码
4.Mybatis主配值文件代码
5.通过工具类创建SqlSession对象,来执行sql语句
public class MyBatisUtil {
private static SqlSession sqlSession=null;
//应为SqlSession对象只需要创建一次 ,所以将他放在静态代码块中
static{
String config="MyBatis.xml";
try {
InputStream in=Resources.getResourceAsStream(config);
SqlSessionFactory sqlSessionFactory=new SqlSessionFactoryBuilder().build(in);
sqlSession=sqlSessionFactory.openSession();//默认不提交事务
} catch (IOException e) {
e.printStackTrace();
}
}
public static SqlSession getSqlSession(){
return sqlSession;
}
}
6.Test来测试代码执行结果(检查代码是否写的正确)
3.MyBatis中关于参数的传递
1.一个简单的参数 : #{ 任意字符}
当sql语句中只有一个参数的时候这个占位符里面的参数可以是任意字符
例如:
select * from student where id = #{任意字符}
2.多个简单的参数传递: #{ param注解里面的名称 }
例如:在接口中定义一个方法
public Listselect(@Param("myName") String name, @Param("myAge") String Age)
那么sql语句中的占位符就为Param注解里面的别名
select * from student where name=#{myName} or age>#{myAge}
3.Java对象传递参数 : #{ java对象的属性名称 }
例如:在接口中定义一个方法
public Listselect(Student student)
那么sql语句中的占位符就必须是该对象的属性名称
select * from student where name=#{Student对象的属性名称}
4.按照位置传递参数
MyBatis3.3以前传递参数语法 : #{0} #{1}
MyBatis3.3以后传递参数语法 : #{arg0} #{arg1}
5.使用Map : #{ Map的key } 4.$和#的区别 注意: ${ } 会使用statement对象来执行sql语句 #{} 会使用PrepareStatement来执行sql语句一般情况下${ }用来替换列名 ,标名(使用时候你要确定数据的安全 , 避免sql注入)
5.封装MyBatis输出的结果 1.ResultType:指sql语句执行完成后,数据类型转换成自定义的java对象 ResultType的值可以为:
类型的全限定名称 类型的别名
2.ResultMap:自定义sql的结果和java对象属性的映射关系,更灵活的把数据库的列值赋值给指定的java对象的属性,常用在列名和java对象属性名不一致的情况下package com.zh.entity;
public class MyStudent {
private Integer stuid;
private String stuname;
private String stuemail;
private Integer stuage;
public Integer getStuid() { return stuid;}
public void setStuid(Integer stuid) { this.stuid = stuid;}
public String getStuname() {return stuname;}
public void setStuname(String stuname) { this.stuname = stuname;}
public String getEmail() { return stuemail;}
public void setEmail(String email) { this.stuemail = email;}
public Integer getStuage() {return stuage;}
public void setStuage(Integer stuage) { this.stuage = stuage;}
@Override
public String toString() {
return "myStudent{" +
"stuid=" + stuid +
", stuname='" + stuname + ''' +
", email='" + stuemail + ''' +
", stuage=" + stuage +
'}';
}
}
方法1: 在Mapper文件中使用reslutMap标签
select id,name,email,age from student
方法2:在sql语句中指定别名(常用)
注意:ResultType和ResultMap不能同时使用 6.动态sql(重点) 1.If标签
语法:sql语句
例如:调用方法时候传进来的参数为20,然后Test判断条件等于20后sql拼接上去
@Test
public void test(){
SqlSession sqlSession= MyBatisUtil.getSqlSession();
StudentDao studentDao=sqlSession.getMapper(StudentDao.class);
List list= studentDao.selectIf(20);
for(Student l:list){
System.out.println(l);
}
sqlSession.close();
}
2、 < where >用来包含多个< if >
语法:当多个 if 有一个成立时,< where >会自动生成一个WHERe关键字,并去掉 if 中多余的and,or等
3.foreach标签
常用在in语句中
例如:
Test代码:
@Test
public void test02(){
SqlSession sqlSession= MyBatisUtil.getSqlSession();
StudentDao studentDao=sqlSession.getMapper(StudentDao.class);
List list=new ArrayList<>();
list.add(1001);
list.add(1002);
list.add(1003);
list.add(1004);
list.add(1005);
List li=studentDao.selectForEach(list);
for(Student l:li){
System.out.println(l);
}
sqlSession.close();
}
mapper文件:
7.读取属性配置文件 MyBatis主配值文件的标签顺序:
核心配置文件中的 引入标签的顺序:
是由约束决定的 通过约束 【ctrl+鼠标左键】 可以进入 约束查看
按照约束规定的顺序书写就可以 顺序应该是:
1.
a. 标签作用:引入数据库的配置文件 文件名一般是:JDBC.properties
b. 属性值:配置文件路径(String) 由于配置文件一般放在src文件夹下 所以一般写成配置文件的名称
2.
a. settings标签:引入插件的配置文件(相对根标签 内部可以引入多个插件)
b. setting 标签:引入单个插件的配置文件 在settings 标签内部 可以有多个
b1. name 属性:自行百度 很多属性 根据需求查找
b2. value 属性:自行百度 很多属性 根据需求查找
3.
a.typeAliases 标签 : 这里是对映射配置文件中的 resultType和 parameterType 起别名,为了使用便捷【相对根标签、起别名是对于自定义的javaBean类】
b.typeAlias 标签: 对于单个javaBean类 起别名
b1.type属性:从src包开始的javaBean类的路径
b2.alias属性:起的别名【一般是以类名为别名 首字母小写】
c.package 标签: 因为一般情况 我们会把所有的javaBean类 都放到bean这个包下 ,所以这里提供的这个标签是对一个包下所有的javaBean类起别名
c.name属性:从src包开始的bean包的路径
-----------------------中间间隔-----[暂时还没有配置的标签]-----------------------------
4.typeHandlers
5.objectFactory
6.objectWrapperFactory
7.reflectorFactory
----------------------中间间隔------[暂时还没有配置的标签]-----------------------------
8.
a.plugins标签:配置插件的相对根标签 由于可能会配置多个插件 所以需要plugins根标签包裹
b.plugin标签:配置单个插件的标签
b1. interceptor属性:值为需要配置的插件的路径
配置分页功能的属性值为:com.github.pagehelper.PageInterceptor 固定路径【lib直接在src下】
9.
........
........
a. environments标签:用来引入数据库环境的配置单元根标签【可包含多个】
a1. default 属性:与 environment中的id属性相对应 使用哪个environment中的id属性 就代表使用哪个配置
b. environment 标签:单个数据库环境引入的根标签
b1. id属性:每一个属性的唯一标识 通过id属性的值 来找到使用的是哪个配置
c. transactionManager标签:确定事务管理模式的标签
c1. type属性:确定使用哪个事务管理模式 一共两个值:
JDBC:正常的commit和rollback 方式
MANAGE:百度查具体是什么意思
d. dataSource 标签:规定使用何种数据源的标签(连接池,第三方容器等等)【相对根标签】
d1. type属性:具体确定数据源使用何种模式配置 一共三个值:
UNPOOLED:百度查含义
POOLED:使用连接池
JNDI:其他框架提供的容器
e. property 标签:配置数据源的单个配置标签 【其实就是JDBC所需要的的配置 包含:驱动配置,数据库地址,登录账号,密码等等】
e1.name:与JDBC的配置文件中的key一一对应 每个key对应一条property 标签语句
e2.value:底层获取 JDBC配置文件 对应key的值 格式是: ${变量名} 变量名为了代码的可读性一般和key是一样的
-----------------------中间间隔-----[暂时还没有配置的标签]-----------------------------
10.databaseIdProvider
-----------------------中间间隔-----[暂时还没有配置的标签]-----------------------------
11.【基于配置文件sql语句来实现 使用这个Mappers标签中的格式】
a. mappers标签 :引入映射文件(sql语句的配置文件)的根标签
b. mapper标签:mapper标签 一次有且只能有一个 使用哪一个Mapper接口 就配置哪个相对应的Mapper
resource:引入单个映射文件的标识:与每一个映射文件自定义文件名相同【需要加后缀】
11. 【基于注解配置sql语句 使用这个Mappers标签中的格式】
a.mappers标签:解释同上
package属性:值是 你的数据访问层的哪个接口所在的是哪个包 需要注意的是:这里是包路径而不是文件路径 而且包路径可以不用那么精确
比如 准确包路径是: com.xxx.mapper 写成 com.xxx也可以 写成 com也可以【底层通过遍历找到】
怎么引入属性配置文件:
8.sql映射读取 方法一:指定多个mapper文件 方法二:使用包名
name:mapper文件所在的包名,包中所有xml一次性加载,要求:
1、mapper文件名需要和接口名一样
2、mapper文件和dao接口在同一目录下
实例如下
9.Sql片段
mapper文件中定义一个
sql片段的语句
怎么使用这个sql片段呢
目的:避免些重复的代码,减轻工作量
例如:mapper文件中这么写
id,name,email,age
10.分页查询
步骤 :
1.加入pageHelper依赖2.在主配值文件中配置插件com.github.pagehelper pagehelper 5.1.0
3.Test代码中加入一行 PageHelper.startPage(pageNum,pageSize);
@Test
public void test04(){
SqlSession sqlSession= MyBatisUtil.getSqlSession();
StudentDao studentDao=sqlSession.getMapper(StudentDao.class);
//分页查询的代码
PageHelper.startPage(1,3);
List li=studentDao.selectPage();
for(Student l:li){
System.out.println(l);
}
sqlSession.close();
}
就可以自动完成分页查询了



