这是作者一天的学习整理 希望多多鼓励!!
直接让你学完即可上手MyBatis!
一、概念
三层架构
-
界面层 和用户打交道 显示处理结果
-
业务逻辑层 接收界面层的数据 处理业务调用数据库
-
数据访问层 访问数据库 对数据增删改查
框架
-
是一个软件
-
不是全能的 针对一个领域
JDBC的缺陷
重复的代码多 开发效率低
MayBatis框架
sql映射:把表中的数据映射成一个对象 操作对象 就是操作数据
数据访问:对数据增删改查
总结:增强版的JDBC 集中写SQL语句 不必关心JDBC各种繁琐的操作
二、入门案例使用
1. 下载MyBatis 配置环境
2.整理模块 添加资源目录
3.添加依赖 重新加载项目
<!--mybatis依赖-->
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.5.7</version>
</dependency>
<!--mysql驱动-->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.23</version>
</dependency>
<!-- pom.xml下的build中加入 -->
<resources>
<resource>
<directory>src/main/java</directory>
<includes>
<include>**/*.properties</include>
<include>**/*.xml</include>
</includes>
<filtering>false</filtering>
</resource>
</resources>
4.domain创建实体类bean
数据库列名与属性名一致【保存表中一行数据】
5.do创建接口
接口名=实体类名+Dao
定义操作数据库的方法
5. 创建配置文件
sql映射文件.xml 【写sql语句的 一个表一个】
在接口目录中
文件名和接口名一致
<?xml version="1.0" encoding="UTF-8" ?>
<!-- mybatis-3-mapper.dtd:约束文件名称
检查当前文件的格式是否符合mybatis的要求
-->
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<!-- mapper:当前文件的根标签
namespace:命名空间 要求dao接口的全限定名称 -->
<mapper namespace="">
<!-- id:赋值接口中的方法名称
resultType:得到的类的全限定名称 -->
<select id="" resultType="">
select from
</select>
</mapper>
6. 创建主配置文件
主要定义数据库的信息 sql文件的位置
<?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>
<!-- 日志 -->
<settings>
<setting name="logImpl" value="STDOUT_LOGGING"/>
</settings>
<!--环境配置 数据库的连接信息 default 指定id的数据库-->
<environments default="sql">
<!--一个数据库的信息配置 id:唯一值 环境的名称-->
<environment id="sql">
<!-- type myBatis的事物类型-->
<transactionManager type="JDBC"/>
<!--type 数据源的类型-->
<dataSource type="POOLED">
<property name="driver" value="com.mysql.jdbc.Driver"/>
<property name="url" value="jdbc:mysql://localhost:3306/mybatis"/>
<property name="username" value="root"/>
<property name="password" value="root"/>
</dataSource>
</environment>
</environments>
<!-- mappers:sql映射文件的位置
mapper:指定一个文件的位置 类路径开始的路径 classpath
-->
<mappers>
<mapper resource="com/baidu/Dao/StudentDao.xml"/>
</mappers>
</configuration>
7.测试
SqlSession session = MyBatisUtil.getSqlSession();
StudentDao studentDao = session.getMapper(StudentDao.class);
List<Student> list = studentDao.sel();
for(Student student:list){
System.out.println(student);
}
session.close();
//注意:MyBatis框架 提交
//session = factory.openSession(true);
//session.commit();
8.工具类
private static SqlSessionFactory factory = null;
static{
try {
InputStream in = Resources.getResourceAsStream("mybatis.xml");
factory = new SqlSessionFactoryBuilder().build(in);
} catch (IOException e) {
e.printStackTrace();
}
}
public static SqlSession getSqlSession(){
SqlSession session = null;
if(factory != null){
session = factory.openSession();
}
return session;
}
三、传参
将java代码的数据(接口中方法的形参)传入sql映射文件的sql语句中
1. 一个简单类型
#{任意字符}
2. 多个参数 @param
//接口中的方法
public xxx xxxx(@param("oo") xxx xxx){}
//sql映射文件
select xxx,xxx from xxx where xxx = #{oo}
3. 多个传参-对象传参
#{属性名}
4. Map传参 #{key}
//接口方法
public xxx xxxx(Map<String,Object> xxx){}
//测试
Map<String,Object> xxx = new HashMap();
xxx.put("name","张三")
xxx.put("age",20)
5.# 和 $区别
'#'防止注入
'$'允许注入 可以代替表名 列名
四、封装MyBatis输出结果
1. resultType 输出结果
返回对象:
1. 执行sql语句 调用无参构造方法,创建对象
2. 列名赋值给同名属性
返回基本类型 建议全限定名称
-
返回Map Key就是列名 value就是列值
一次只能返回一行记录 多了报错
2.自定义类型的别名
-
别名
-
包名
//在主配置文件 上面定义
<typeAliases>
<typeAlias type="全限定名称" alias="别名"/>
</typeAliases>
<typeAliases>
//使用包名 类名就是别名
<package name="com.baidu.doMain" />
</typeAliases>
//在resultType属性使用别名
<select id="sel" resultType="别名">
select id,name,email,age from student
</select>
3. 列名属性名不一致 赋值
-
resultMap:结果映射 推荐
自定义列名赋值给那个属性
<resultMap id="studentMap" type="com.baidu.doMain.Student">
<!-- 列给属性-->
<!-- 主键对应-->
<id column="" property=""/>
<!-- 非主键对应-->
<result column="" property=""/>
</resultMap>
//在resultMap属性使用别名
<select id="sel" resultMap="studentMap">
select id,name,email,age from student
</select>
-
使用resultType解决列名属性名不一致 as
//在resultMap属性使用别名
<select id="sel" resultType="com.baidu.Student">
select idd id,namee name,emaill emaill,agee age from student
</select>
like模糊查询
-
输入 String 字符串"%xx%" 整个输入
-
在sql语句内输入"%"要加双引号
五、动态sql
1. if where foreach
sql语句是变化的 可以根据条件获取不同的sql语句
主要是where部分变化
实现:是使用MyBatis提供的标签
<if>
<if test = "判断java对象的属性值">
//slq语句
</if>
//会自动添加一个where
//可以包含多个if并去掉多余and or
<where>
<where>
//多个if
</where>
//循环数组和集合 主要用在in
<foreach>
<foreach collection = "变量名"
item = "自定义变量名"
open="(" close=")"
separator=",">
#{自定义变量名 如果是对象的属性加.}
</foreach>
2. sql代码片段
就是代码复用
//定义
<sql id = "自定义名">
//sql语句
</sql>
//使用
<include refid = "自定义名">
六、配置文件
1. 数据库属性配置文件
-
把数据库连接信息和主配置文件分开
-
便于修改、保存、处理数据库的信息
-
propertises文件放在资源目录下 resources
-
使用格式 xxx=xxx 比如 jdbc.mysql.driver = xxx
//主配置文件中指定路径
<properties resource = "xxxx.properties">
//使用格式 ${xxx}
2. 指定多个slq映射文件
//多写
<mappers>
<mapper resource = "sql映射文件路径位置"/>
<mapper resource = "sql映射文件路径位置"/>
</mappers>
//使用包名
//要求:1。映射文件名和接口名一致
// 2.映射文件名和接口名同一个目录
<mappers>
<package name = "包名"/>
</mappers>
七、扩展
1. 分页PageHelper使用
//加入依赖
<dependency>
<groupId>com.github.pagehelper</groupId>
<artifactId>pagehelper</artifactId>
<version>5.1.10</version>
</dependency>
//在主配置文件中 数据库信息上 插入插件
<plugins>
<plugin interceptor = "com.github">
</plugins>
//方法使用
PageHelper.startPage(第几页,一页几个);