1.curd(增删查改)
<mapper namespace="Dao.StudentDao">
<!--查-->
<select id="selectStudent" resultType="pojo.Student">
select * from student where id = #{id}
</select>
<!--增-->
<insert id="add" parameterType="pojo.Student">
insert into student values(#{Id},#{Name})
</insert>
<!--删-->
<delete id="delete" parameterType="int">
delete from student
<where>
id =#{id}
</where>
</delete>
<!--改-->
<update id="update" parameterType="pojo.Student">
update student set name = '${Name}'
<where>
id =${Id}
</where>
</update>
</mapper>
2.日志
常用日志类别:log4j,
使用log4j的步骤:
①设置日志为log4j
<settings>
<setting name="logImpl" value="LOG4J"/>
</settings>
②导入依赖
③创建一个log4j的xml配置文件,配置如下,可做修改:
# priority :debug<info<warn<error
#you cannot specify every priority with different file for log4j
log4j.rootLogger=debug,stdout,info,debug,warn,error
#console
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern= [%d{yyyy-MM-dd HH:mm:ss a}]:%p %l%m%n
#info log
log4j.logger.info=info
log4j.appender.info=org.apache.log4j.DailyRollingFileAppender
log4j.appender.info.DatePattern='_'yyyy-MM-dd'.log'
log4j.appender.info.File=./src/com/hp/log/info.log
log4j.appender.info.Append=true
log4j.appender.info.Threshold=INFO
log4j.appender.info.layout=org.apache.log4j.PatternLayout
log4j.appender.info.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss a} [Thread: %t][ Class:%c >> Method: %l ]%n%p:%m%n
#debug log
log4j.logger.debug=debug
log4j.appender.debug=org.apache.log4j.DailyRollingFileAppender
log4j.appender.debug.DatePattern='_'yyyy-MM-dd'.log'
log4j.appender.debug.File=./src/com/hp/log/debug.log
log4j.appender.debug.Append=true
log4j.appender.debug.Threshold=DEBUG
log4j.appender.debug.layout=org.apache.log4j.PatternLayout
log4j.appender.debug.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss a} [Thread: %t][ Class:%c >> Method: %l ]%n%p:%m%n
#warn log
log4j.logger.warn=warn
log4j.appender.warn=org.apache.log4j.DailyRollingFileAppender
log4j.appender.warn.DatePattern='_'yyyy-MM-dd'.log'
log4j.appender.warn.File=./src/com/hp/log/warn.log
log4j.appender.warn.Append=true
log4j.appender.warn.Threshold=WARN
log4j.appender.warn.layout=org.apache.log4j.PatternLayout
log4j.appender.warn.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss a} [Thread: %t][ Class:%c >> Method: %l ]%n%p:%m%n
#error
log4j.logger.error=error
log4j.appender.error = org.apache.log4j.DailyRollingFileAppender
log4j.appender.error.DatePattern='_'yyyy-MM-dd'.log'
log4j.appender.error.File = ./src/com/hp/log/error.log
log4j.appender.error.Append = true
log4j.appender.error.Threshold = ERROR
log4j.appender.error.layout = org.apache.log4j.PatternLayout
log4j.appender.error.layout.ConversionPattern = %d{yyyy-MM-dd HH:mm:ss a} [Thread: %t][ Class:%c >> Method: %l ]%n%p:%m%n
④在要打印日志的类中实现logger类即可使用相应的日志方法。如:
public class test {
static Logger logger=Logger.getLogger(test.class);
public static void main(String args[]) throws IOException {
logger.info("开始执行测试");
Reader reader= Resources.getResourceAsReader("MapperConfigure.xml");
SqlSessionFactory sqlSessionFactory=new SqlSessionFactoryBuilder().build(reader);
SqlSession sqlSession=sqlSessionFactory.openSession();
}
}
3.注解开发
说明:一般只在简单的接口方法上面使用注解,对于复杂的sql语句,还是需要在mapper.xml中配置resultMap来映射复杂的结果集。
使用方法:直接在接口方法上加上注解,注解参数是对应的sql语句,如@select(“select * from student where id=#{StudentId}”)
@Param注解的使用
这个注解一般只使用在基本类型并且多个参数,且参数名称与sql语句中#{}中的参数名称不一致的时候。对于引用数据类型是不使用的,因为在#{}中使用的是引用对象的属性名称,即id,你改变了student的名称无用。
4. 一对多
association 标签用来设置一个对象,collection 标签用来设置一个集合
一对多的实现:
<!--一对多实现方法一-->
<!--<select id="getAllSchoolStudent" resultMap="SchoolStudent">-->
<!--SELECT * FROM student JOIN student_school ON student.id=student_school.studentId JOIN school ON school.schoolId=student_school.schoolId WHERE school.schoolId=#{schoolId}-->
<!--</select>-->
<!--<resultMap id="SchoolStudent" type="School">-->
<!--<result property="sid" column="schoolId"/>-->
<!--<result property="schoolName" column="schoolName"/>-->
<!--<collection property="students" ofType="Student" javaType="ArrayList">-->
<!--<result property="Id" column="id" />-->
<!--<result property="Name" column="name"/>-->
<!--<result property="schoolId" column="schoolId"/>-->
<!--</collection>-->
<!--</resultMap>-->
<!--一对多实现方法二-->
<select id="getAllSchoolStudent" resultMap="SchoolStudent">
SELECT * From school where schoolId=#{id}
</select>
<resultMap id="SchoolStudent" type="School">
<result property="sid" column="schoolId"/>
<result property="schoolName" column="schoolName"/>
<collection property="students" ofType="Student" javaType="ArrayList">
<result property="Id" column="id" />
<result property="Name" column="name"/>
<result property="schoolId" column="schoolId"/>
</collection>
</resultMap>
<select id="getAllStudent" resultType="Student">
select * from student join student_school on id=student_school.studentId where id =#{id}
</select>
5.动态sql
动态sql常用的有①where-if ②set-if ③choose-when-otherwise ④foreach
使用方法如下:
①使用where-if语句,如果子句开头是and或者or结尾,会自动被删掉(如果想使用and和or之外的其他,将where标签换为trim,可以自定义删除开头)
<select id="getAllSchoolStudent" resultMap="SchoolStudent" parameterType="map">
SELECT * FROM student JOIN student_school ON student.id=student_school.studentId JOIN school ON school.schoolId=student_school.schoolId
<where>
<if test="sid!=null">
school.schoolId=#{sid}
</if>
<if test="studentName!=null">
and name=#{studentName}
</if>
</where>
</select>
② 使用choose语句来选择条件,类似于java的switch语句,有满足的条件则不选择后面的了,如果所有都不满足则选择otherwise
<select id="getAllSchoolStudent" resultMap="SchoolStudent" parameterType="map">
SELECT * FROM student JOIN student_school ON student.id=student_school.studentId JOIN school ON school.schoolId=student_school.schoolId
<where>
<choose>
<when test="sid!=null">
and school.schoolId=#{sid}
</when>
<when test="studentName!=null">
and name=#{studentName}
</when>
<otherwise>
and 1==1
</otherwise>
</choose>
</where>
</select>
③ 使用set语句,可以删掉最后一个逗号,当然也可以使用trim自定义,如果说一个条件都不满足那没必要执行修改了吧!
<update id="update" parameterType="map">
update school
<set>
<if test="schoolName!=null">
schoolName=#{schoolName},
</if>
</set>
</update>
④ foreach语句,一般用于遍历得到sql的in( ,)的参数
<select id="selectStudentByList" parameterType="list" resultType="Student">
select * from student where id in
<foreach collection="list" index="index" item="item" open="(" separator="," close=")">
#{item}
</foreach>
</select>
6.缓存机制
mybatis分为一级缓存和二级缓存
一级缓存的作用域是同一个sqlSession对象,二级缓存的作用域是一个namespace,即同一个mapper下的接口,如果sqlSeesion关闭了,那么会查看是否开启二级缓存,如果开启,则将缓存信息存入二级缓存中,否则缓存数据消失;一级缓存是一直存在的,不需要手动开启。
使用二级缓存的步骤:
①开启缓存功能:<setting name="lazyLoadingEnabled" value="false"/>
②<cache/>
开启二级缓存
下面是开启二级缓存的情况下,执行的流程: