开启全新的一个项目
1.数据库
DELIMITER $$
/*!50003 CREATE DEFINER=`root`@`localhost` PROCEDURE `addUser`(in v_name varchar(30),v_email varchar(50),v_password varchar(20),v_ident varchar(20),v_ident_num varchar(20))
BEGIN
insert into t_t_user(username,email,password,ident,identnum)values(v_name,v_email,v_password,v_ident,v_ident_num);
insert into t_t_user_role(user_id,role_id)
select a.id,b.id from t_t_user a,t_t_role b where a.email = v_email and b.rolename=v_ident;
END */$$
DELIMITER ;
这里的意思是:
DELIMITER$$-->这里的意思是告诉mysql,上面的建表过程,已经没了,接下来是一段新的sql
但是这里新的sql,还有几个问题:
①CREATE DEFINER-->创建一个管理权限,有这个权限的可以执行下面的命令
②PROCEDURE-->其实这里有点类似封装sql,报几个sql命令封装成一个
后面写的这几个,其实就相当于,作者自己写的一些命令,在这里跑
2.手动加索引
暂时还没写到select索引的,这里之后肯定有,不然写索引干嘛对吧
3.外键
外键必须添加索引
外键关系的两个表的列必须是数据类型相似
比如int和tinyint可以,而int和char则不可以;
这里有个问题,表A里面的一个字段,这个字段的外键居然是A表的主键...这里实在是不知道啥东西了...
CASCADE
在父表上update/delete记录时,同步update/delete掉子表的匹配记录
SET NULL
在父表上update/delete记录时,将子表上匹配记录的列设为null (要注意子表的外键列不能为not null)
NO ACTION
如果子表中有匹配的记录,则不允许对父表对应候选键进行update/delete操作
RESTRICT
同no action, 都是立即检查外键约束
SET NULL
父表有变更时,子表将外键列设置成一个默认的值 但Innodb不能识别
RESTRICT的意思就是,使用了外键的表,当外键所在表有数据的时候,这个时候是不能删除或者更改该表的数据的
SET NULL的意思就是,使用了外键的表,当期增删的时候,被引用的外键所在的表的这一列的值设为NULL
4.执行结果报错:ERROR 1452 : Cannot add or update a child row: a foreign key constraint fails。。。
如果你的一张表,加外键,那么这个外键所在的表的的主键ID,肯定是要跟你的这个表的ID一模一样的,不可能我这边表加了外键的2条数据,而你的那张表有3条...主键和ID都要一样,这样就能保证数据一致性了.
5.自己给自己加外键...暂时不知道这样的操作有什么意义
CREATE TABLE `t_t_func` (
`id` bigint(5) NOT NULL AUTO_INCREMENT,
`func_name` varchar(50) DEFAULT NULL,
`func_code` varchar(50) DEFAULT NULL,
`pid` bigint(5) DEFAULT NULL,
PRIMARY KEY (`id`),
KEY `pid` (`pid`),
CONSTRAINT `pid` FOREIGN KEY (`pid`) REFERENCES `t_t_func` (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=36 DEFAULT CHARSET=utf8;
6.mapper.xml
<property name="mapperLocations" >
<array>
<!--这里直接*,之后看是否需要每一个都写进来-->
<value>file:E:\backend_demo\src\main\java\mapper\*.xml</value>
</array>
</property>
这里解析xml文件的时候,不用再写array,直接写*,之后看看是否可行
7.MapperScannerConfigurer
mapper的扫描器别人在这里把sqlSessionFactory扫进来了,但是我的代码里面没有扫
注 意 , 没 有 必 要 去 指 定 SqlSessionFactory 或 SqlSessionTemplate , 因 为 MapperScannerConfigurer 将会创建 MapperFactoryBean,之后自动装配。但是,如果你使 用了一个 以上的 DataSource ,那 么自动 装配可 能会失效 。这种 情况下 ,你可 以使用 sqlSessionFactoryBeanName 或 sqlSessionTemplateBeanName 属性来设置正确的 bean 名 称来使用。这就是它如何来配置的,注意 bean 的名称是必须的,而不是 bean 的引用,因 此,value 属性在这里替代通常的 ref
<property name="sqlSessionFactoryBeanName" value="sqlSessionFactory" />
8.序列化
在这里BaseModel这个bean是加了序列化,但是其他的bean不一定
在这里确实是一个疑问,为什么要序列化
9.dao里面有若干个mapper,怎么扫进来
<bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
<property name="basePackage" value="com.ld7.client.dao,com.ld7.backend.dao"/>
</bean>
在这里用逗号隔开
10.动态sql
<select id="findPartPermissions" parameterType="map" resultType="int">
select count(*) from permission
<where>
<trim suffixOverrides="and">
<if test="map.name != null and map.name != ''">
name LIKE concat(concat('%',#{map.name}),'%') and
</if>
<if test="map.plevel != null and map.plevel != ''">
plevel = #{map.plevel} and
</if>
</trim>
</where>
</select>
在这里使用了动态sql标签
详解一下-->
知识点如下:
①trim
<trim suffixOverrides="and">
把trim标签里面最后的结果,移除最后的"and"字符,必然的话会报sql错误
<trim prefix="" suffix="" suffixOverrides="" prefixOverrides=""></trim>
prefix:在trim标签内sql语句加上前缀。
suffix:在trim标签内sql语句加上后缀。
suffixOverrides:指定去除多余的后缀内容,如:suffixOverrides=",",去除trim标签内sql语句多余的后缀","。
prefixOverrides:指定去除多余的前缀内容
②<if test="">即条件
<if test="map.name != null and map.name != ''">
③concat
字符串拼接
concat ( concat( '%' , #{map.name} , '%' ) , %)
先拼成一个--> %map.name% -->再拼成一个 (%map.name%)% ,这里表示一种模糊查询条件
sql解释==>
按照2个条件查找符合条件的permission-->1.满足map.name的模糊查询;2.map.plevel满足传入条件的
这种定制化sql,其实也不复杂,写多了就知道怎么写了