认识MyBatis
MyBatis就是一个ORM框架(操作数据库)
MyBatis与Hibernate的区别
不同点:
(1)sql方面:mybaits通过mapper.xml维护映射结果,程序员手动编写sql相比hibernate自动生成hql(hibernate sql)更加灵活,sql调优更加容易(hibernate因为更好的封装性,开发效率提高的同时,sql语句调优要更费力,当然可以手动修改sql来优化,但是同时也会影响开发效率);hibernate的hql数据库移植性更好,体现在强壮性。hibernate在级联删除的时候效率低;数据量大, 表多的时候,基于关系操作会变得复杂。
(Hibernate:开发效率高,运行较低,完全实现ORM,可以直接通过domain生成表,
MyBatis:开发效率较低,运行高,实现一部分ORM
)
(2)缓存方面:mybatis和hibernate都可以使用第三方缓存,而hibernate相比maybatis有更好的二级缓存机制。
MyBatis自己写SQL,性能更好控制
MyBatis与JDBC的区别
JDBC要写贾琏欲执事,而mybatis对jdbc 的公共代码进行了封装
MyBatis只需要关注SQL,其它完成了封装
**#与KaTeX parse error: Expected 'EOF', got '#' at position 7: 的区别** #̲(接收普通参数,预编译,性能好…正好相反
Mybatis的基本配置
导包(核心,依赖包,数据库驱动包)
有表,有domain
核心配置文件 mybatis-config.xml
"http://mybatis.org/dtd/mybatis-3-config.dtd"><configuration> <!-- 每个环境都代表对应一个数据库连接 environments:环境(们) --> <!--引入 db.properties文件--> <properties resource="db.properties" /> <environments default="development"> <!-- 真实数据库环境【用户】 --> <environment id="development"> <transactionManager type="JDBC" /> <!--dataSource:数据源(连接池) --> <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> <mappers> <!-- 读取SQL的映射文件 --> <mapper resource="cn/itsource/domain/ProductMapper.xml" /> </mappers></configuration>
创建映射文件 XxxMapper.xml
<?xml version="1.0" encoding="UTF-8" ?> "http://mybatis.org/dtd/mybatis-3-mapper.dtd"><!-- namespace:命名空间(一个domain对应一个这个xml)
–>
select * from product where id = #{id}
完成功能
//SqlSessionFactoryBuilder -> SqlSessionFactory -> SqlSession
@Override
public Product findOne(Long id) {
try {
//1.读取核心配置文件
Reader reader = Resources.getResourceAsReader(“mybatis-config.xml”);
//2.创建一个对象:SqlSessionFactory 相当于咱们JPA:EntityManagerFactory
// SqlSessionFactoryBuilder:构造者模式
SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(reader);
//3.创建一个对象:SqlSession 相当于当前JPA:EntityManager
SqlSession session = factory.openSession();
//4.session操作数据库(读取数据)
/**
* 方式中有两个值:
* 第一个值(statement):找SQL的字符串
*/
Product product = session.selectOne(“cn.itsource.domain.ProductMapper.findOne”,id);
return product;
} catch (Exception e) { //注意,不要用IO异常(很多错看不出来)
e.printStackTrace();
}
return null;
}
MyBatisCRUD
MyBatisUtil
public class MyBatisUtil {
private MyBatisUtil(){}
private static SqlSessionFactory sessionFactory;
//在静态代码块中创建SqlSessionFactory对象
static {
try {
sessionFactory = new SqlSessionFactoryBuilder().build(Resources.getResourceAsReader("mybatis-config.xml"));
} catch (Exception e) {
e.printStackTrace();
}
}
//返回SqlSession对象
public static SqlSession openSession(){
return sessionFactory.openSession();
}
}
CRUD的关键代码
session.insert(“cn.itsource.domain.ProductMapper.save”, product);
session.update(“cn.itsource.domain.ProductMapper.update”, product);
session.delete(“cn.itsource.domain.ProductMapper.delete”,id);
Product product = session.selectOne(“cn.itsource.domain.ProductMapper.findOne”,id);
List products = session.selectList(“cn.itsource.domain.ProductMapper.findAll”);
增删改需要提交事务
注意点与细节
添加时需要id
useGeneratedKeys:是否要返回id
keyColumn:数据库中的主键对应的列
keyProperty:domain中对应的主键属性
id返回到传过来的对象中
…
别名
内置别名(文档中有)
自定义别名 mybatis-config.xml
别名不区别大小写
注意它的配置顺序(如果配置错误会有提示)
<!-- 配置一个别名(不区分大小写) -->
<!--<typeAlias type="cn.itsource.domain.Product" alias="product" />-->
<package name="cn.itsource.domain" /></typeAliases>
日志管理
在资源根目录创建:log4j.properties
#log4j.properties(日志文件:)# ERROR错误的日志 WARN:警告 INFO:普通信息 DEBUG:调试日志 TRACE:日志
log4j.rootLogger=ERROR, stdout#log4j.rootLogger=NONE#把左边包名改成你自己的包名
log4j.logger.cn.itsource=TRACE
日志打印到控制台中
log4j.appender.stdout=org.apache.log4j.ConsoleAppender# 日志打印的一种格式(可以灵活地指定布局模式)
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout# 日志打印的格式是什么样子的 %d:日期 %p:优先级 %c:类的全名 %m:输出的结果 %n:换行
log4j.appender.stdout.layout.ConversionPattern=%d %p [%c] - %m%n
列名与属性名不一致
添加与修改在相应位置修改名称即可
查询需要创建一个resultMap
使用的时候返回结果必需是resultMap
<!--如果是主键不一致,使用id这个标签-->
<id column="id" property="id" />
<!--
result:某一个属性的映射
column:列名(表中) property:属性名(对象中)
-->
<result column="dir_id" property="dirId" /></resultMap>
select * from product</select>