# 数据查询语言

// 修改为主键
alter table tb_name modify id int auto_increment primary key


DQL:数据查询语言 		例如:SELECT语句。(一般不会单独归于一类,因为只有一个语句)。
DML :数据管理语言		例如:INSERT(插入)、UPDATE(修改)、DELETE(删除)语句。
DCL:数据控制语言		例如:GRANT、REVOKE等语句。
DDL:数据定义语言		例如:CREATE、DROP、ALTER等语句。
TCL:事务控制语言 		例如:COMMIT、ROLLBACK等语句。

C: Create
R: Read
U: Update
D:Delete

# 基本数据类型

输入参数:parameter

# 1. 八个基本类型 + string

#{任意值}
$

# 2. 对象类型
#{属性名}
${属性名}
#{} 自动给 String 类型加上‘’(自动类型转换)     #{} 
${}原样输出,但是适合于动态排序(动态字段)     '${}' 
Map<String Object> studentmap = new map<>;

Procedure 存储过程

jabcType 数据库类型 java 类型

# 数据库的 环境切换:

a.environment配置不同的数据库环境
b.配置Provider别名
c.写不同过的SQL语句
d.在mapper.xml文件中写databaseId="Provider"  (自适应,优先使用带databaseId)

# 2. 注解方式

推荐使用 XML 方式
a. 将 sql 语句写在接口的方法上 @Select ("")
b. 将接口的全类名写入 mapper, 让 mybaits 知道你的 SQL 语句是存储在接口中的
(可以将包中的注解 接口 xml 一次性的引入)

# 3. 增删改的返回值问题

a. 返回值可以是 void integer boolean long
b. 只需要在接口中修改返回值即可

# 4. 事务自动提交

a. sqlsessionFactory.opensession () sqlsession.commit () // 手动提交
b.sqlsessionFactory.opensession (true) // 自动提交

# 5. 自增问题

a.mysql支持自增
	b.oracle同过序列模拟实现 create sequence myseq 
				increment by 1               //步长	
				start with 1; 
	序列自带两个属性:
		nextval:下一个值
		currval:当前值
	insert into student values(myseq.nextval(),................)
	<!--通过oracle的序列化模拟自增-->
	方法一:
   	 <insert id="addStudent" parameterType="com.wk.entity.Student" databaseId="oracle">
      		  <selectKey keyProperty="stuNo" resultType="Integer" order="BEFORE">
           			 select myseq.nextval from dual;
       		 </selectKey>
       		 insert into student(stuNo,stuName,stuAge,graName)
        		values (#{stuNo},#{stuName},#{stuAge},#{graName})
    	</insert>
	方法二:
	    <insert id="addStudent" parameterType="com.wk.entity.Student" databaseId="oracle">
        		<selectKey keyProperty="stuNo" resultType="Integer" order="AFTER">
            			select myseq.currval from dual;
        		</selectKey>
        		insert into student(stuNo,stuName,stuAge,graName)
        		values (myseq.nextval,#{stuName},#{stuAge},#{graName})
   	 </insert>

# 6. 参数问题:

将多个参数封装到一个 对象 中 然后使用该对象传递
	a.再mapper.xml中不用写parameterType
	<inster>
		insert into student(stuno,stuName,stuAge,graName)
		values (#{arg0},#{arg1},#{arg2},#{arg2})
	</inster>
	b.可以在 接口中 通过@Param("sNo") 指定SQL中参数的名字
	public abstract Integer addStudent (@Param("sNo") Integer stuNo),
	<inster>
		insert into student(stuno,stuName,stuAge,graName)
		values (#{sNo},.......)
	</inster>

# 7. 增加 null

oracle:如果是null 则会报 Other	而不是null 
mysql:如果是null则不会报错,没有约束
mybatis中null 是 Other 而 Mysql 可以处理,Oracle 不能处理
a.Oracle这样处理:<inster>
		 insert into student(stuno,stuName)
		 values (#{sNo},#{stuName,jdbcType=NULL})
	           </inster>
//注意标签放置的顺序
b.配置mybatis全局配置文件conf.xml
	<settings>
		<settings name = "jdbcTypeForNull" value = "NULL">
	<settings/>

# 8. 返回值为 Map

<select id="queryStudentOutByHashMap" parameterType="int" resultType="HashMap">
        		select stuNo "no",stuName "name",stuAge "age" from student
         		where stuNo = #{stuNo}
                    </select> 
	这其中的stuNo是数据库字段名 ,no是stuNo的别名,用于在map 中get 值时使用。map.get("no");
	如果不加别名打印的HashMap 打印的是数据库的字段名
	@MapKey("STUNO") //oracle的元数据(字段名,表名)都是大写
	HashMap<Interger,Student> queryStudentByHashMap();
	
	<select id = "queryStudentByHashMap" resultType ="HashMap" >
		select stnNo,stuName,stuAge from studnet
	</select>

# 逆向工程 QBC

逆向工程:
表,类,接口,mapper.xml 文件 当知道一个的时候,其他三个可以自动生成

需要的三个包:
mybatis-generator-core.jar,mybatis.jar,ojdbc.jar

逆向工程的配置文件:
generator.xml

执行:

# XxxMapper 代理对象:MapperProxy 对象

执行增删改查 ->M0apperProxy/inkove ()–>InvocationHandler:JDK 动态代理接口 用到了动态代理模式
动态代理模式:增删改查 -> 代理对象(MapperProxy 对象)-> 代理对象帮我们 “代理执行” 增删改查 ->

# 四个处理器

StatementHandler ParameterHandler TypeHandler ResultSetHandler

# 自定义插件

四大核心对象:	StatementHandler ParameterHandler  ResultSetHandler Executor

# 通用 Mapper

主键的属性只能是包装类型 Integer Long,不能是基本类型
主键策略:有些数据库支持自增,而有些数据库不支持
JDBC 支持通过 getGenerteKeys 方法取回主键的情况
这种情况需要数据库自增,其次是 jdbc 支持 getGenertekeys 方法。
常见的如 mysql,sqlserver 等
用法如下:
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
Oracle 中不支持自增用以下方式进行配置:
@Id
@KeySql(sql = “select SEQ_ID.nextval from dual”, order = ORDER.BEFORE)
private Integer id;

插入数据时,如果不给主键赋值,是否会回写到对象中

@Transient// 该属性不会进行数据库持久化操作,存在于内存中

阅读次数

请我喝[咖啡]~( ̄▽ ̄)~*

Zhouy 支付宝

支付宝

Zhouy 宝贝不是paypal

宝贝不是paypal

Zhouy 微信支付

微信支付