框架是一种经过校验、具有一定功能的半成品软件品,已经对基础的代码进行了封装并提供相应的API,开发者在使用框架是直接调用封装好的api可以省去很多代码编写,从而提高工作效率和开发速度。
MyBatis 是支持普通 SQL 查询,存储过程和高级映射的优秀==ORM框架==。MyBatis 消除了几乎所有的 JDBC 代码和参数的手工设置以及对结果集的检索封装。MyBatis 可以使用简单的 XML 或注解用于配置和原始映射,将接口和 Java 的 POJO(Plain Old Java Objects,普通的 Java 对象)映射成数据库中的记录. 半自动化框架。必须写sql语句。
mybatis可以向PreparedStatement中输入参数自动进行输入映射,将查询结果集灵活的映射成Java对象(输出映射),输入映射和输出映射这是mybatis的核心
用一句话来说, mybatis就是封装与数据库交互的半成品。
准备条件就是需要先建一个数据
create database mybatis;
use mybatis;
CREATE TABLE users(id INT PRIMARY KEY AUTO_INCREMENT, NAME
VARCHAR(20), age INT);
INSERT INTO users(NAME, age) VALUES('Tom', 12);
INSERT INTO users(NAME, age) VALUES('Jack', 11);
(1)创建一个maven的java工程
(2)引入mybatis的jar包和 mysql的驱动jar包
(3)创建相应的实体类
(4)配置mybatis的配置文件---mybatis会读取该文件的内容完成连接数据库的功能
(5)编写相应的映射(mapper)文件 -----sql语句 实体类与表的映射
(6)把映射文件引入到mybatis配置文件中
(7)测试是否成功
(8)CRUD操作 (增删改查)测试
(1)定义一个相关的Dao接口
(2)映射文件(mapper)
注意: namespace必须和接口所在的路径对应。id必须和方法名一致
(3)测试
图中非注释区域对应的是自定义参数名 @Param("参数名")
(1)常见的特殊字符
(2)解决方式有两种
①是转义字符,如上图所示
②是使用
(1)引入db属性文件。
①定义一个数据库属性文件 . properties
②在mybatis配置文件中引入属性文件并使用相应的key
(2)引入日志文件 ——更好的显示sql语句
①引入日志jar包
②引入日志的配置文件 log4j.properties
输出到日志文件
### 输出DEBUG 级别以上的日志到=E://logs/error.log ###
log4j.appender.D = org.apache.log4j.DailyRollingFileAppender
log4j.appender.D.File = D://logs/log.log
log4j.appender.D.Append = true
log4j.appender.D.Threshold = DEBUG
log4j.appender.D.layout = org.apache.log4j.PatternLayout
log4j.appender.D.layout.ConversionPattern = %-d{yyyy-MM-dd HH:mm:ss} [ %t:%r ] - [ %p ] %m%n
### 输出ERROR 级别以上的日志到=E://logs/error.log ###
log4j.appender.E = org.apache.log4j.DailyRollingFileAppender
log4j.appender.E.File =D://logs/error.log
log4j.appender.E.Append = true
log4j.appender.E.Threshold = ERROR
log4j.appender.E.layout = org.apache.log4j.PatternLayout
log4j.appender.E.layout.ConversionPattern = %-d{yyyy-MM-dd HH:mm:ss} [ %t:%r ] - [ %p ] %m%n
(3)解决列名和属性名不一致
①为查询的列起别名;让别名和属性名一致
②使用resultMap标签 来完成属性和列的映射关系
什么是事务:事务是由一系列动作组成,这些动作要么都完成,要么都不完成。
jdbc默认事务是自动提交。现在mybatis事务需要手动提交。
//转账问题
Connection connection=null;
try {
Class.forName("com.mysql.cj.jdbc.Driver");
connection= DriverManager.getConnection(
"jdbc:mysql://localhost:3306/mybatis?serverTimezone=Asia/Shanghai",
"root","root");
connection.setAutoCommit(false);
PreparedStatement ps=connection.prepareStatement("update users set age=age-10 where name='张天龙'");
ps.executeUpdate();
ps=connection.prepareStatement("update users set age=age+10 where name='汪伟宁'");
ps.executeUpdate();
//connection.commit();//提交
}catch (Exception e){
try {
connection.rollback();//回滚
} catch (SQLException throwables) {
throwables.printStackTrace();
}
e.printStackTrace();
}finally {
}
(1)多对一 ①链表查询 ②嵌套查询
column="depton" select="com.ljm.dao.DeptDao.selectById"
(2)一对多
<--链表查询-->
元素 | 作用 | 描述 |
---|---|---|
if | 条件判断 | 单条件判断 |
choose(when、otherwise) | 条件选择,相当于java when | 多条件分支判断 |
where、set | 辅助 | 处理sql拼接语句 |
foreach | 循环 | 循环 |
(1)if和where一起用
<--测试-->
@Test
public void test(){
BookDao bookDao = session.getMapper(BookDao.class);
HashMap map = new HashMap();
map.put("bookname","西游记");
map.put("author","吴承恩");
List list = bookDao.findByCondition(map);
//System.out.println(list);
}
(2)[choose when otherwise] 和where
<--测试-->
@Test
public void test1(){
BookDao bookDao = session.getMapper(BookDao.class);
HashMap map = new HashMap();
map.put("bookname","西游记");
map.put("author","吴承恩");
List list = bookDao.findByCondition(map);
//System.out.println(list);
}
(3)set标签 修改部分字段
update book_info
book_name=#{name},
book_author=#{author},
book_pub=#{pub},
book_price=#{price},
where book_id=#{id}
<--测试-->
@Test
public void testUpdate(){
BookDao bookDao = session.getMapper(BookDao.class);
Book book = new Book();
book.setAuthor("罗贯中");
book.setName("三国");
book.setId(1010);
bookDao.update(book);
session.commit();
}
(4)foreach 批量删除
delete from book_info where book_id in
#{id}
<--测试-->
@Test
public void batchDelete(){
BookDao bookDao = session.getMapper(BookDao.class);
int[] ids = {1001,1002,1003};
bookDao.batchDelete(ids);
session.commit();
}
<--测试-->
//模糊查询
@Test
public void testFindAll(){
EmpDao empDao = session.getMapper(EmpDao.class);
List list = empDao.findAll01("老");
System.out.println(list);
//session.commit();
}
(1) 引入相关的pageHelper依赖 pom
com.github.pagehelper
pagehelper
5.1.11
(2) 加入拦截 mybatis
(3)测试
//测试分页
@Test
public void testFindAll1(){
EmpDao empDao = session.getMapper(EmpDao.class);
//使用分页功能
PageHelper.startPage(2,8);
List list = empDao.findAll01("老");
//可以把查询的结果封装到PageInfo类中,包含总条数
//PageInfo pageInfo = new PageInfo(list);
//System.out.println("总数:"+pageInfo.getTotal());
System.out.println(list);
}