网站建设 之 mysql,mybatis参数

1、 char长度固定, 即每条数据占用等长字节空间;适合用在身份证号码、手机号码等定。

2、 varchar可变长度,可以设置最大长度;适合用在长度可变的属性。

3、 text不设置长度, 当不知道属性的最大长度时,适合用text。

按照查询速度: char最快, varchar次之,text最慢。

char:char(n)中的n表示字符数,最大长度是255个字符; 如果是utf8编码方式, 那么char类型占255 * 3个字节。(utf8下一个字符占用1至3个字节)

varchar:varchar(n)中的n表示字符数,最大空间是65535个字节, 存放字符数量跟字符集有关系;

     MySQL5.0.3以前版本varchar(n)中的n表示字节数;

     MySQL5.0.3以后版本varchar(n)中的n表示字符数;

PS:varchar实际范围是65532或65533, 因为内容头部会占用1或2个字节保存该字符串的长度;如果字段default null(即默认值为空),整条记录还需要1个字节保存默认值null。

       如果是utf8编码, 那么varchar最多存65532/3 = 21844个字符。

顺便提一句: 当表有成百上千万条数据时, 就要使用MySQL的分区(partition)功能, 原理有点像分治算法,就是将数据切割成多个部分。

索引组织表

在InnoDB存储引擎中,表都是根据主键顺序组织存放的,这种存储方式的表称为索引组织表(index organized table).在InnoDB存储引擎表中,每张表都有个主键(Primary Key),如果在创建表时没有显式地定义主键,则InnoDB存储引擎会按如下方式选择或创建主键

1:首先判断表中是否有非空的唯一索引,如果有,则该列即为主键

2:如果不符合上述条件,InnoDB存储引擎自动创建一个6字节大小的指针

当表中有多个非空唯一索引时,InnoDB存储引擎将选择建表时第一个定义的非空唯一索引为主键。

从InnoDB存储引擎的逻辑存储结构看,所有数据都被逻辑地存放在一个空间中,称之为表空间(tablespace).表空间又由段(segment),区(extent)、页(page)组成。

MyISAM:对整张表进行加锁,锁全表而不是行。在读数据的时候,所有的表上都可以获得共享锁(读锁),每个连接都不互相干扰。在写的时候,或者排他锁,会把整个表进行加锁,而其他的连接请求(读和写)都处于等待。

MySQL的表级锁有两种模式:表共享读锁(Table Read Lock)和表独占写锁(Table Write Lock)。MyISAM在执行查询语句(SELECT)前,会自动给涉及的所有表加读锁,在执行更新操作(UPDATE、DELETE、INSERT等)前,会自动给涉及的表加写锁。

1. InnoDB支持事务,MyISAM不支持,对于InnoDB每一条SQL语言都默认封装成事务,自动提交,这样会影响速度,所以最好把多条SQL语言放在begin和commit之间,组成一个事务; 

2. InnoDB支持外键,而MyISAM不支持。对一个包含外键的InnoDB表转为MYISAM会失败; 

3. InnoDB是聚集索引,使用B+Tree作为索引结构,数据文件是和(主键)索引绑在一起的(表数据文件本身就是按B+Tree组织的一个索引结构),必须要有主键,通过主键索引效率很高。但是辅助索引需要两次查询,先查询到主键,然后再通过主键查询到数据。因此,主键不应该过大,因为主键太大,其他索引也都会很大。

       MyISAM是非聚集索引,也是使用B+Tree作为索引结构,索引和数据文件是分离的,索引保存的是数据文件的指针。主键索引和辅助索引是独立的。

       也就是说:InnoDB的B+树主键索引的叶子节点就是数据文件,辅助索引的叶子节点是主键的值;而MyISAM的B+树主键索引和辅助索引的叶子节点都是数据文件的地址指针。

如何选择:

    1. 是否要支持事务,如果要请选择innodb,如果不需要可以考虑MyISAM;

    2. 如果表中绝大多数都只是读查询,可以考虑MyISAM,如果既有读也有写,请使用InnoDB。

    3. 系统奔溃后,MyISAM恢复起来更困难,能否接受;

    4. MySQL5.5版本开始Innodb已经成为Mysql的默认引擎(之前是MyISAM),说明其优势是有目共睹的,如果你不知道用什么,那就用InnoDB,至少不会差。

