<!DOCTYPEmapperPUBLIC"-//mybatis.org//DTD Mapper 3.0//EN""http://mybatis.org/dtd/mybatis-3-mapper.dtd"><!--映射器的配置
namesapce:名称空间指定接口的完全限定名称
--><mappernamespace="com.qf.mapper.UserDao"><!--大量的sql标签
id必须和接口文件中的方法名必须一致
当前接口中的方法有返回值,返回值如果是实体类型或者是List集合
输出映射:resultType必须要指定为当前实体类型的完全限定名称
输入映射 paramterType:如果当前接口中方法形式参数是一个实体类型,写上当前类的完全限定名称
如果形式参数String/int,写成String/int/Integer
mybatis中书写sql语句,也必须使用占位符号 #{实体类的属性名称一致}
--><!--插入用户--><insertid="addUser"parameterType="com.qf.pojo.User">
insert into user(username,gender,age,address) values(#{username},#{gender},#{age},#{address})
</insert><selectid="findAll"resultType="com.qf.pojo.User">
select * from user
</select><!--更新用户--><updateid="updateUser"parameterType="com.qf.pojo.User">
update user set username=#{username},gender = #{gender},age = #{age},address = #{address}
where id = #{id}
</update><!--删除用户--><deleteid="deleteUser"parameterType="int">
delete from user where id = #{id}
</delete></mapper>
1.占位符#{}
<selectid="selectUsersByUserName"parameterType="java.lang.String"resultType="user">
select * from user where username like #{username}
</select><!--select * from user where username like concat(' %’,#{username}, ' %'
其中名为conat(‘%’,#{关键字},‘%’)-->
2.字符串拼接${}
使用字符串拼接符号 ${} 固定写法'%${value}%',不推荐,存在字符串拼接,可能导致sql注入
<selectid="selectUsersByUserName"parameterType="java.lang.String"resultType="com.qf.pojo.User">
select * from user where username like '%${value}%'
</select>
模糊查询实现
@Test
public void testselectUsersByUserName(){
//List<User> users = userDao.selectUsersByUserName("%张%") ;
List<User> users = userDao.selectUsersByUserName("张") ;
if(users!=null || users.size()>0){
for(User user:users){
System.out.println(user);
}
}
}
指定多个条件查询用户
方式1:使用mybatis参数绑定注解方式(推荐)
<!--#{}里面的内容需要和@Param里面的参数名称一致 --><selectid="findUserByMultConditon"resultType="user">
select * from user where username = #{username} and address = #{address}
</select>
//dao层
//启用mybatis的@Param注解--指定绑定参数名称,这个参数名称就是等会需要赋值的参数,自定义(#{参数名称})
User findUserByMultConditon(@Param("username") String name, @Param("address") String addr) ;
方式2:按照参数的顺序进行查询,param1,param2...
<!--指定多个条件查询用户
按照参数的顺序进行查询,param1,param2....依次,不利于管理维护(不推荐)
--><selectid="findUserByMultConditon"resultType="com.qf.pojo.User">
select * from user where username = #{param1} and address = #{param2}
</select>
dao:
User findUserByMultConditon(String name,String addr)
方式3:使用Map集合
<!-- #{}里面的内容需要和map集合的key一致 --><selectid="findUserByMultConditon"resultType="com.qf.pojo.User">
select * from user where username = #{name} and address = #{addr}
</select>
dao:
//使用Map集合接收所有参数 --复杂类型
//User findUserByMultConditon(Map<String,String> map) ;
实现:
Map map = new HashMap() ;
map.put("name","黄老师") ;
map.put("addr","咸阳市") ;
User user = userDao.findUserByMultConditon(map);
方式4:使用自定义vo实体,将参数放在实体中
<!--通过vo实体查询指定的用户
参数形式QueryVo实体类型,里面包含另一个实体属性user属性
获取到QueryVo对象.getUser().getUsername():获取到用户名
一个实体类中的getXxx()里面xxx就是实体类的bean属性
ognl简写表达式 get()去掉,第一个字母小写
--><!--方法参数为对象时,可直接使用#{属性名}进行获取--><selectid="findUserByQueryVo"parameterType="queryvo"resultType="user">
select * from user where username = #{user.username}
</select>
dao:
//通过自定义的实体类,将查询的参数封装到这个类中
User findUserByMultConditon(VoUser voUser) ;
实现:
VoUser voUser = new VoUser() ;
voUser.setName("高圆圆") ;
voUser.setAddr("西安市") ;
User user = userDao.findUserByMultConditon(voUser);
System.out.println(user);
@Data
@NoArgsConstructor
@AllArgsConstructor
public class QueryVo {
private User user ;
}
Mybatis 通过使用内置的日志工厂提供日志功能。内置日志工厂将会把日志工作委托给下面的实现之一:
SLF4J
ApacheCommonsLoggingLog4j2Log4j
JDK logging
MyBatis 内置日志工厂会基于运行时检测信息选择日志委托实现。它会(按上面罗列的顺序)使用第一个查找到的实现。当没有找到这些实现时,将会禁用日志功能
步骤 1:添加 Log4J 的 jar 包
<!--log4j的日志包--><dependency><groupId>log4j</groupId><artifactId>log4j</artifactId><version>1.2.17</version></dependency>
步骤 2:配置 Log4J.properties
# Set root category priority to INFO and its only appender to CONSOLE.
#log4j.rootCategory=INFO, CONSOLE debug info warn error fatal
# 全局日志配置
log4j.rootCategory=debug, CONSOLE, LOGFILE
# Set the enterprise logger category to FATAL and its only appender to CONSOLE.
log4j.logger.org.apache.axis.enterprise=FATAL, CONSOLE
#跟踪具体的接口或者接口中的指定方法
#log4j.logger.com.qf.mapper.UserDao.addEmployee=TRACE,跟踪接口中的指定方法
# 跟踪具体的接口
log4j.logger.com.qf.mapper.EmployeeDao=TRACE
# CONSOLE is set tobe a ConsoleAppender using a PatternLayout.
#控制台输出
log4j.appender.CONSOLE=org.apache.log4j.ConsoleAppender
log4j.appender.CONSOLE.layout=org.apache.log4j.PatternLayout
log4j.appender.CONSOLE.layout.ConversionPattern=%d{ISO8601}%-6r [%15.15t]%-5p %30.30c %x -%m\n
#本地磁盘上产生日志文件
# LOGFILE is set tobe a File appender using a PatternLayout.
log4j.appender.LOGFILE=org.apache.log4j.FileAppender
#自定义产生的日志文件路径
log4j.appender.LOGFILE.File=E:/Java/QFJava/mybatis_exercise/log4j.log
log4j.appender.LOGFILE.Append=true
log4j.appender.LOGFILE.layout=org.apache.log4j.PatternLayout
log4j.appender.LOGFILE.layout.ConversionPattern=%d{ISO8601}%-6r [%15.15t]%-5p %30.30c %x -%m\n