1.1 项目目录
1.2 Log4j日志
简介:
- Log4j是Apache的一个开源项目
- 通过使用Log4j,可以控制日志信息输送的目的地:控制台,文本,GUI组件,也可以控制每一条日志的输出格式。
- 通过定义每一条日志信息的级别,能够更加细致地控制日志的生成过程。通过一个配置文件来灵活地进行配置,而不需要修改应用的代码。
使用步骤:
1、导入log4j的包
<dependency>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
<version>1.2.17</version>
</dependency>
2、配置文件编写
#将等级为DEBUG的日志信息输出到console和file这两个目的地,console和file的定义在下面的代码
log4j.rootLogger=DEBUG,console,file
#控制台输出的相关设置
log4j.appender.console = org.apache.log4j.ConsoleAppender
log4j.appender.console.Target = System.out
log4j.appender.console.Threshold=DEBUG
log4j.appender.console.layout = org.apache.log4j.PatternLayout
log4j.appender.console.layout.ConversionPattern=[%c]-%m%n
#文件输出的相关设置
log4j.appender.file = org.apache.log4j.RollingFileAppender
log4j.appender.file.File=./log/guardwhy.log
log4j.appender.file.MaxFileSize=10mb
log4j.appender.file.Threshold=DEBUG
log4j.appender.file.layout=org.apache.log4j.PatternLayout
log4j.appender.file.layout.ConversionPattern=[%p][%d{yy-MM-dd}][%c]%m%n
#日志输出级别
log4j.logger.org.mybatis=DEBUG
log4j.logger.java.sql=DEBUG
log4j.logger.java.sql.Statement=DEBUG
log4j.logger.java.sql.ResultSet=DEBUG
log4j.logger.java.sql.PreparedStatement=DEBUG
3、setting设置日志实现(在sqlMapConfig.xml设置)
<settings>
<setting name="logImpl" value="LOG4J"/>
</settings>
4、在程序中使用Log4j进行输出!
import org.apache.log4j.Logger;
public class TestUserDao {
// 日志对象,参数为当前类的class
static Logger logger = Logger.getLogger(TestUserDao.class);
@Test
public void testLog4j(){
// 日志级别
logger.info("infoL:进入了testLog4j");
logger.debug("debug:进入了testLog4j");
logger.debug("error:进入了testLog4j");
}
}
5、执行结果
1.3 IF标签
作用:判断条件是否为真,如果为真则将if中字符串接近到SQL语句中。
UserMapper接口
package cn.guardwhy.dao;
import cn.guardwhy.domain.User;
import java.util.List;
/**
* 用户dao的接口
*/
public interface UserMapper {
// 1.根据用户名称和性别查询用户
List<User> findUserByNameAndSex(User user);
}
配置UserMapper.xml
- 根据用户名称和性别查询用户
- if:判断用户名称不为空,且不为空字符串,则作为查询条件。
- if:判断用户性别不为空,且不为空字符串,则作为查询条件。
<!--1.多条件查询-->
<select id="findUserByNameAndSex" resultType="user" parameterType="user">
select * from user where
<!-- 如果username不为空,而且不为空字符串,则做为查询的条件-->
<if test="username!=null and username!=''">
username like '%${username}%'
</if>
<if test="sex!=null and sex!=''">
and sex= #{sex}
</if>
</select>
1.4 Where标签
基本作用:
- where标签就相当于SQL语句中where关键字
- 去掉多余的and,or,where关键字
配置UserMapper.xml
- 根据用户名称和性别查询用户
- if标签写在where标签内部
- if:判断用户名称不为空,且不为空字符串,则作为查询条件。
- if:判断用户性别不为空,且不为空字符串,则作为查询条件。
<!--1.多条件查询-->
<select id="findUserByNameAndSex" resultType="user" parameterType="user">
select * from user
<where>
<!-- 如果username不为空,而且不为空字符串,则做为查询的条件-->
<if test="username!=null and username!=''">
username like '%${username}%'
</if>
<if test="sex!=null and sex!=''">
and sex= #{sex}
</if>
</where>
</select>
测试代码
通过用户名和性别查询多个用户,查询条件是"大"和"男"
@Test
public void testFindUserByNameAndSex(){
// 1.通过工具类得到会话对象
SqlSession sqlSession = MybatisUtils.getSession();
UserMapper mapper = sqlSession.getMapper(UserMapper.class);
// 2.创建对象
User user = new User();
user.setUsername("大");
user.setSex("男");
// 将元素添加到集合中
List<User> list = mapper.findUserByNameAndSex(user);
list.forEach(System.out::println);
sqlSession.close();
}
执行结果
1.5 Set标签
基本作用:更新用户信息的时候,有些表单项为空则不用更新。
- 用在update这个语句,相当于set关键字
- 与if标签配合使用,对有值的字段进行更新,可以去掉多余的逗号。
UserMapper接口
// 更新用户
int updateUser(User user);
配置UserMapper.xml
通过id来更新用户名或性别
- update标签更新用户数据
- 如果username不为空而且不为空串,则更新
- 如果sex不为空而且不为空串,则更新
- 最后加上where条件
<!--2.更新操作-->
<update id="updateUser" parameterType="user">
update user
<set>
<if test="username!=null and username!=''">
username = #{username},
</if>
<if test="sex!=null and sex!=''">
sex=#{sex}
</if>
</set>
where id=#{id}
</update>
测试代码
// 更新操作
@Test
public void testUpdateUser(){
// 1.通过工具类得到会话对象
SqlSession sqlSession = MybatisUtils.getSession();
// 2.会话对象的得到mapper接口代理对象
UserMapper mapper = sqlSession.getMapper(UserMapper.class);
// 3.创建对象
User user = new User(6,"张佳丽",Date.valueOf("1989-11-6"),"女","江州");
// 更新行数
int row = mapper.updateUser(user);
System.out.println("更新了" + row + "行");
}
查询结果
1.6 Foreach标签
1.6.1 参数类型集合
拼接SQL语句,中间用到循环,有一段SQL语句出现多次。
Mapper接口方法
// 批量添加用户
int addUsers(List<User> users);
配置UserMapper.xml
批量新增用户,参数类型是: list
foreach标签的属性 | 作用 |
---|---|
collection | 两个取值:list 表示集合 array 表示数组 |
item | 集合中每个变量名字 |
separator | 每次遍历后添加分隔符 |
#{变量名.属性} | 引用每个属性 |
<!--3.批量添加用户-->
<insert id="addUsers" parameterType="list">
insert into user values
<!--
collection:两个取值:list 表示集合 array 表示数组
item:集合中每个变量名字
separator:每次遍历后添加分隔符
-->
<foreach collection="list" item="user" separator=",">
(null,#{user.username},#{user.birthday}, #{user.sex}, #{user.address})
</foreach>
</insert>
测试代码
// 添加批量元素
@Test
public void testAddUsers(){
// 1.通过工具类得到会话对象
SqlSession sqlSession = MybatisUtils.getSession();
// 2.会话对象的得到mapper接口代理对象
UserMapper mapper = sqlSession.getMapper(UserMapper.class);
// 3.创建集合对象
List<User> users = new ArrayList<>();
users.add(new User(7,"王大辉", Date.valueOf("1988-01-30"),"男","岭西"));
users.add(new User(8,"侯国龙", Date.valueOf("1975-05-08"),"男","江州"));
users.add(new User(9,"杨红英", Date.valueOf("1993-11-01"),"女","江州"));
int row = mapper.addUsers(users);
System.out.println("添加了" + row + "行");
}
执行结果
1.6.2 参数类型数组
mapper接口
// 批量删除用户
int deleteUsers(int[] ids);
配置UserMapper.xml
parameterType 因为内置别名中没有数组类型的参数,所以当参数传递的是list和数组,都写成list。
<!--批量删除用户-->
<delete id="deleteUsers" parameterType="list">
delete from user where id in
<foreach collection="array" open="(" item="id" separator="," close=")">
#{id}
</foreach>
</delete>
测试代码
- 删除多个用户
- 返回影响的行数
// 删除多个用户
@Test
public void testDeleteUsers(){
// 1.通过工具类得到会话对象
SqlSession sqlSession = MybatisUtils.getSession();
// 2.会话对象的得到mapper接口代理对象
UserMapper mapper = sqlSession.getMapper(UserMapper.class);
// 3.定义数组
int[] arrays = {14,15,16};
int row = mapper.deleteUsers(arrays);
System.out.println("删除了" + row + "行");
}
查询结果
1.7 Sql和include标签
基本作用
sql标签:定义一段可以重用的SQL语句。
include标签: 引用上面定义的SQL语句。
mapper接口
// 根据条件查询多个用户
List<User> findUserByCondition(Map<String, Object> condition);
// 根据条件查询有多少用户
int findUserCount(Map<String, Object> condition);
配置UserMapper.xml
<!--定义一个可以重用的代码块-->
<sql id="conditionSql">
<where>
<if test="username!=null and username!=''">
username like '%${username}%'
</if>
<if test="minDate!=null and minDate!=''">
and birthday >= #{minDate}
</if>
<if test="maxDate!=null and maxDate!=''">
and birthday <= #{maxDate}
</if>
</where>
</sql>
<!--
根据条件查询多个用户 map有三个键:username, minDate, maxDate
-->
<select id="findUserByCondition" parameterType="map" resultType="user">
select * from user
<!-- 引用以上代码块-->
<include refid="conditionSql"/>
</select>
<select id="findUserCount" parameterType="map" resultType="int">
select count(*) from user
<!-- 引用以上代码块-->
<include refid="conditionSql"></include>
</select>
测试代码
// 根据条件查询用户
@Test
public void testFindUserByCondition(){
HashMap<String, Object> map = new HashMap<>();
map.put("username", "候");
map.put("minDate","1980-1-1");
map.put("maxDate","1993-12-1");
List<User> userList = userMapper.findUserByCondition(map);
// 遍历集合
userList.forEach(System.out::println);
}
// 根据条件查询用户的个数
@Test
public void testFindUserCount(){
HashMap<String, Object> map = new HashMap<>();
map.put("username", "候");
map.put("minDate","1980-1-1");
map.put("maxDate","1993-12-1");
int count = userMapper.findUserCount(map);
// 输出个数
System.out.println("共有用户" + count + "个");
}
查询结果