MySQL主键设计原则

  • MySQL主键应当是对用户没有意义的。
  • MySQL主键应该是单列的,以便提高连接和筛选操作的效率
  • 永远也不要更新MySQL主键
  • MySQL主键不应包含动态变化的数据,如时间戳、创建时间列、修改时间列等
  • MySQL主键应当有计算机自动生成。

就是自增ID,怎么设计呢?

CREATE TABLE user_t (

id int(11) NOT NULL AUTO_INCREMENT,

user_name varchar(40) NOT NULL,

password varchar(255) NOT NULL,

age int(4) NOT NULL,

PRIMARY KEY (id)

) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8;
复制代码
如上所示,通常会给主键加上 not null,auto_increment ,primary key 甚至UNSINGED 这些属性,我们可以通过这些属性去了解主键他的特性。

实际上就这么几种比较重要的属性,非空是最重要的属性了,然后就没了。

int(M) 在 integer 数据类型中,M 表示最大显bai示宽度。du

在 int(M) 中,M 的值跟 int(M) 所占多少存储空间并无任何zhi关系。 int(3)、daoint(4)、int(8) 在磁盘上都是占用 4 btyes 的存储空间。说白了,除了显示给用户的方式有点不同外,int(M) 跟 int 数据类型是相同的。

综合上述:int(10)表示的是数据显示的长度为10位。

表示时间值的日期和时间类型为 DATETIME、DATE、TIMESTAMP、TIME和YEAR。每个时间类型有一个有效值范围和一个"零"值,当指定不合法的MySQL不能表示的值时使用"零"值。

按理说你应该用DATETIME或者TIMESTAMP,对于跨时区的业务,TIMESTAMP更为合适。用TIMESTAMP吧。

view,是mysql的一项功能,是一种逻辑表,本身并不包含数据,而是从基本表生成的

可以简化操作,突出重点,提高数据安全性等等,也是通过sql语句创建的

diagram,是可视化图表,可以清晰看出表结构与其他表的关联性

procedure,存储过程,是一组完成某项功能的sql语句集合,存起来方便以后使用,所以叫存储过程

也是通过sql语句构建,有封装性与高性能的特点

function,顾名思义,函数了,例如NOW()是返回当前时间

trigger,触发器,在满足某种条件时触发,可以协助应用在数据库端确保数据的完整性

例如,插入一个用户条目后触发在日志中写入,这样。

  <select id="selectByGenderAndAge" resultMap="BaseResultMap" >
    select *  from employee where gender = #{param1} and age = #{param2}
  </select>
匿名传参,注意只能按顺序来,并且只能是固定名称,优点是简单,一个配置都没有

第二种

List<Employee> selectByGenderAndAge( @Param("gender") Short gender,@Param("age") String age );
<select id="selectByGenderAndAge" resultMap="BaseResultMap" >
  select * from employee where gender = #{gender} and age = #{age}
</select>
然后直接用就可以了,这个是最好的方式。

第三种使用map传参,这个更符合设计模式

<select id="selectByMapParams" resultMap="BaseResultMap" parameterType="map">
  select * from employee where gender = #{gender} and age = #{age}
</select>
注意也可以直接使用名字来进行调用。

@ApiOperation(value = "多个参数查询_通过Java Bean传递多个参数")
@PostMapping("findByBeans")
public ResultMsg findByBeans(@RequestBody Employee employee)
{
    List result= employeeMapper.selectByBeans(employee);
    return ResultMsg.getMsg(result);
}
这个问题 是你没法不进行处理就直接来造吧?

还可以直接使用json,越来越邪乎。

在MyBatis(使用版本3.4.6,早期版本不支持)中insert、update、delete语句的返回值可以是Integer、Long和Boolean。在定义Mapper接口时直接指定需要的类型即可,无需在对应的<insert><update><delete>标签中显示声明。

对应的代码在 org.apache.ibatis.binding.MapperMethod 类中,如下:

  • 对于insert、update、delete语句,MyBatis都会使用 rowCountResult 方法对返回值进行转换;
  • rowCountResult 方法会根据Mapper声明中方法的返回值类型来对参数进行转换;
  • 对于返回类型为Boolean的情况,如果返回的值大于0,则返回True,否则返回False

真牛逼。

Entity必须与mapper完全一致,若不一致用map代替才行。

猜你喜欢

转载自blog.csdn.net/HeroIsUseless/article/details/109582307