- 一.概述
- 二.创建MyBatis程序
- 2.1 搭建环境
- (1)创建数据库
- (2)创建maven项目
- 2.2 创建模块
- (1)编写核心配置文件
- (2)编写工具类
- 2.3 编程
- (1)实体类
- (2)Mapper接口
- (3)Mapper配置文件
- 2.4 测试
- 2.5 补充
- (1)作用域问题
- (2)项目结构
- 三.增删改查
- 3.1 select
- 3.2 增删改
- 3.3 拓展
- (1)使用map代替实体类
- (2)模糊查询
- (3)Limit实现分页
- 3.4 结果集映射ResultMap
- 四.配置解析
- 4.0 配置文件
- 4.1 环境配置
- 4.2 属性优化
- 4.3 别名优化
- 4.4 设置
- 4.5 映射器
- 五.日志工厂
- 5.1 STDOUT_LOGGING(标准)
- 5.2 LOG4J
MyBatis 是一个 Maven 项目
- 是基于Java的持久层框架
- 简单化 SQL,可定制
- 避免几乎所有的 JDBC
- 可使用简单的 XML、注解、接口为数据库中的记录
【下载】
Maven仓库org.mybatis mybatis 3.5.7 gitHab : https://github.com/mybatis/mybatis-3
中文文档 : https://mybatis.org/mybatis-3/zh/index.html
特点:解除sql与程序代码的耦合(sql写在xml配置文件中)
二.创建MyBatis程序思路:搭建环境 > 导入MyBatis > 编程 > 测试
2.1 搭建环境 (1)创建数据库 (2)创建maven项目[父项目中]导入依赖
mysql mysql-connector-java 8.0.27 org.mybatis mybatis 3.5.7 junit junit 4.13.2
注:需要配置xml文件打包
2.2 创建模块 (1)编写核心配置文件src/main/java ***
文件名 mybatis-config.xml (用于连接数据库)
(2)编写工具类
public class MyBatis {
//==== 1.构建 sqlSessionFactory 对象
private static SqlSessionFactory sqlSessionFactory;
static {
try {
String resource = "mybatis-config.xml";
InputStream inputStream = Resources.getResourceAsStream(resource);
sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
} catch (IOException e) {
e.printStackTrace();
}
}
//==== 2.从 SqlSessionFactory 中获取 SqlSession
public static SqlSession getSqlSession(){
return sqlSessionFactory.openSession();//输入参数true则每次事务完成自动提交
}
}
2.3 编程
(1)实体类
(属性私有,get/set)略…
(2)Mapper接口import com.zheng.pojo.User;
import java.util.List;
public interface UserMapper {
List getUserList();
}
(3)Mapper配置文件
映射的sql语句(在一个 XML 映射文件中,可以定义无数个映射语句)
2.4 测试
public class UserDaoTest {
@Test
public void test(){
//1.获取sqlSession对象
SqlSession sqlSession = MyBatis.getSqlSession();
try{
//2.执行SQL
//获取 UserMapper 接口对象
UserMapper mapper = sqlSession.getMapper(UserMapper.class);
List userList = mapper.getUserList();
for (User user : userList) {
System.out.println(user);
}
}
finally {
//3.关闭SqlSession
sqlSession.close();
}
}
}
2.5 补充
(1)作用域问题
SqlSessionFactoryBuilder 工厂创建者
这个类用于获取sqlSessionFactory,之后没有作用。可当做局部变量,需要时才创建。
sqlSessionFactory 数据库连接池
一旦被创建就一直存在,不能丢弃和重建。最佳作用域是应用作用域。
SqlSession
每个线程都有自己的 SqlSession 实例,不能共享。最佳作用域是方法作用域,请求时打开一个sqlSession,返回响应后必须关闭。
不能将其放在静态域或实例变量。
注:【SqlSessionFactoryBuilder】 是工厂创建者,创建完成后便不再需要。【sqlSessionFactory】 是数据库连接池,全局只需要一个连接池即可,所有作用域应该是最高,并且中途不能删除或新建。【SqlSession】 是线程池中取出的一个实例,每次连接完成后需要关闭,才能将分出去的连接还到连接池中,避免占用。
(2)项目结构 三.增删改查 3.1 select【属性】
-
id:对应 namespace 中的方法名;
-
resultType:sql语句执行的返回值类型;
-
parameterType:参数类型;
【例】
//在接口中添加此方法 //根据id查询用户 User getUserById(int id);
3.2 增删改
注:增删改执行结束需要提交事务,sqlSession.commit();
@Test
public void test04(){
SqlSession sqlSession = MyBatis.getSqlSession();
try{
UserMapper mapper = sqlSession.getMapper(UserMapper.class);
int i = mapper.updataUser(new User(111, "李某迪", "123321"));
System.out.println(i>0?"成功":"失败");
sqlSession.commit();//提交事务
}
finally {
sqlSession.close();
}
}
【例】
//插入数据 int addUser(User u); //修改数据 int updataUser(User u); //删除数据 int deletetUser(int id);
3.3 拓展 (1)使用map代替实体类insert into user values(#{id},#{name},#{pass}) update user set pass=#{pass} where id=#{id} delete from user where id=#{id}
当实体类对象较大时,为了方便传递多个参数,可用map。一般用于条件查询
接口和配置
//万能map int addMapUser(Mapmap);
insert into user values(#{uid},#{uname},#{upass})
测试类
SqlSession sqlSession = MyBatis.getSqlSession(); UserMapper mapper = sqlSession.getMapper(UserMapper.class); Map(2)模糊查询map = new HashMap (); map.put("uid",123); map.put("uname","李某迪"); map.put("upass","123456"); mapper.addMapUser(map); sqlSession.commit(); sqlSession.close();
SqlSession sqlSession = MyBatis.getSqlSession(); UserMapper mapper = sqlSession.getMapper(UserMapper.class); List(3)Limit实现分页userLike = mapper.getUserLike("李%"); //使用方法二只需要传mapper.getUserLike("李"); for (User user : userLike) { System.out.println(user); } sqlSession.close();
核心是SQL实现,map实现传参
ListgetUserLimit(Map map);
HashMap3.4 结果集映射ResultMapmap = new HashMap (); map.put("startIndex",2); map.put("pageSize",2); List userLimit = mapper.getUserLimit(map);
【问题】:解决属性名和字段名不一致的问题
例如:当数据库表字段分别为id、name、passworld,而实体类为 id、name、pass时
查询结果如下:
解决方法:
四.配置解析 4.0 配置文件
MyBatis 的配置文件包含了会深深影响 MyBatis 行为的设置和属性信息。
配置文档的顶层结构如下
4.1 环境配置configuration(核心配置)
- properties(属性)
- settings(设置)
- typeAliases(类型别名)
- environments(环境配置)
- environment(环境变量)
- transactionManager(事务管理器)
- dataSource(数据源)
- mappers(映射器)
- …(其余了解即可)
(1)多道环境
【说明】MyBatis 可以配置多种环境,即可以有多个environment。例如,开发、测试和生产环境。
但每个 SqlSessionFactory 实例只能选择一种环境。
【使用】通过environments的default属性进行切换,每一个环境对应一个id
(2)事务管理器 transactionManager
type="[JDBC|MANAGED]" 默认:JDBC
(3)数据源 dataSource:配置 JDBC 连接对象的资源
type="[UNPOOLED|POOLED|JNDI]" 默认:POOLED
4.2 属性优化通过 properties 标签实现引用配置文件
【外部文件 db.properties】
driver=com.mysql.jdbc.Driver url=jdbc:mysql://localhost:3306/mybatis?useUnicode=true&characterEncoding=utf8&useSSL=false uname=root upass=123
4.3 别名优化
如上配置,使得在任何地方都可以使用别名 Author 代替 domain.blog.Author
也可以使用 package 指定一个包名
如上配置,直接使用该包下类名作为该类地址别名,一般不可指定别名名称
思考:如果两个包中类名相同怎么办
@Alias("author") public class Author {...}使用注解为实体类起别名
常见的 Java 类型内建的类型别名
| 别名 | 映射 |
|---|---|
| _int | int |
| int | integer |
| map | Map |
| … | … |
| 设置名 | 描述 | 有效值 | 默认值 |
|---|---|---|---|
| cacheEnabled | 全局性地开启或关闭所有映射器配置文件中已配置的任何缓存。 | truefalse | true |
| lazyLoadingEnabled | 开启时,任一方法的调用都会加载该对象的所有延迟加载属性;否则,每个延迟加载属性会按需加载。懒加载 | truefalse | false |
| logImpl | 指定 MyBatis 所用日志的具体实现,未指定时将自动查找。 | LOG4JSTDOUT_LOGGING | - |
4.5 映射器
【常用写法】
即一个 mapper 标签对应一个 mapper 文件
【了解】
以上两种方法适用于一定的条件,但有以下局限
- 接口和绑定接口的Mapper文件 必须同名
- 接口和绑定接口的Mapper文件 必须在同一目录下
用于排错,代替原来的debug
5.1 STDOUT_LOGGING(标准)配置文件>设置>logImpl
- LOG4J
- STDOUT_LOGGING(标准日志输出)
具体使用哪一个日志实现,在设置中设定
5.2 LOG4J
链接:Log4j入门教程
1.配置和导包
log4j log4j 1.2.17
2.创建一个配置文件 log4j.properties
#将等级分为DEBUG的日志信息输出到console和file这两个目的地
log4j.rootLogger=DEBUG,console,file
#控制台输出的相关设置
log4j.appender.console = org.apache.log4j.ConsoleAppender
log4j.appender.console.Target = System.out
log4j.appender.console.Threshold = DEBUG
log4j.appender.console.layout = org.apache.log4j.PatternLayout
log4j.appender.console.layout.ConversionPattern = [%c]-%m%n
#文件输出的相关设置
log4j.appender.file = org.apache.log4j.RollingFileAppender
log4j.appender.file.File = ./log/my212Log.log
log4j.appender.file.MaxFileSize = 10mb
log4j.appender.file.Threshold = DEBUG
log4j.appender.file.layout = org.apache.log4j.PatternLayout
log4j.appender.file.layout.ConversionPattern = [%p][%d{yy-MM-dd}][%c]%m%n
#日志输出级别
log4j.logger.org.mybatis = DEBUG
log4j.logger.java.sql = DEBUG
log4j.logger.java.sql.Statement = DEBUG
log4j.logger.java.sql.ResultSet = DEBUG
log4j.logger.java.sql.PreparedStatement = DEBUG
3.log4j的使用


![javs5.1 MyBatis[创建案例,基本使用,配置,日志] javs5.1 MyBatis[创建案例,基本使用,配置,日志]](http://www.mshxw.com/aiimages/31/584678.png)
