1.1MyBatis简介

MyBatis 是一个可以自定义SQL、存储过程和高级映射的持久层框架。MyBatis 摒除了大部分的JDBC代码、手工设置参数和结果集重获。MyBatis 只使用简单的XML 和注解来配置和映射基本数据类型、Map 接口和POJO 到数据库记录。相对Hibernate和Apache OJB等“一站式”ORM解决方案而言,Mybatis 是一种“半自动化”的ORM实现。
需要使用的Jar包:mybatis-3.0.2.jar(mybatis核心包)。mybatis-spring-1.0.0.jar(与Spring结合包)。

下载地址:
http://ibatis.apache.org/tools/ibator
http://code.google.com/p/mybatis/

1.2MyBatis+Spring+MySql简单配置

1.2.1搭建Spring环境

1,建立maven的web项目;
2,加入Spring框架、配置文件;
3,在pom.xml中加入所需要的jar包(spring框架的、mybatis、mybatis-spring、junit等);
4,更改web.xml和spring的配置文件;
5,添加一个jsp页面和对应的Controller;
6,测试。

可参照:http://limingnihao.iteye.com/blog/830409使用Eclipse的Maven构建SpringMVC项目

1.2.2建立MySql数据库

建立一个测试数据库。

使用下面的sql进行建数据库,先建立学生表,插入数据(2条以上)。

更多sql请下载项目源文件,在resource/sql中。

  1. /* 建立数据库 */
  2. CREATE DATABASE STUDENT_MANAGER;
  3. USE STUDENT_MANAGER;
  4. /***** 建立student表 *****/
  5. CREATE TABLE STUDENT_TBL
  6. (
  7. STUDENT_ID         VARCHAR(255) PRIMARY KEY,
  8. STUDENT_NAME       VARCHAR(10) NOT NULL,
  9. STUDENT_SEX        VARCHAR(10),
  10. STUDENT_BIRTHDAY   DATE,
  11. CLASS_ID           VARCHAR(255)
  12. );
  13. /*插入学生数据*/
  14. INSERT INTO STUDENT_TBL (STUDENT_ID,
  15. STUDENT_NAME,
  16. STUDENT_SEX,
  17. STUDENT_BIRTHDAY,
  18. CLASS_ID)
  19. VALUES   (123456,
  20. '某某某',
  21. '女',
  22. '1980-08-01',
  23. 121546
  24. )

创建连接MySql使用的配置文件mysql.properties。

  1. jdbc.driverClassName=com.mysql.jdbc.Driver
  2. jdbc.url=jdbc:mysql://localhost:3306/student_manager?user=root&password=limingnihao&useUnicode=true&characterEncoding=UTF-8

1.2.3搭建MyBatis环境

顺序随便,现在的顺序是因为可以尽量的少的修改写好的文件。

1.2.3.1创建实体类: StudentEntity

  1. public class StudentEntity implements Serializable {
  2. private static final long serialVersionUID = 3096154202413606831L;
  3. private ClassEntity classEntity;
  4. private Date studentBirthday;
  5. private String studentID;
  6. private String studentName;
  7. private String studentSex;
  8. public ClassEntity getClassEntity() {
  9. return classEntity;
  10. }
  11. public Date getStudentBirthday() {
  12. return studentBirthday;
  13. }
  14. public String getStudentID() {
  15. return studentID;
  16. }
  17. public String getStudentName() {
  18. return studentName;
  19. }
  20. public String getStudentSex() {
  21. return studentSex;
  22. }
  23. public void setClassEntity(ClassEntity classEntity) {
  24. this.classEntity = classEntity;
  25. }
  26. public void setStudentBirthday(Date studentBirthday) {
  27. this.studentBirthday = studentBirthday;
  28. }
  29. public void setStudentID(String studentID) {
  30. this.studentID = studentID;
  31. }
  32. public void setStudentName(String studentName) {
  33. this.studentName = studentName;
  34. }
  35. public void setStudentSex(String studentSex) {
  36. this.studentSex = studentSex;
  37. }
  38. }

1.2.3.2创建数据访问接口

Student类对应的dao接口:StudentMapper。

  1. public interface StudentMapper {
  2. public StudentEntity getStudent(String studentID);
  3. public StudentEntity getStudentAndClass(String studentID);
  4. public List<StudentEntity> getStudentAll();
  5. public void insertStudent(StudentEntity entity);
  6. public void deleteStudent(StudentEntity entity);
  7. public void updateStudent(StudentEntity entity);
  8. }

