1.1    MyBatis介绍

MyBatis 世界上流行最广泛的基于SQ语句的ORM框架,由Clinton Begin 在2002 年创建,其后,捐献给了Apache基金会,成立了iBatis 项目。2010 年5 月,将代码库迁致Google Code,并更名为MyBatis.

1.2 与Hibernate比较

  1. 学习成本:MyBatis简单易学(特别是有SQL语法基础的人),较接近JDBC
  2. 程序灵活性:MyBatis直接使用SQL,灵活性高
  3. 程序执行效律:MyBatis效律高
  4. 可移植性:hibernate较好(与数据库关联在配置中完成,HQL语句与数据库无关)

1.3    适用场合

MyBatis是一个灵活的DAO层解决方案,满足较高的性能要求,可以在很多场合使用,但一般以下场合不建议使用:

  1. 需要支持多种数据库或数据库有移植要求
  2. 完全动态SQL,例如:字段都要动态生成

使用的不是关系数据库

1.4 开发步骤(推荐)

  1. 新建JAVA项目或WEB项目
  2. 部署jar包(包括数据库驱动包):使用MyBatis需要先下载jar包:下载地址http://code.google.com/p/mybatis
  3. 编写主配置文件
  4. 创建数据库及表
  5. 创建实体类及SQL映射文件
  6. 编写数据库接口及实现
  7. 编写测试类及测试

1.5 开发示例

1.5.1  新建项目

新建java项目或web 项目。

1.5.2 导入JAR包

导入mybatis和数据库驱动包、日志包(配置日志配置文件)。

1.5.3  创建myBatis-config.xml

(可以参考用户手册)

  1. <?xml version="1.0" encoding="UTF-8" ?>
  2. <!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
  3. "http://mybatis.org/dtd/mybatis-3-config.dtd">
  4. <configuration>
  5. <!--可以设置多个运行环境,满足不同需要,例如 开发、测试、生产环境上有不同一配置 -->
  6. <environments default="development">
  7. <environment id="development">
  8. <!--事务管理类型主要有jdbc和managed,前者依赖于数据源获得的连接,后者依赖于容器 -->
  9. <transactionManager type="JDBC" />
  10. <dataSource type="POOLED">
  11. <property name="driver" value="com.mysql.jdbc.Driver" />
  12. <!-- 如果数据库设置为UTF-8,则URL参数连接需要添加?useUnicode=true&amp;characterEncoding=UTF-8,如下 -->
  13. <property name="url" value="jdbc:mysql://localhost:3306/mybatis?useUnicode=true&amp;characterEncoding=UTF-8" />
  14. <property name="username" value="***" />
  15. <property name="password" value="***" />
  16. </dataSource>
  17. </environment>
  18. </environments>
  19. </configuration>

1.5.4  创建数据库及表

  1. drop database if exists mybatis;
  2. create database mybatis CHARACTER SET UTF8;
  3. use mybatis;
  4.  
  5. create table dept(
  6. dept_id int primary key auto_increment,
  7. dept_name varchar(50),
  8. dept_address varchar(50)
  9. );
  10.  
  11. insert into dept(dept_name,dept_address) values('研发部一部','广州');
  12. insert into dept(dept_name,dept_address) values('研发部二部','广州');
  13. insert into dept(dept_name,dept_address) values('研发部三部','深圳');
  14. select * from dept;

1.5.5  创建实体类:Dept.java

  1. public class Dept implements Serializable {
  2. private Integer deptId; //部门编号
  3. private String deptName;//部门名称
  4. private String deptAddress;//部门地址
  5. public Integer getDeptId() {
  6. return deptId;
  7. }
  8. public void setDeptId(Integer deptId) {
  9. this.deptId = deptId;
  10. }
  11. public String getDeptName() {
  12. return deptName;
  13. }
  14. public void setDeptName(String deptName) {
  15. this.deptName = deptName;
  16. }
  17. public String getDeptAddress() {
  18. return deptAddress;
  19. }
  20. public void setDeptAddress(String deptAddress) {
  21. this.deptAddress = deptAddress;
  22. }
  23. @Override
  24. public String toString() {
  25. return "Dept [deptId=" + deptId + ", deptName=" + deptName
  26. + ", deptAddress=" + deptAddress + "]";
  27. }
  28. }

