mybatis_day01
Mybatis01
1.什么是mybatis
1.1mybatis
一个基于Java的持久层框架
1.2持久层
操作数据库那层代码
项目分层:
界面层(jps/controller) 业务层(service层) 持久层(数据层 dao层)
持久层框架:jdbc jpa springjdbc springdatajps mybatis
1.3框架
1. 每个框架都是为了解决某一领域的问题而产生的。
2. 框架都是一个半成品,已经完成衣服分功能,只需要再上面进行开发----提高了开发效率
3. 可以让我们很多人写的代码都按照一定规则去写--可读性 维护性(orm规范)
1.4持久化概念
把内存里面的数据保存到数据库中--这个过程就叫做持久化
1.5mybatis它是一个持久层框架,同时有个ORM的框架
ORM:对象映射关系---jpa/springdatajpa
2.mybatis的特点
2.1mybatis是一个支持普通SQL查询,存储过程和高级映射的优秀持久层框架
2.2mybatis消除了几乎所有的JDBC代码和手工设置参数以及结果集的检索
2.3mybatis使用简单的xml或注解 用于配置和原始映射,将接口和Java的pojos(普通的java对象)映射成数据库中的记录。
3.使用Mybatis
3.1创建项目并导入jar包

3.2写配置文件
Mybatis-config.xml
<?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>
<!-- 开发环境-->
<environments default="development">
<!--
一个环境 id:为这个环境取唯一一个id名称
-->
<environment id="development">
<!--
事务管理 type:JDBC(支持事务)/MANAGED(什么都不做)
mysql: innodb MyISAM
-->
<transactionManager type="JDBC" />
<!-- 数据源, 连接池 type(POOLED):MyBatis自带的连接池 -->
<dataSource type="POOLED">
<!-- 连接数据库的参数 四大金刚 -->
<property name="driver" value="com.mysql.jdbc.Driver" />
<property name="url" value="jdbc:mysql:///mybatis" />
<property name="username" value="root" />
<property name="password" value="123456" />
</dataSource>
</environment>
</environments>
<!-- 这个mappers代表的是相应的ORM映射文件 -->
<mappers>
<mapper resource="cn/itsource/mybatis/domain/ProductMapper.xml" />
</mappers>
</configuration>
productMapper.xml
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<!-- mapper映射配置 namespace:命名空间
以后:通过namespace+id 调用对应的语句
-->
<mapper namespace="cn.itsource.mybatis.domain.ProductMapper">
<!--
select:表示查询标签
id: 代表给标签取个名称 必须唯一
resultType:返回值类型
-->
<select id="findAll" resultType="cn.itsource.mybatis.domain.Product">
select * from product
</select>
</mapper>
3.3测试。。
4.mybatis的crud
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<!-- mapper映射配置 namespace:命名空间
以后:通过namespace+id 调用对应的语句
-->
<mapper namespace="cn.itsource.mybatis.domain.ProductMapper">
<!--
select:表示查询标签
id: 代表给标签取个名称 必须唯一
resultType:返回值类型
-->
<select id="findAll" resultType="cn.itsource.mybatis.domain.Product">
select * from product
</select>
<!--新增 parameterType 参数类型-->
<insert id="save" parameterType="cn.itsource.mybatis.domain.Product">
insert into product(productName,salePrice,costPrice,cutoff)
values(#{productName},#{salePrice},#{costPrice},#{cutoff})
</insert>
<!--修改-->
<update id="update" parameterType="cn.itsource.mybatis.domain.Product">
update product set productName=#{productName},salePrice=#{salePrice}
where id=#{id}
</update>
<!--删除 long Mybatis内置别名 long java.util.Long remove(13)-->
<delete id="remove" parameterType="long">
delete from product where id=#{id}
</delete>
<!--查询一条数据-->
<select id="findOne" parameterType="long" resultType="cn.itsource.mybatis.domain.Product">
select * from product where id=#{id}
</select>
</mapper>
5.抽取工具类
enum方式
public enum MybatisUtil {
INSTANCE;
private static SqlSessionFactory sqlSessionFactory;
//静态代码块
static{
Reader reader = null;
try {
reader = Resources.getResourceAsReader("mybatis-config.xml");
//SqlSessionFactory -->EntityManagerFactory
sqlSessionFactory = new SqlSessionFactoryBuilder().build(reader);
} catch (IOException e) {
e.printStackTrace();
}
}
//抽取一个 --sqlSession
public SqlSession getSqlSession(){
return sqlSessionFactory.openSession();
}
}
6.mybatis的一些细节
6.1获取主键
有时候 保存一条数据之后,需要拿到这条数据的主键,拿到之后可以做后续事情
场景:
角色的保存
useGeneratedKeys="true" keyColumn="id" keyProperty="id"
<insert id="save" parameterType="cn.itsource.mybatis.domain.Product"
useGeneratedKeys="true" keyColumn="id" keyProperty="id">
insert into product(productName,salePrice,costPrice,cutoff)
values(#{productName},#{salePrice},#{costPrice},#{cutoff})
</insert>
6.2日志
1. 为什么要使用日志
有时候,需要打印的sql的信息 比如sql的传参数 返回值 -- 必须使用日志
好处: 使用日志框架可以帮助我们进行分析与排错
2. 常用的日志框架
slf4j(抽象标准) -->很多实现 logging,logback,log4j
3. 使用日志框架log4j
(1) 导入jar包

log4j.rootLogger=ERROR, stdout
日志等级(了解): OFF level > FATAL(致命) > ERROR(错误) > WARN (警告)>
# INFO (提示)> DEBUG (调试)> trace > ALL level(所有配置)\
#输出效果 如果你设置日志级别是trace,则大于等于这个级别的日志都会输出
# 关闭日志输出
#log4j.rootLogger=NONE 不想打印日志 就配置NONE
# WARN为一般警告,比如session丢失、
# INFO为一般要显示的信息,比如登录登出、
# DEBUG为程序的调试信息
# TRACE 堆栈信息
# 扫描包 配置自己包
#注意点 包名/配置等级 配置DEBUG/ALL
log4j.logger.cn.itsource=DEBUG/TRACE
#ConsoleAppender:输出控制台
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
#layout: 格式样式
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
#采用下面的样式输出 [20191224]类名
log4j.appender.stdout.layout.ConversionPattern=%d %p [%c] - %m%n
7.动态sql
高级查询
<sql id="whereSql">
<where>
<if test="productName != null">
and productName = #{productName}
</if>
<if test="id != null">
and id = #{id}
</if>
</where>
</sql>
<select id="queryByCondition" parameterType="cn.itsource.mybatis.query.ProductQuery"
resultType="cn.itsource.mybatis.domain.Product">
select * from product
<include refid="whereSql"></include>
</select>
mybatis_day01的更多相关文章
- 阶段3 1.Mybatis_02.Mybatis入门案例_1.mybatis的入门
H:\BaiDu\黑马传智JavaEE57期 2019最新基础+就业+在职加薪\讲义+笔记+资料\主流框架\31.会员版(2.0)-就业课(2.0)-Mybatis\mybatis\mybatis_d ...
随机推荐
- mybatis 源码分析中的知识点
1. resultMap 和 resultType 之间的优劣 resultMap: 在联合查询的时候, 可以不用写Join (因为在resultMap 的定义里面已经写了这些东西了<asso ...
- Java之路——初识Eclipse
零.大纲 一.前言 二.获取Eclipse 三.运行Eclipse 四.创建及运行第一个Java Project 五.界面介绍 六.如何调试 七.获取插件 八.Eclipse 快捷键 九.总结 一.前 ...
- 《Android Studio实战 快速、高效地构建Android应用》--三、重构代码
要成为高效的Android程序员,需要头脑灵活,能够在开发.调试和测试的过程中重构代码,重构代码最大的风险是可能会引入意外的错误,Android Studio通过分析某些具有危险性的重构操作来降低风险 ...
- Rust学习笔记一 数据类型
写在前面 我也不是什么特别厉害的大牛,学历也很低,只是对一些新语言比较感兴趣,接触过的语言不算多也不算少,大部分也都浅尝辄止,所以理解上可能会有一些偏差. 自学了Java.Kotlin.Python. ...
- 【Pycharm使用者必看】自定义【光标快速定位到行尾】的按键
1.问题描述 使用Pycharm写代码时,有很多比较方便的快捷键,比如:Shift+Enter快速切换到下一行, 但每次切换到多个括号外或者想移动到行尾,就必须按 End 键或者鼠标点击, 这样操作幅 ...
- re模块 findall()详解
1. findall() 函数的2种表示形式 import re kk = re.compile(r'\d+') kk.findall('one1two2three3four4') #[1,2,3,4 ...
- 解决Python2.7的UnicodeEncodeError: 'ascii' codec can't encode异常错误
UnicodeEncodeError: 'ascii' codec can't encode characters in position 0-2: ordinal not in range(128) ...
- 杭电-------2047阿牛的eof牛肉串(C语言写)
/* 主要看最后一个是否为O,若为O,则倒数第二个不能为O,则为a[n-2]*1*2; 若不为O,则最后一个有两个选择则为a[n-1]*2 */ #include<stdio.h> ] = ...
- Gridview的stretchMode等属性详解
<GridView android:id="@+id/grid"android:layout_width="fill_parent"android:lay ...
- 内部类(innerclasses)
一般情况下,我们把类定义成独立的单元.有些情况下,我们把一个类放在另一个类的内部定义为内部类. 内部类的作用: 1.内部类提供了更好的封装.只能让外部类直接访问,不允许同一个包中的其他类直接访问. 2 ...