1.2.3.3创建SQL映射语句文件

Student类的sql语句文件StudentMapper.xml
resultMap标签:表字段与属性的映射。
Select标签:查询sql。

  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. <mapper namespace="com.manager.data.StudentMapper">
  4. <resultMap type="StudentEntity" id="studentResultMap">
  5. <id property="studentID" column="STUDENT_ID"/>
  6. <result property="studentName" column="STUDENT_NAME"/>
  7. <result property="studentSex" column="STUDENT_SEX"/>
  8. <result property="studentBirthday" column="STUDENT_BIRTHDAY"/>
  9. </resultMap>
  10. <!-- 查询学生,根据id -->
  11. <select id="getStudent" parameterType="String" resultType="StudentEntity" resultMap="studentResultMap">
  12. <![CDATA[
  13. SELECT * from STUDENT_TBL ST
  14. WHERE ST.STUDENT_ID = #{studentID}
  15. ]]>
  16. </select>
  17. <!-- 查询学生列表 -->
  18. <select id="getStudentAll"  resultType="com.manager.data.model.StudentEntity" resultMap="studentResultMap">
  19. <![CDATA[
  20. SELECT * from STUDENT_TBL
  21. ]]>
  22. </select>
  23. </mapper>

1.2.3.4创建MyBatis的mapper配置文件

在src/main/resource中创建MyBatis配置文件:mybatis-config.xml。
typeAliases标签:给类起一个别名。com.manager.data.model.StudentEntity类,可以使用StudentEntity代替。
Mappers标签:加载MyBatis中实体类的SQL映射语句文件。

  1. <?xml version="1.0" encoding="UTF-8" ?>
  2. <!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Config 3.0//EN" "http://mybatis.org/dtd/mybatis-3-config.dtd">
  3. <configuration>
  4. <typeAliases>
  5. <typeAlias alias="StudentEntity" type="com.manager.data.model.StudentEntity"/>
  6. </typeAliases>
  7. <mappers>
  8. <mapper resource="com/manager/data/maps/StudentMapper.xml" />
  9. </mappers>
  10. </configuration>

1.2.3.5修改Spring 的配置文件

主要是添加SqlSession的制作工厂类的bean:SqlSessionFactoryBean,(在mybatis.spring包中)。需要指定配置文件位置和dataSource。
和数据访问接口对应的实现bean。通过MapperFactoryBean创建出来。需要执行接口类全称和SqlSession工厂bean的引用。

  1. <!-- 导入属性配置文件 -->
  2. <context:property-placeholder location="classpath:mysql.properties" />
  3. <bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
  4. <property name="driverClassName" value="${jdbc.driverClassName}" />
  5. <property name="url" value="${jdbc.url}" />
  6. </bean>
  7. <bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
  8. <property name="dataSource" ref="dataSource" />
  9. </bean>
  10. <bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
  11. <property name="configLocation" value="classpath:mybatis-config.xml" />
  12. <property name="dataSource" ref="dataSource" />
  13. </bean>
  14. <!— mapper bean -->
  15. <bean id="studentMapper" class="org.mybatis.spring.MapperFactoryBean">
  16. <property name="mapperInterface" value="com.manager.data.StudentMapper" />
  17. <property name="sqlSessionFactory" ref="sqlSessionFactory" />
  18. </bean>

也可以不定义mapper的bean,使用注解:

将StudentMapper加入注解

  1. @Repository
  2. @Transactional
  3. public interface StudentMapper {
  4. }

对应的需要在dispatcher-servlet.xml中加入扫描:

  1. <bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
  2. <property name="annotationClass" value="org.springframework.stereotype.Repository"/>
  3. <property name="basePackage" value="com.liming.manager"/>
  4. <property name="sqlSessionFactory" ref="sqlSessionFactory"/>
  5. </bean>

1.2.4测试StudentMapper

使用SpringMVC测试,创建一个TestController,配置tomcat,访问index.do页面进行测试:

  1. @Controller
  2. public class TestController {
  3. @Autowired
  4. private StudentMapper studentMapper;
  5. @RequestMapping(value = "index.do")
  6. public void indexPage() {
  7. StudentEntity entity = studentMapper.getStudent("10000013");
  8. System.out.println("name:" + entity.getStudentName());
  9. }
  10. }