1.5.6  创建SQL映射文件及修改主配置文件

SQL映射文件:DeptMapper.xml(可以参考用户手册)

  1. <?xml version="1.0" encoding="UTF-8" ?>
  2. <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
  3. <!-- 命名空间可以任选命名,但最好要定义一定规则,便于后继的使用 -->
  4. <mapper namespace="cn.it.entity.DeptMapper">
  5. <!-- 一般在查询时使用-->
  6. <resultMap type="cn.it.entity.Dept" id="deptResultMap">
  7. <id property="deptId" column="dept_id"/>
  8. <result property="deptName" column="dept_name"/>
  9. <result property="deptAddress" column="dept_address"/>
  10. </resultMap>
  11. <!-- 定义插入的sql语句,通过命名空间+id方式被定位 -->
  12. <insert id="insert" parameterType="cn.it.entity.Dept">
  13. insert into dept(dept_name,dept_address) values(#{deptName},#{deptAddress});
  14. </insert>
  15. </mapper>
  16.  
  17. 修改myBatis-config.xml,加入映射文件信息
  18. <?xml version="1.0" encoding="UTF-8" ?>
  19. <!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
  20. "http://mybatis.org/dtd/mybatis-3-config.dtd">
  21. <configuration>
  22. <environments default="development">
  23. …………
  24. </environments>
  25.  
  26. <mappers>
  27. <mapper resource="cn/it/entity/DeptMapper.xml" />
  28. </mappers>
  29.  
  30. </configuration>

1.5.7  编写数据库操作

包括操作接口及实现,接口略,实现类为:DeptDaoImpl.java

  1. public class DeptDaoImpl {
  2. /**
  3. * 用于插入数据到dept表。
  4. * @param dept 部门信息
  5. * @return 表示受影响的行数
  6. */
  7. public int insert(Dept dept){
  8. /*
  9. * 1.读取配置信息
  10. * 2.构建session工厂
  11. * 3.创建session
  12. * 4.启动事务(可选)
  13. * 5.数据处理
  14. * 6.提交事务、回滚事务(可选)
  15. * 7.关闭session
  16. */
  17. int i=0;
  18. SqlSession session=null;
  19. String config="myBatis-config.xml";
  20. Reader reader = null;
  21. try {
  22. reader=Resources.getResourceAsReader(config);
  23. SqlSessionFactory sqlSessionFactory=new SqlSessionFactoryBuilder().build(reader);
  24. session=sqlSessionFactory.openSession();
  25. //事务默认自动启动
  26. //SQL映射文件定义的命名空间+SQL语句的ID定位SQL语句,例如下的:cn.it.entity.DeptMapper.insert
  27. i=session.insert("cn.it.entity.DeptMapper.insert",dept);
  28. session.commit();
  29. } catch (IOException e) {
  30. // TODO Auto-generated catch block
  31. e.printStackTrace();
  32. session.rollback();
  33. }finally{
  34. //关闭reader对象,这里略
  35. session.close();
  36. }
  37. return i;
  38. }
  39. }

1.5.8  编写测试类

需要导入junit包

  1. public class DeptTest {
  2. private static DeptDaoImpl deptDaoImpl;
  3. @BeforeClass
  4. public static void setUpBeforeClass() throws Exception {
  5. deptDaoImpl=new DeptDaoImpl();
  6. }
  7.  
  8. @AfterClass
  9. public static void tearDownAfterClass() throws Exception {
  10. deptDaoImpl=null;
  11. }
  12.  
  13. @Test
  14. public void testInsert() {
  15. Dept dept=new Dept();
  16. dept.setDeptName("市场部");
  17. dept.setDeptAddress("深圳");
  18. int i=deptDaoImpl.insert(dept);
  19. System.out.println("受影响行数:"+i);
  20. }
  21.  
  22. }

2.基本的CRUD操作

2.1         准备工作(继续使用前面的库表和代码)

2.2         别名与自定义别名

2.2.1  内置别名

对常用的 java 类型,已经内置了一些别名支持。这些别名都是不区分大小写的。(详细参看用户手机)

2.2.2  自定义别名

在myBatis的主配置文件给cn.it.entity.Dept类创建别名Dept,后继的DeptMapper.xml配置文件中可以使用别名

  1. <!-- 通过别名简化对类的使用 -->
  2. <typeAliases>
  3. <typeAlias type="cn.it.entity.Dept" alias="Dept" />
  4. </typeAliases>

2.3  MyBatisUtil工具类

  1. public class MyBatisUtil {
  2.  
  3. private static final ThreadLocal<SqlSession> threadLocal = new ThreadLocal<SqlSession>();
  4. private static SqlSessionFactory sessionFactory;
  5.  
  6. private static String CONFIG_FILE_LOCATION = "myBatis-config.xml";
  7.  
  8. static {
  9. try {
  10. buildSessionFactory();
  11. } catch (Exception e) {
  12. System.err.println("%%%% Error Creating SessionFactory %%%%");
  13. e.printStackTrace();
  14. }
  15. }
  16. private MyBatisUtil() {
  17. }
  18.  
  19. /**
  20. * Returns the ThreadLocal Session instance. Lazy initialize
  21. * the <code>SessionFactory</code> if needed.
  22. *
  23. * @return Session
  24. * @throws Exception
  25. */
  26. public static SqlSession getSession() throws Exception {
  27. SqlSession session = (SqlSession) threadLocal.get();
  28.  
  29. if (session == null) {
  30. if (sessionFactory == null) {
  31. buildSessionFactory();
  32. }
  33. session = (sessionFactory != null) ? sessionFactory.openSession()
  34. : null;
  35. threadLocal.set(session);
  36. }
  37.  
  38. return session;
  39. }
  40.  
  41. /**
  42. * build session factory
  43. *
  44. */
  45. public static void buildSessionFactory() {
  46. Reader reader=null;
  47. try {
  48. reader=Resources.getResourceAsReader(CONFIG_FILE_LOCATION);
  49. sessionFactory = new SqlSessionFactoryBuilder().build(reader);
  50. } catch (Exception e) {
  51. System.err.println("%%%% Error Creating SessionFactory %%%%");
  52. e.printStackTrace();
  53. }finally{
  54. try {
  55. reader.close();
  56. } catch (IOException e) {
  57. // TODO Auto-generated catch block
  58. e.printStackTrace();
  59. }
  60. }
  61. }
  62.  
  63. /**
  64. * Close the single session instance.
  65. *
  66. */
  67. public static void closeSession(){
  68. SqlSession session = (SqlSession) threadLocal.get();
  69. threadLocal.set(null);
  70.  
  71. if (session != null) {
  72. session.close();
  73. }
  74. }
  75.  
  76. /**
  77. * return session factory
  78. *
  79. */
  80. public static SqlSessionFactory getSessionFactory() {
  81. return sessionFactory;
  82. }
  83. }

2.3         CRUD操作

2.3.1  新增操作

配置文件DeptMapper.xml使用别名, DeptDaoImpl.java新增方法使用工具类。

修改配置文件DeptMapper.xml(使用别名):

  1. <!--parameterType="Dept"不写时,也能自动根据代码传递的参数Dept自动匹配 内容-->
  2. <insert id="insert" parameterType="Dept">
  3. insert into dept(dept_name) values(#{deptName});
  4. </insert>

修改DeptDaoImpl.java新增方法(使用MyBatisUtil.java工具类):

  1. /**
  2. * @param dept 部门信息
  3. * @return 保存信息后受影响的行数
  4. */
  5. public int saveDept(Dept dept) {
  6. int i = 0;
  7. try {
  8. session = MyBatisUtil.getSession();
  9. i = session.insert("cn.it.entity.DeptMapper.insertDept", dept);
  10. session.commit();
  11. } catch (Exception e) {
  12. // TODO Auto-generated catch block
  13. e.printStackTrace();
  14. session.rollback();
  15. } finally {
  16. try {
  17. MyBatisUtil.closeSession();
  18. } catch (Exception e) {
  19. // TODO Auto-generated catch block
  20. e.printStackTrace();
  21. }
  22. }
  23.  
  24. return i;
  25. }

2.3.2  修改操作

修改配置文件deptMapper.xml,添加

  1. <update id="update" parameterType="Dept">
  2. update dept set dept_name=#{deptName} ,dept_address=#{deptAddress} where dept_id=#{deptId}
  3. </update>

修改DeptDaoImpl.java,添加update方法:

  1. public int update(Dept dept){
  2. SqlSession session = null;
  3. int i=0;
  4.  
  5. try {
  6. session=MyBatisUtil.getSession();
  7. //方法的第一个参数为DeptMapper.xml文件的命名空间+id
  8. i=session.update("cn.it.entity.DeptMapper.update",dept);
  9. System.out.println("受影响行数:"+i);
  10. session.commit();
  11. } catch (Exception e) {
  12. // TODO Auto-generated catch block
  13. e.printStackTrace();
  14. session.rollback();
  15.  
  16. }finally{
  17. MyBatisUtil.closeSession();
  18. }
  19. return i;
  20. }

2.3.3  删除操作

修改配置文件deptMapper.xml,添加

  1. <delete id="delete" parameterType="Dept">
  2. delete from dept where dept_id=#{deptId}
  3. </delete>

修改DeptDaoImpl.java,添加delete方法:

  1. public int delete(Dept dept){
  2. int i = 0;
  3. try {
  4. session=MyBatisUtil.getSession();
  5. //方法的第一个参数为DeptMapper.xml文件的命名空间+id
  6. i=session.delete("cn.it.entity.DeptMapper.delete",dept);
  7. //System.out.println("受影响行数:"+i);
  8. session.commit();
  9. } catch (Exception e) {
  10. // TODO Auto-generated catch block
  11. e.printStackTrace();
  12. session.rollback();
  13.  
  14. }finally{
  15. MyBatisUtil.closeSession();
  16. }
  17. return i;
  18. }

2.3.4  查询操作(返回单条记录)

配置deptMapper.xml文件的resultMap元素及SQL查询语句

  1. <!-- 表字段和实体属性命名一致时可以不配置 -->
  2. <resultMap id="deptResultMap" type="Dept">
  3. <id property="deptId" column="dept_id"/>
  4. <result property="deptName" column="dept_name"/>
  5. <result property="deptAddress" column="dept_address"/>
  6. </resultMap>
  7. <!—省略其它的配置信息 -->
  8. <!—返回单条记录,表字段和对应实体属性命名一致时可以不使用resultMap属性配置,直接使用resultType="返回的全类名或别名",建议使用前者;查询结果为所有字段时,也可以用*表示 -->
  9. <select id="selectOne" parameterType="int" resultMap="deptResultMap" >
  10. select dept_id, dept_name from dept where dept_id=#{deptId}
  11. </select>

修改DeptDaoImpl.java,添加selectOne方法:

  1. public Dept selectOne(int deptId){
  2. Dept dept=null;
  3. try {
  4. session=MyBatisUtil.getSession();
  5. dept=(Dept)session.selectOne("cn.it.entity.DeptMapper.selectOne",deptId);
  6. System.out.println("dept:"+dept);
  7. } catch (Exception e) {
  8. e.printStackTrace();
  9. }finally{
  10. MyBatisUtil.closeSession();
  11. }
  12. return dept;
  13. }

2.3.5  查询操作(返回多条记录)

修改配置文件deptMapper.xml,添加

  1. <!-- 返回多条记录,返回结果配置的不是集合类型,而是集合元素的类型;参数也可以通过Map等方式封装 -->
  2. <select id="selectList" parameterType="Map" resultMap="deptResultMap">
  3. select * from dept where dept_name like #{deptName}
  4. </select>

修改DeptDaoImpl.java,添加selectList方法:

  1. public List<Dept> selectList(Map map){
  2. List<Dept> depts=null;
  3. try {
  4. session=MyBatisUtil.getSession();
  5. depts=session.selectList("cn.it.entity.DeptMapper.selectList",map);
  6. } catch (Exception e) {
  7. e.printStackTrace();
  8. }finally{
  9. MyBatisUtil.closeSession();
  10. }
  11. return depts;
  12. }

测试类代码:

  1. @Test
  2. public void testSelectList() {
  3. Map map=new HashMap();
  4. map.put("deptName", "%研%");
  5. List<Dept> depts=deptDaoImpl.selectList(map);
  6. for(Dept dept:depts){
  7. System.out.println("dept:"+dept);
  8. }
  9. }

3.动态SQL操作

3.1    准备工作

创建表及库,实体类,配置文件(参考上章节内容),以下为建表和库的SQL:

  1. drop database if exists mybatis;
  2. create database mybatis CHARACTER SET UTF8;
  3. use mybatis;
  4.  
  5. create table dept(
  6. dept_id int primary key auto_increment,
  7. dept_name varchar(50),
  8. dept_address varchar(50)
  9. );
  10.  
  11. insert into dept(dept_name,dept_address) values('研发部一部','广州');
  12. insert into dept(dept_name,dept_address) values('研发部二部','广州');
  13. insert into dept(dept_name,dept_address) values('研发部三部','深圳');
  14. select * from dept;

3.2  IF语句

修改配置文件deptMapper.xml,添加

  1. <!-- 动态IF条件 -->
  2. <select id="selectListUseIf" parameterType="Dept" resultMap="deptResultMap">
  3. select * from dept where 1=1
  4. <if test="deptId!=null">
  5. and dept_id=#{deptId}
  6. </if>
  7. <if test="deptName!=null">
  8. and dept_name=#{deptName}
  9. </if>
  10. <if test="deptAddress!=null">
  11. and dept_address=#{deptAddress}
  12. </if>
  13. </select>

修改DeptDaoImpl.java,添加selectListUseIf方法:

  1. //根据参数使用配置文件的IF语句自动填充查询的过滤条件
  2. public List<Dept> selectListUseIf(Dept dept){
  3. List<Dept> depts=null;
  4. try {
  5. session=MyBatisUtil.getSession();
  6. depts=session.selectList("cn.it.entity.DeptMapper.selectListUseIf",dept);
  7. } catch (Exception e) {
  8. e.printStackTrace();
  9. }finally{
  10. MyBatisUtil.closeSession();
  11. }
  12. return depts;
  13. }

3.3  WHERE语句

修改配置文件deptMapper.xml,添加

  1. <!-- 动态Where条件 ,一般也需要与if结合使用,与纯if比较,省略了where 1=1-->
  2. <select id="selectListUseWhere" parameterType="Dept" resultMap="deptResultMap">
  3. select * from dept
  4. <where>
  5. <if test="deptId!=null">
  6. and dept_id=#{deptId}
  7. </if>
  8. <if test="deptName!=null">
  9. and dept_name=#{deptName}
  10. </if>
  11. <if test="deptAddress!=null">
  12. and dept_address=#{deptAddress}
  13. </if>
  14. </where>
  15. </select>

3.4  choose(when,otherwise)语句

修改配置文件deptMapper.xml,添加

  1. <!-- 动态choose条件 ,如下配置,可以完成没有选择条件时,查找不出任何数据 -->
  2. <select id="selectListUseChoose" parameterType="Dept" resultMap="deptResultMap">
  3. select * from dept where 1=1
  4. <choose>
  5. <when test="deptId!=null">and dept_id=#{deptId}</when>
  6. <when test="deptName!=null">and dept_name=#{deptName}</when>
  7. <when test="deptAddress!=null">and dept_address=#{deptAddress}</when>
  8. <otherwise>and !1 = 1</otherwise>
  9. </choose>
  10. </select>

3.5  SET语句

修改配置文件deptMapper.xml,添加

  1. <!--动态set语句可以用来更新数据 -->
  2. <update id="updateUseSet" parameterType="Dept">
  3. update dept
  4. <set>
  5. <if test="deptName!=null">dept_name=#{deptName},</if>
  6. <if test="deptAddress!=null">dept_address=#{deptAddress},</if>
  7. </set>
  8. where dept_id=#{deptId}
  9. </update>

3.6  ForEach语句

修改配置文件deptMapper.xml,添加

  1. < <!-- 定义根据多个部门ID查询部门相关部门信息的SQL语句 ,resultMap的值是指集合里元素的类型,parameterType不用指定 -->
  2. <select id="selectListUseForeach" parameterType="Integer[]" resultMap="deptResultMap">
  3. select * from dept where dept_id in
  4. <!-- collection="array或list",array用来对应参数为数组,list对应参数为 集合 -->
  5. <foreach collection="array" item="deptId" open="(" separator="," close=")">
  6. #{deptId}
  7. </foreach>
  8. </select>

3.7  include语句

修改配置文件deptMapper.xml,添加

  1. <!-- 使用include语句动态插入表的字段及对应的值 -->
  2. <sql id="key">
  3. <!--suffixOverrides="," 可以忽略最后“,”号 -->
  4. <trim suffixOverrides=",">
  5.  
  6. <if test="deptName!=null">
  7. dept_name,
  8. </if>
  9. <if test="deptAddress!=null">
  10. dept_address,
  11. </if>
  12. </trim>
  13. </sql>
  14. <sql id="value">
  15. <trim suffixOverrides="," >
  16. <if test="deptName!=null">
  17. #{deptName},
  18. </if>
  19. <if test="deptAddress!=null">
  20. #{deptAddress},
  21. </if>
  22. </trim>
  23. </sql>
  24.  
  25. <insert id="insertUseInclude" parameterType="Dept">
  26. insert into dept(
  27. <include refid="key" />
  28. ) values(
  29. <include refid="value"/>
  30. )
  31. </insert>

MyBetis3.2框架技术的更多相关文章

  1. Hibernate 系列 01 - 框架技术 (介绍Hibernate框架的发展由来)

    引导目录: Hibernate 系列教程 目录 本篇导航: 为什么学习框架技术 框架的概念 主流框架的介绍 1.为什么学习框架技术 如何制作一份看上去具有专业水准的PPT文档呢?一个简单的方法就是使用 ...

  2. 使用Hibernate框架技术时,对项目进行的配置

    1.在需要使用Hibernate框架技术的项目上单击鼠标右键,在弹出的菜单中选择MyEclipse-->Add Hibernate Capabilities,打开Add Hibernate Ca ...

  3. DL动态载入框架技术文档

    DL动态载入框架技术文档 DL技术交流群:215680213 1. Android apk动态载入机制的研究 2. Android apk动态载入机制的研究(二):资源载入和activity生命周期管 ...

  4. 对比React Native、dcloud、LuaView三个框架技术(内部)

    转载自:http://www.jianshu.com/p/ee1cdb33db8d主要对比React Native和5+SDK(就是dcloud的SDK)两个: 开发语言:三个都是用其他语言来统一开发 ...

  5. 一款基于SSM框架技术的全栈Java web项目(已部署可直接体验)

    概述 此项目基于SSM框架技术的Java Web项目,是全栈项目,涉及前端.后端.插件.上线部署等各个板块,项目所有的代码都是自己编码所得,每一步.部分都有清晰的注释,完全不用担心代码混乱,可以轻松. ...

  6. Java 进阶7 并行优化 JDK多任务执行框架技术

    Java 进阶7 并行优化 JDK多任务执行框架技术 20131114          Java 语言本身就是支持多线程机制的,他提供了 Thread 类 Runnable 接口等简单的多线程支持工 ...

  7. 浅析Java Web框架技术

    一.Java Web框架技术的概念 所谓的Java框架,简单理解是一个可复用的设计构件,它规定了应用的体系结构,阐明了整个设计.协作构件之间的依赖关系.责任分配和控制流程,表现为一组抽象类以及其实例之 ...

  8. Spring框架技术

    Spring框架技术 SSM(Spring+SpringMVC+Mybatis)阶段的学习,也算是成功出了Java新手村. 前面我们已经学习过Mybatis了. 从这里开始,很多的概念理解起来就稍微有 ...

  9. MFC 框架技术简单研讨

    引用:http://www.cnblogs.com/chinazhangjie/archive/2011/09/20/2181986.html 正文: 第一讲 Win32 App  和  MFC Fr ...

随机推荐

  1. IKAnalyzer 分词

    IK Analyzer 3.0特性 采用了特有的"正向迭代最细粒度切分算法",具有80万字/秒的高速处理能力 采用了多子处理器分析模式,支持:英文字母(IP地址.Email.URL ...

  2. Sublime Text 3 (Build 3126) 最新注册码

    Sublime Text 作为程序员开发神器,听说最新版更新了 并且增加了不少新特性.马上到官网下载了最新版 Sublime Text 3 3126 使用了下,反应速度比以前的确更快了.随手找了几个S ...

  3. MySQL学习分享--数值类型

    数值类型 MySQL的数值类型包括整数类型.浮点数类型.定点数类型.位类型. 整数类型 MySQL支持的整数类型有tinyint.smallint.mediumint.int.bigint(范围从小到 ...

  4. 微信小程序怎样提高应用速度小技巧

    作者:vicyao, 腾讯web前端开发 高级工程师商业转载请联系腾讯WeTest获得授权,非商业转载请注明出处. 原文链接:http://wetest.qq.com/lab/view/294.htm ...

  5. java基础:数组的复制

  6. redux-form的学习笔记二--实现表单的同步验证

    (注:这篇博客参考自redux-form的官方英文文档)左转http://redux-form.com/6.5.0/examples/syncValidation/ 在这篇博客里,我将用redux-f ...

  7. wemall doraemon中Android app商城系统解决左侧抽屉菜单和viewpager不能兼容问题

    完美解决左侧抽屉菜单和viewpager不能兼容左右滑动的问题,可进行参考. WeMall-Client/res/layout/wemall_main_ui.xml </RadioGroup&g ...

  8. Archlinux中卸载 Slim

    Slim 是图形登录器.最近停止更新了,据说在systemd中有兼容性问题. 卸载Slim的原因是某计算机使用的是AMD显卡的Catalyst驱动,图形驱动一旦出问题,Slim就无法启动,给维护造成困 ...

  9. 温故而知新——map

    map  :关联式容器,使用时是以属性值对的方式进行使用,例如:<key,value>.map key值唯一,相同的key值插入时只会保留一个.除此之外,map的特点还包括:1.map底层 ...

  10. 对bootstrap不同版本的总结

    之前以为bootstrap2和bootstrap3没啥区别,无非就是功能增加了,简直是误区啊 bootstrap3与bootstrap2版本语法都不同啦 栅格写法 col-md-3/span3 文本效 ...