目录
6.在mapper映射中取值的问题:#{id} 与 ${id}
7.参数的传递:Long Domain,Domain和map的转换
1.相关概念
MyBatis:是一个ORM的数据库持久化框架
是针对数据库交互的一个辅助框架,
数据库持久化:数据持久化是将内存中的数据模型转换为储存模型
常见的有磁盘持久化和数据库持久化,也是对jdbc做了简单的封装,
以xml配置代替java代码来管理数据库的交互细节
数据库持久化就是把内存中的数据保存到数据库中
框架:特指为解决一个开放性问题而设计的的具有一定约束性的支撑结构
ORM:对象关系的映射
是为了解决面向对象与关系型数据库存在不匹配的现象的技术
2.MyBatis与Jpa区别
都是ORM的框架,都是对jdbc进行封装,目的都是为了简化对数据库的操作
不同点:
- Jpa是使用全映射,不需要我们写sql语句
- MyBatis是半映射,需要写sql语句
- MyBatis的性能要高于jpa
3.MyBatis入门:
做domian和数据库表的映射
- domian
- 数据库对应的表
- Dao:接口和实现出来
- 导入jar包:MyBatis的核心包和依赖包与musql的驱动包
- 测试
mybatis的测试:
dao层:接口声明(搞定)===>接口实现:调用sql语句
sql文件:xml中写,这个文件放在和接口同一层目录;
xml的名字:DomainMapper.xml
注意更改:更改jia包依赖的配置
4.抽取工具类
通过我们的演示:
我们需要抽取一个获取SqlSession的工具类:
//通过配置文件获取的:我们应该保证只有一个
static SqlSessionFactory sessionFactory=null;
static {
//读取配置文件,通过SqlSessionFactoryBuilder构建SqlSessionFactory
//1:通过配置文件获取到一个Reader
String resource="mybatis-config.xml";
Reader reader = null;
try {
reader = Resources.getResourceAsReader(resource);
//2:SqlSessionFactoryBuilder==>SqlSessionFactory构造者
SqlSessionFactoryBuilder factoryBuilder = new SqlSessionFactoryBuilder();
//3:获取到一个SqlSessionFactory对象
sessionFactory = factoryBuilder.build(reader);
} catch (IOException e) {
e.printStackTrace();
}}
/**
* 获取一个SqlSession
* @return
*/
public static SqlSession getSqlSession(){
return sessionFactory.openSession();
}
SqlSessionFactoryBuilder:用来构建SqlSessionFactory,用完就完了
SqlSessionFactory:用来获取SqlSession,应该是一个应用期间只有一个,线程安全的,重.
SqlSession:线程不安全,每一个方法都应该获取一个,用完了记得关闭.
5.MyBatis使用细节
1.保存数据后获取主键值
useGeneratedKeys="true" 开关打开
keyColumn="id" 表示数据库设计表的存主键的那个列名(可以省略)
keyProperty="id" 表示domain中用于存id的属性名
2.MyBatis查看sql的日志
需要使用log4j日志框架
-
导包--->log4j
-
配置文件log4j.properties
log4j.rootLogger=ERROR, stdout
#log4j.rootLogger=NONE
log4j.logger.cn.itsource=TRACE
//cn.itsource:一定要根据自己的包名情况进行修改
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern=%d %p [%c] - %m%n
/**
debug:调试级别
info: 提示级别
warnnig: 警告级别
error:错误级别
开发时用debug,上线时使用warnnig,error
**/
3.测试
4.datasource的配置信息单独提出到一个配置文件
<!--引入jdbc.properties配置文件,这个有顺序的-->
<properties resource="jdbc.properties"></properties>
5.别名
很多时候,我们使用全限定名,太长了,用一个短点别名代替.
1.内置别名
mybatis已经做好的配置:规律:级别都是大写变小写,
具体看文档的那张表(基本数据类型加_)
2.自定义别名
a:定义一个别名==>核心配置文件
b:使用别名:
<typeAliases>
<!--以包的形式定义:这个包下的所有的类都默认使用简单类名做别名-->
<package name="cn.itsource.mybatis.domain"></package>
<!--
把cn.itsource.mybatis.domain.Product娶一个别名:Product
alias:可以省略,不写.默认就是这个类名的简单名字:首字母大写小写都可以,
但是建议大写.
<typeAlias type="cn.itsource.mybatis.domain.Product"
></typeAlias> -->
</typeAliases>
6.在mapper映射中取值的问题:#{id} 与 ${id}
select * from product where id = #{id}
#:会编译成一个占位符:?
如果只有一个参数,取值的时候随便写#{id} 或者#{suibian};
如果只有多个参数,取值的时候不能随便写,写getter属性
$:直接是拼接:
select * from product where id =${id}
7.参数的传递:Long Domain,Domain和map的转换
为什么要用map替代domain:
登录:
User
前台传入用户名和密码:
select * from t_user where name="xxx" and pwd ="xxx"