使用Junit测试:

  1. 使用Junit测试:
  2. Java代码
  3. @RunWith(value = SpringJUnit4ClassRunner.class)
  4. @ContextConfiguration(value = "test-servlet.xml")
  5. public class StudentMapperTest {
  6. @Autowired
  7. private ClassMapper classMapper;
  8. @Autowired
  9. private StudentMapper studentMapper;
  10. @Transactional
  11. public void getStudentTest(){
  12. StudentEntity entity = studentMapper.getStudent("10000013");
  13. System.out.println("" + entity.getStudentID() + entity.getStudentName());
  14. List<StudentEntity> studentList = studentMapper.getStudentAll();
  15. for( StudentEntity entityTemp : studentList){
  16. System.out.println(entityTemp.getStudentName());
  17. }
  18. }
  19. }

SQL 映射XML 文件是所有sql语句放置的地方。需要定义一个workspace,一般定义为对应的接口类的路径。写好SQL语句映射文件后,需要在MyBAtis配置文件mappers标签中引用,例如:

  1. <mappers>
  2. <mapper resource="com/liming/manager/data/mappers/UserMapper.xml" />
  3. <mapper resource="com/liming/manager/data/mappers/StudentMapper.xml" />
  4. <mapper resource="com/liming/manager/data/mappers/ClassMapper.xml" />
  5. <mapper resource="com/liming/manager/data/mappers/TeacherMapper.xml" />
  6. </mappers>

当Java接口与XML文件在一个相对路径下时,可以不在myBatis配置文件的mappers中声明。

SQL 映射XML 文件一些初级的元素:

1. cache – 配置给定模式的缓存
2. cache-ref – 从别的模式中引用一个缓存
3. resultMap – 这是最复杂而却强大的一个元素了,它描述如何从结果集中加载对象
4. sql – 一个可以被其他语句复用的SQL 块
5. insert – 映射INSERT 语句
6. update – 映射UPDATE 语句
7. delete – 映射DELEETE 语句
8. select  -  映射SELECT语句

2.1 resultMap

resultMap 是MyBatis 中最重要最强大的元素了。你可以让你比使用JDBC 调用结果集省掉90%的代码,也可以让你做许多JDBC 不支持的事。现实上,要写一个等同类似于交互的映射这样的复杂语句,可能要上千行的代码。ResultMaps 的目的,就是这样简单的语句而不需要多余的结果映射,更多复杂的语句,除了只要一些绝对必须的语句描述关系以外,再也不需要其它的。

resultMap属性:type为java实体类;id为此resultMap的标识。

resultMap可以设置的映射:

1. constructor – 用来将结果反射给一个实例化好的类的构造器

a) idArg – ID 参数;将结果集标记为ID,以方便全局调用
b) arg –反射到构造器的通常结果

2. id – ID 结果,将结果集标记为ID,以方便全局调用

3. result – 反射到JavaBean 属性的普通结果

4. association – 复杂类型的结合;多个结果合成的类型

a) nested result mappings – 几resultMap 自身嵌套关联,也可以引用到一个其它上

5. collection –复杂类型集合a collection of complex types

6. nested result mappings – resultMap 的集合,也可以引用到一个其它上

7. discriminator – 使用一个结果值以决定使用哪个resultMap

a) case – 基本一些值的结果映射的case 情形

i. nested result mappings –一个case 情形本身就是一个结果映射,因此也可以包括一些相同的元素,也可以引用一个外部resultMap。

2.1.1 id、result

id、result是最简单的映射,id为主键映射;result其他基本数据库表字段到实体类属性的映射。
  最简单的例子:

  1. <resultMap type="liming.student.manager.data.model.StudentEntity" id="studentResultMap">
  2. <id  property="studentId"        column="STUDENT_ID" javaType="String" jdbcType="VARCHAR"/>
  3. <result property="studentName"       column="STUDENT_NAME" javaType="String" jdbcType="VARCHAR"/>
  4. <result property="studentSex"        column="STUDENT_SEX"  javaType="int" jdbcType="INTEGER"/>
  5. <result property="studentBirthday"   column="STUDENT_BIRTHDAY"  javaType="Date" jdbcType="DATE"/>
  6. <result property="studentPhoto"  column="STUDENT_PHOTO" javaType="byte[]" jdbcType="BLOB" typeHandler="org.apache.ibatis.type.BlobTypeHandler" />
  7. </resultMap>

