Mybatis流程图
1.在配置文件可能包含有中文注释,导致在编译后中文注释在配置文件乱码抛异常,使用Maven构建需要在pom文件中增加配置;
<!--无法识别properties或者xml文件-->
<build>
<resources>
<resource>
<directory>src/main/java</directory>
<includes>
<include>**/*.properties</include>
<include>**/*.xml</include>
</includes>
<filtering>true</filtering>
</resource>
<resource>
<directory>src/main/resources</directory>
<includes>
<include>**/*.properties</include>
<include>**/*.xml</include>
</includes>
<filtering>true</filtering>
</resource>
</resources>
</build>
<!--在配置文件可能包含有中文注释,导致在编译后中文注释在配置文件乱码抛异常-->
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
</properties>
2.进行模糊查询时尽量在实现方法中使用通配符%,如果在Mapper映射文件中使用可以导致SQL注入问题;
@Test
public void selectUserLike() {
SqlSession sqlSession = MybatisUtils.getSqlSession();
UserMapper mapper = sqlSession.getMapper(UserMapper.class);
List<User> userList = mapper.selectUserLike("%张%");
for (User user : userList) {
System.out.println(user);
}
sqlSession.close();
<select id="selectUserLike" parameterType="String" resultType="User">
SELECT * FROM USER WHERE NAME LIKE #{value}
</select>
3.绑定Mapper映射文件
<!--每个配置文件需要在核心文件中注册,绝对路径方式-->
<mappers>
<mapper resource="com/sunrise/dao/UserMapper.xml"/>
</mappers>
如果使用class文件绑定:1.类名与映射文件名相同;2.类必须与映射文件在同一个包下面。
<mappers>
<!--<mapper resource="com/sunrise/dao/UserMapper.xml"/>-->
<mapper class="com.sunrise.dao.UserMapper"/>
</mappers>
4.解决字段和实体类名称不一致,可以使用ResultMap来实现,resultMap对列名和pojo属性名之间作一个映射关系,高级映射,字段名称可以不一致,通过映射来实现
<resultMap id="UserMap" type="u1">
<!--Mysql数据库字段,对应实体类bean中的一个属性-->
<result column="pwd" property="password"/>
</resultMap>
<!--resultMap对应以上标签中id名称-->
<select id="getUserById" parameterType="int" resultMap="UserMap">
SELECT * FROM USER WHERE ID=#{id}
</select>
5.增加日志功能
<!--使用自带stout-->
<settings>
<setting name="logImpl" value="STDOUT_LOGGING"/>
</settings>
<!--使用log4j-->
<settings>
<setting name="logImpl" value="LOG4J"/>
</settings>
# priority :debug<info<warn<error
#you cannot specify every priority with different file for log4j
log4j.rootLogger=debug,stdout,info,debug,warn,error,console
#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/hello/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/hello/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/hello/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/hello/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
6.使用注解开发时遇到自增主键配置
public interface UserMapper {
@Select("SELECT * FROM USER")
List<User> listGetUser();
//方法中存在多个参数,必须每个参数增加@Param注解
@Select("SELECT * FROM USER WHERE ID=#{id}")
User getUserById(@Param("id") int id);
//参数前使用#可以有效防止SQL注入问题,不建议使用$符号
@Insert("INSERT INTO USER (name,pwd) VALUES (#{name},#{pwd})")
@Options(useGeneratedKeys = true, keyProperty = "id", keyColumn = "id")
int addUser(@Param("name") String name, @Param("pwd") String pwd);
}
7.一对多进行嵌套查询
<select id="getStudent2" resultMap="StudentJoinTeacher2">
SELECT A.sid,A.sname,A.tid,B.name as tname FROM STUDENT A LEFT JOIN TEACHER B ON A.tid=B.id
</select>
<!--resultMap类型-->
<resultMap id="StudentJoinTeacher2" type="Student">
<result property="sid" column="sid"/>
<result property="sname" column="sname"/>
<!--对象使用association,复杂属性需要单独处理-->
<association property="teacher" javaType="Teacher">
<result property="name" column="tname"/>
</association>
</resultMap>
8.多对一嵌套查询
<resultMap id="TeacherStudent" type="Teacher">
<result property="id" column="id"/>
<result property="name" column="name"/>
<!--集合使用collection,ofType通常使用在泛型-->
<collection property="students" ofType="student">
<result property="sid" column="sid"/>
<result property="sname" column="sname"/>
<result property="tid" column="tid"/>
</collection>
</resultMap>