id、result语句属性配置细节:

属性

描述

property

需要映射到JavaBean 的属性名称。

column

数据表的列名或者标签别名。

javaType

一个完整的类名,或者是一个类型别名。如果你匹配的是一个JavaBean,那MyBatis 通常会自行检测到。然后,如果你是要映射到一个HashMap,那你需要指定javaType 要达到的目的。

jdbcType

数据表支持的类型列表。这个属性只在insert,update 或delete 的时候针对允许空的列有用。JDBC 需要这项,但MyBatis 不需要。如果你是直接针对JDBC 编码,且有允许空的列,而你要指定这项。

typeHandler

使用这个属性可以覆写类型处理器。这项值可以是一个完整的类名,也可以是一个类型别名。

支持的JDBC类型
       为了将来的引用,MyBatis 支持下列JDBC 类型,通过JdbcType 枚举:
BIT,FLOAT,CHAR,TIMESTAMP,OTHER,UNDEFINED,TINYINT,REAL,VARCHAR,BINARY,BLOB,NVARCHAR,SMALLINT,DOUBLE,LONGVARCHAR,VARBINARY,CLOB,NCHAR,INTEGER,NUMERIC,DATE,LONGVARBINARY,BOOLEAN,NCLOB,BIGINT,DECIMAL,TIME,NULL,CURSOR

2.1.2 constructor

我们使用id、result时候,需要定义java实体类的属性映射到数据库表的字段上。这个时候是使用JavaBean实现的。当然我们也可以使用实体类的构造方法来实现值的映射,这个时候是通过构造方法参数的书写的顺序来进行赋值的。
        使用construcotr功能有限(例如使用collection级联查询)。
        上面使用id、result实现的功能就可以改为:

  1. <resultMap type="StudentEntity" id="studentResultMap" >
  2. <constructor>
  3. <idArg javaType="String" column="STUDENT_ID"/>
  4. <arg javaType="String" column="STUDENT_NAME"/>
  5. <arg javaType="String" column="STUDENT_SEX"/>
  6. <arg javaType="Date" column="STUDENT_BIRTHDAY"/>
  7. </constructor>
  8. </resultMap>

当然,我们需要定义StudentEntity实体类的构造方法:

  1. public StudentEntity(String studentID, String studentName, String studentSex, Date studentBirthday){
  2. this.studentID = studentID;
  3. this.studentName = studentName;
  4. this.studentSex = studentSex;
  5. this.studentBirthday = studentBirthday;
  6. }

2.1.3 association联合

联合元素用来处理“一对一”的关系。需要指定映射的Java实体类的属性,属性的javaType(通常MyBatis 自己会识别)。对应的数据库表的列名称。如果想覆写的话返回结果的值,需要指定typeHandler。
不同情况需要告诉MyBatis 如何加载一个联合。MyBatis 可以用两种方式加载:

1. select: 执行一个其它映射的SQL 语句返回一个Java实体类型。较灵活;
2. resultsMap: 使用一个嵌套的结果映射来处理通过join查询结果集,映射成Java实体类型。

例如,一个班级对应一个班主任。
 首先定义好班级中的班主任属性:

  1. private TeacherEntity teacherEntity;

2.1.3.1使用select实现联合

例:班级实体类中有班主任的属性,通过联合在得到一个班级实体时,同时映射出班主任实体。

这样可以直接复用在TeacherMapper.xml文件中定义好的查询teacher根据其ID的select语句。而且不需要修改写好的SQL语句,只需要直接修改resultMap即可。

ClassMapper.xml文件部分内容:

  1. <resultMap type="ClassEntity" id="classResultMap">
  2. <id property="classID" column="CLASS_ID" />
  3. <result property="className" column="CLASS_NAME" />
  4. <result property="classYear" column="CLASS_YEAR" />
  5. <association property="teacherEntity" column="TEACHER_ID" select="getTeacher"/>
  6. </resultMap>
  7. <select id="getClassByID" parameterType="String" resultMap="classResultMap">
  8. SELECT * FROM CLASS_TBL CT
  9. WHERE CT.CLASS_ID = #{classID};
  10. </select>

TeacherMapper.xml文件部分内容:

  1. <resultMap type="TeacherEntity" id="teacherResultMap">
  2. <id property="teacherID" column="TEACHER_ID" />
  3. <result property="teacherName" column="TEACHER_NAME" />
  4. <result property="teacherSex" column="TEACHER_SEX" />
  5. <result property="teacherBirthday" column="TEACHER_BIRTHDAY"/>
  6. <result property="workDate" column="WORK_DATE"/>
  7. <result property="professional" column="PROFESSIONAL"/>
  8. </resultMap>
  9. <select id="getTeacher" parameterType="String"  resultMap="teacherResultMap">
  10. SELECT *
  11. FROM TEACHER_TBL TT
  12. WHERE TT.TEACHER_ID = #{teacherID}
  13. </select>

2.1.3.2使用resultMap实现联合

与上面同样的功能,查询班级,同时查询器班主任。需在association中添加resultMap(在teacher的xml文件中定义好的),新写sql(查询班级表left join教师表),不需要teacher的select。

修改ClassMapper.xml文件部分内容:

  1. <resultMap type="ClassEntity" id="classResultMap">
  2. <id property="classID" column="CLASS_ID" />
  3. <result property="className" column="CLASS_NAME" />
  4. <result property="classYear" column="CLASS_YEAR" />
  5. <association property="teacherEntity" column="TEACHER_ID"  resultMap="teacherResultMap"/>
  6. </resultMap>
  7. <select id="getClassAndTeacher" parameterType="String" resultMap="classResultMap">
  8. SELECT *
  9. FROM CLASS_TBL CT LEFT JOIN TEACHER_TBL TT ON CT.TEACHER_ID = TT.TEACHER_ID
  10. WHERE CT.CLASS_ID = #{classID};
  11. </select>

其中的teacherResultMap请见上面TeacherMapper.xml文件部分内容中。

2.1.4 collection聚集

聚集元素用来处理“一对多”的关系。需要指定映射的Java实体类的属性,属性的javaType(一般为ArrayList);列表中对象的类型ofType(Java实体类);对应的数据库表的列名称;
不同情况需要告诉MyBatis 如何加载一个聚集。MyBatis 可以用两种方式加载:

1. select: 执行一个其它映射的SQL 语句返回一个Java实体类型。较灵活;
2. resultsMap: 使用一个嵌套的结果映射来处理通过join查询结果集,映射成Java实体类型。

例如,一个班级有多个学生。
首先定义班级中的学生列表属性:

  1. private List<StudentEntity> studentList;

2.1.4.1使用select实现聚集

用法和联合很类似,区别在于,这是一对多,所以一般映射过来的都是列表。所以这里需要定义javaType为ArrayList,还需要定义列表中对象的类型ofType,以及必须设置的select的语句名称(需要注意的是,这里的查询student的select语句条件必须是外键classID)。

ClassMapper.xml文件部分内容:

  1. <resultMap type="ClassEntity" id="classResultMap">
  2. <id property="classID" column="CLASS_ID" />
  3. <result property="className" column="CLASS_NAME" />
  4. <result property="classYear" column="CLASS_YEAR" />
  5. <association property="teacherEntity" column="TEACHER_ID"  select="getTeacher"/>
  6. <collection property="studentList" column="CLASS_ID" javaType="ArrayList" ofType="StudentEntity" select="getStudentByClassID"/>
  7. </resultMap>
  8. <select id="getClassByID" parameterType="String" resultMap="classResultMap">
  9. SELECT * FROM CLASS_TBL CT
  10. WHERE CT.CLASS_ID = #{classID};
  11. </select>

StudentMapper.xml文件部分内容:

  1. <!-- java属性,数据库表字段之间的映射定义 -->
  2. <resultMap type="StudentEntity" id="studentResultMap">
  3. <id property="studentID" column="STUDENT_ID" />
  4. <result property="studentName" column="STUDENT_NAME" />
  5. <result property="studentSex" column="STUDENT_SEX" />
  6. <result property="studentBirthday" column="STUDENT_BIRTHDAY" />
  7. </resultMap>
  8. <!-- 查询学生list,根据班级id -->
  9. <select id="getStudentByClassID" parameterType="String" resultMap="studentResultMap">
  10. <include refid="selectStudentAll" />
  11. WHERE ST.CLASS_ID = #{classID}
  12. </select>

2.1.4.2使用resultMap实现聚集

使用resultMap,就需要重写一个sql,left join学生表。

  1. <resultMap type="ClassEntity" id="classResultMap">
  2. <id property="classID" column="CLASS_ID" />
  3. <result property="className" column="CLASS_NAME" />
  4. <result property="classYear" column="CLASS_YEAR" />
  5. <association property="teacherEntity" column="TEACHER_ID"  resultMap="teacherResultMap"/>
  6. <collection property="studentList" column="CLASS_ID" javaType="ArrayList" ofType="StudentEntity" resultMap="studentResultMap"/>
  7. </resultMap>
  8. <select id="getClassAndTeacherStudent" parameterType="String" resultMap="classResultMap">
  9. SELECT *
  10. FROM CLASS_TBL CT
  11. LEFT JOIN STUDENT_TBL ST
  12. ON CT.CLASS_ID = ST.CLASS_ID
  13. LEFT JOIN TEACHER_TBL TT
  14. ON CT.TEACHER_ID = TT.TEACHER_ID
  15. WHERE CT.CLASS_ID = #{classID};
  16. </select>

其中的teacherResultMap请见上面TeacherMapper.xml文件部分内容中。studentResultMap请见上面StudentMapper.xml文件部分内容中。

2.1.5discriminator鉴别器

有时一个单独的数据库查询也许返回很多不同(但是希望有些关联)数据类型的结果集。鉴别器元素就是被设计来处理这个情况的,还有包括类的继承层次结构。鉴别器非常容易理解,因为它的表现很像Java语言中的switch语句。

定义鉴别器指定了column和javaType属性。列是MyBatis查找比较值的地方。JavaType是需要被用来保证等价测试的合适类型(尽管字符串在很多情形下都会有用)。

下面这个例子为,当classId为20000001时,才映射classId属性。

    1. <resultMap type="liming.student.manager.data.model.StudentEntity" id="resultMap_studentEntity_discriminator">
    2. <id  property="studentId"        column="STUDENT_ID" javaType="String" jdbcType="VARCHAR"/>
    3. <result property="studentName"       column="STUDENT_NAME" javaType="String" jdbcType="VARCHAR"/>
    4. <result property="studentSex"        column="STUDENT_SEX"  javaType="int" jdbcType="INTEGER"/>
    5. <result property="studentBirthday"   column="STUDENT_BIRTHDAY"  javaType="Date" jdbcType="DATE"/>
    6. <result property="studentPhoto"  column="STUDENT_PHOTO" javaType="byte[]" jdbcType="BLOB" typeHandler="org.apache.ibatis.type.BlobTypeHandler" />
    7. <result property="placeId"           column="PLACE_ID" javaType="String" jdbcType="VARCHAR"/>
    8. <discriminator column="CLASS_ID" javaType="String" jdbcType="VARCHAR">
    9. <case value="20000001" resultType="liming.student.manager.data.model.StudentEntity" >
    10. <result property="classId" column="CLASS_ID" javaType="String" jdbcType="VARCHAR"/>
    11. </case>
    12. </discriminator>
    13. </resultMap>

MyBatis 总结记录的更多相关文章

  1. mybatis添加记录时返回主键id

    参考:mybatis添加记录时返回主键id 场景 有些时候我们在添加记录成功后希望能直接获取到该记录的主键id值,而不需要再执行一次查询操作.在使用mybatis作为ORM组件时,可以很方便地达到这个 ...

  2. MyBatis 插入记录同时获取主键

    MyBatis 插入记录同时获取主键 MyBatis 插入记录同时获取主键的系统界面 useGeneratedKeys 属性 keyProperty 属性 keyColumn 属性 selectKey ...

  3. MyBatis插入记录时返回主键id的方法

    有时候插入记录之后需要使用到插入记录的主键,通常是再查询一次来获取主键,但是MyBatis插入记录时可以设置成返回主键id,简化操作,方法大致有两种. 对应实体类: public class User ...

  4. Mybatis学习记录(六)----Mybatis的高级映射

    1.一对多查询 1.1 需求 查询订单及订单明细的信息. 1.2 sql语句 确定主查询表:订单表 确定关联查询表:订单明细表 在一对一查询基础上添加订单明细表关联即可. SELECT orders. ...

  5. Mybatis学习记录(五)----Mybatis的动态SQL

    1.  什么是动态sql mybatis核心 对sql语句进行灵活操作,通过表达式进行判断,对sql进行灵活拼接.组装. 1.1 需求 用户信息综合查询列表和用户信息查询列表总数这两个statemen ...

  6. Maven 搭建SpringMvc+Spring+Mybatis详细记录

    总觉得,看比人写的总是那么好,每次搭建框架时都会找博客,找教程来跟着一步一步走,虽然很快搭建成功了,但是经常情况是我并不知道我干了什么,也不记得具体步骤,到底为什么要这么做,今天我详细记录了一下自己搭 ...

  7. MyBatis 开发记录

    1.在classpath下创建log4j.properties # Global logging configuration log4j.rootLogger=DEBUG, stdout # Cons ...

  8. MyBatis 学习记录7 一个Bug引发的思考

    主题 这次学习MyBatis的主题我想记录一个使用起来可能会遇到,但是没有经验的话很不好解决的BUG,在特定情况下很容易发生. 异常 java.lang.IllegalArgumentExceptio ...

  9. MyBatis 学习记录6 TypeHandler

    主题 因为对MyBatis在JDBC数据和Java对象之间数据转化比较感兴趣,所以就记录并学习一下TypeHandler. 使用场景 如上图所示,观察下接口方法就能明白.TypeHandler主要用于 ...

随机推荐

  1. YARN的重启动问题:RM Restart/RM HA/Timeline Server/NM Restart

    ResourceManger Restart ResourceManager负责资源管理和应用的调度,是YARN的核心组件,有可能存在单点失败的问题.ResourceManager Restart是使 ...

  2. rabbitmq .erlang.cookie文件疑惑

    1.安装方式常见的rabbitmq安装方式有两种:rpm安装和二进制安装(编译安装). 2..erlang.cookie是什么.erlang.cookie是erlang实现分布式的必要文件,erlan ...

  3. BZOJ5123 线段树的匹配(树形dp)

    线段树的任意一棵子树都相当于节点数与该子树相同的线段树.于是假装在树形dp即可,记忆化搜索实现,有效状态数是logn级别的. #include<iostream> #include< ...

  4. MT【142】Bachet 问题,进位制

    问题: 满足下面两种限制条件下要想称出40以内的任何整数重量,最少要几个砝码: i)如果砝码只能在天平的某一边; ii)如果砝码可以放在天平的两边. 提示:对于 i)先证明如下事实: \[\textb ...

  5. 编辑器配置 vscode / Atom / Sublime Text

    vscode配置 https://code.visualstudio.com/docs/languages/cpp https://www.zhihu.com/question/30315894/an ...

  6. 沉迷AC自动机无法自拔之:穿越广场 square

    如标题所言,我已经沉迷于AC自动机无法自拔了... 这又是一道AC自动的题,红红火火恍恍惚惚 穿越广场 [问题描述] L 国的仪仗队要穿越首都广场了.首都广场可以看做是一块 N*M 的矩形网格,仪仗队 ...

  7. USACO Section 2.1 Ordered Fractions 解题报告

    题目 题目描述 给定一个数N(1<=N<=160),需要产生所有的分数,这些分数的值必须要在0~1之间.而且每个分数的分母不能超过N.如下例所示: N = 5 产生所有的分数:0/1 1/ ...

  8. Android 图片加载框架 Glide 的用法

    https://github.com/bumptech/glide Android图片加载框架最全解析(一),Glide的基本用法http://blog.csdn.net/guolin_blog/ar ...

  9. loj6070【山东集训第一轮Day4】基因

    题解: 分块对每个块的起点$st[i]$到$n$做一次回文自动机; 由于子串的回文自动机是原串的子图,所以并不需要重新构图,在原来的图上做即可: 做的时候记录某个终点的本质不同的回文串和$sum[i] ...

  10. (转)教你完全理解IO流里的 read(),read(byte[]),read(byte[],int off,int len)以及write

    背景:对于IO部分,总是感觉很虚,不能很好的理解其中的要义,其实仔细分析,掌握其中的规律,一切都会看起来十分的自然. 1 理解 1.1 从头总结 长期以来,java中的InputStream Outp ...