网站如何清除百度收录,app开发定制公司推荐,辽宁省住房和城乡建设厅网站,wordpress 付费模版日志的使用
我们在使用MyBatis的时候, 其实MyBatis框架会打印一些必要的日志信息, 在开发阶段这些日志信息对我们分析问题,理解代码的执行是特别有帮助的; 包括项目上线之后,我们也可以收集项目的错误日志到文件里面去; 所以我们采用专门的日志系统来处理.
步骤
导入坐标拷贝…日志的使用
我们在使用MyBatis的时候, 其实MyBatis框架会打印一些必要的日志信息, 在开发阶段这些日志信息对我们分析问题,理解代码的执行是特别有帮助的; 包括项目上线之后,我们也可以收集项目的错误日志到文件里面去; 所以我们采用专门的日志系统来处理.
步骤
导入坐标拷贝日志配置文件到项目
讲解
• 导入坐标
!--log start--
dependencygroupIdlog4j/groupIdartifactIdlog4j/artifactIdversion1.2.12/version
/dependency
dependencygroupIdorg.slf4j/groupIdartifactIdslf4j-api/artifactIdversion1.6.6/version
/dependency
dependencygroupIdorg.slf4j/groupIdartifactIdslf4j-log4j12/artifactIdversion1.6.6/version
/dependency
!--log end--
• log4j.properties
#日志输出级别最低级别为DEBUG输出到stdout
#error warn info debug trace
log4j.rootLoggerDEBUG,stdout
#输出到控制台
log4j.appender.stdoutorg.apache.log4j.ConsoleAppender
#可以灵活的指定布局模式
log4j.appender.stdout.layoutorg.apache.log4j.PatternLayout
#时间
log4j.appender.stdout.layout.ConversionPattern[%-5p] %t %l %d %rms:%m%n
log4j.appender.fileorg.apache.log4j.FileAppender
log4j.appender.file.FileD:\\test\\mm_backend.log
log4j.appender.file.layoutorg.apache.log4j.PatternLayout
log4j.appender.file.layout.ConversionPattern%d{yyyy-MM-dd HH:mm:ss,SSS\} %-5p [%t] {%c}-%m%n
log4j.rootLoggerINFO, stdout , R
此句为将等级为 INFO 的日志信息输出到 stdout 和 R 这两个目的地stdout 和 R 的定义在下面的代码可 以任意起名。等级可分为 OFF、FATAL、ERROR、WARN、INFO、DEBUG、ALL如果配置 OFF 则不打出任何信息 如果配置为 INFO 这样只显示 INFO, WARN, ERROR 的 log 信息而 DEBUG 信息不会被显示具体讲解可参照 第三部分定义配置文件中的 logger。
使用Mybatis完成CRUD
1.需求
使用Mybatis完成CRUD
新增用户步骤
AspectJ 切面注解中五种通知注解Before、After、AfterRunning、AfterThrowing、Around https://blog.csdn.net/u010502101/article/details/78823056
1. UserDao中添加新增方法
public interface UserDao {/*** 添加用户* param user 要添加到数据库的数据* return 受到影响的行数*/public int addUser(User user);
}
2. 在UserDao.xml中加入新增配置
insert idaddUser parameterTypeUser//因为配置文件里起了别名所以这里直接User就行了不然还是要写全路径。insert into t_user (username,sex,birthdayaddress) values (#{username},#{sex},#{birthday},#{address})//占位符见下面根据id查询的xml里面有说明。
/insert
3. 添加操作测试
public class TestMybatis {private UserDao userDao;private SqlSession sqlSession;private InputStream is;Before//用这个注解执行Test之前会先执行这个方法public void init() throws IOException {//1.让mybatis框架去加载主配置文件//1.1 将主配置文件SqlMapConfig.xml转换成字节输入流is Resources.getResourceAsStream(SqlMapConfig.xml);//1.2创建一个SqlSessionFactoryBuilderSqlSessionFactoryBuilder factoryBuilder new SqlSessionFactoryBuilder();//1.3使用factoryBuilder对象加载字节输入流创建 SqlSessionFactory对象SqlSessionFactory sqlSessionFactory factoryBuilder.build(is);//1.4使用sqlSessionFactory对象创建处SqlSession对象sqlSession sqlSessionFactory.openSession();//使用了工厂模式//2.使用sqlSession对象创建处UserDao接口的代理对象userDao sqlSession.getMapper(UserDao.class);//使用了动态代理}Testpublic void testAddUser(){//3.调用userDao代理对象的addUser()方法添加用户User user new User(null,zl,男,new Date(),成都);//注意这里是nullpojo里面id必须为Integer类型int类型不能为null。userDao.addUser(user);//目标是添加完用户之后获取到该用户的id可以在以后的多表中进行关联查询System.out.println(user.getUid());//这个说明见下面这个}//获取从pojo获取After//同理Test之后执行这个。public void destroy() throws IOException {//提交事务sqlSession.commit();//4.关闭资源sqlSession.close();is.close();}
}
新增用户 id 的返回值
新增用户后 同时还要返回当前新增用户的 id 值因为 id 是由数据库的自动增长来实现的所以就相当于我们要在新增后将自动增长 auto_increment 的值返回。 • SelectKey获取主键
!--我们可以发现 这个 sql 语句中使用#{}字符 #{}代表占位符我们可以理解是原来 jdbc 部分所学的?它们都是代表占位符 具体的值是由 User 类的属性来决定的前提必须名字pojo里面的名字和占位符里面的一样才会给匹配上去。然后sql前面的名字是和数据库里字段名匹配。parameterType 属性代表参数的类型因为我们要传入的是一个类的对象所以类型就写类的全名称。selectKey标签: 查询主键keyColumn 表示要查询的列名keyProperty 表示要赋值的属性名返回的赋值给pojo了resultType 表示查询出来的结果的类型order 表示在前或者在后执行select last_insert_id() 查询最后一个自增长的id的值
--
insert idaddUser parameterTypeUserselectKey resultTypeint orderAFTER keyPropertyuid keyColumnuidselect last_insert_id()/selectKeyinsert into t_user (username, sex, birthday, address) values (#{username}, #{sex}, #{birthday}, #{address})
/insert
根据id查询用户
UserDao添加根据id查询的方法
public User findById(Integer id); UserDao.xml文件中新增配置
select idfindById parameterTypeint resultTypeUserselect * from t_user where uid#{uid}
/select
修改用户
UserDao添加修改的方法
public void updateUser(User user); UserDao.xml文件中新增配置
update idupdateUser parameterTypeUserupdate t_user set username#{username},sex#{sex},birthday#{birthday},address#{address} where uid#{uid}
/update
测试 先调用根据id查询要修改的人的信息再修改。所以xml文件里应该修改所有的信息在这里不能单个修改。
删除用户
UserDao中添加删除方法
public int deleteById(int id); UserDao.xml文件中新增配置
delete iddeleteById parameterTypeintdelete from t_user where uid#{id}
/delete
注意 数据库删除中间的任意一行后比如删除第3个。原来顺序是1234会变成124。就是不是一个完整的顺序了如果想调整成完整的顺序就需要别的操作来操作一下。
模糊查询
方式一不推荐使用
UserDao中添加模糊查询方法
public ListUser searchByUsername(String name); UserDao.xml文件中新增配置
select idsearchByUsername parameterTypeString resultTypeUserselect * from t_user where username like #{name}
/select
测试方法 查询名字里有l的。
Test
public void testSearchByUsername(){ListUser userList userDao.searchByUsername(%l%);for (User user : userList) {System.out.println(user);}
}
方式二
UserDao中添加模糊查询方法
public ListUser searchByUsername(String name); UserDao.xml文件中新增配置
!--模糊查询另外一种在SQL语句中引用方法的参数的方式${}1. 引用pojo中的属性: ${属性名}2. 引用简单类型的参数: ${value}但是高版本的mybatis中可以${任意字符串}
--
select idsearchByUsername parameterTypeString resultTypeUser方式一!--select * from t_user where username like %#{name}%--方式二!--select * from t_user where username like concat(%,#{name},%)--select * from t_user where username like %${value}%
//方式三才是最常用。
/select
测试方法
Test
public void testSearchByUsername(){ListUser userList userDao.searchByUsername(l);//上面三个都是传一个l就行。for (User user : userList) {System.out.println(user);}
}
#{}与${}的区别
#{}一定不能写在引号里面${}一定要写在引号里面因为他是字符串拼接如果是pojo、map类型的参数无论是#{}还是${}里面都是属性名如果是简单类型的参数#{}里面可以写任意字符串但是${}里面只能写value(以前的版本)如果使用#{}引入参数的话其实是先使用?这个占位符然后再设置参数而使用${}引入参数的话是直接拼接SQL语句 建议尽量使用#{}。
SqlSessionFactory工具类的抽取
步骤:
创建SqlSessionFactoryUtils定义一个openSqlSession ()方法获得sqlSession定义释放资源方法保证SqlSessionFactory只有一个(静态代码块)
实现:
package com.gavin.utils;import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;import java.io.IOException;
import java.io.InputStream;/*** 1. 类加载的时候就创建出来了一个SqlSessionFactory对象* 2. 我们得声明一个方法用于创建SqlSession对象,因为每次执行SQL语句的sqlSession对象不能是同一个*/
public class SqlSessionFactoryUtils {private static SqlSessionFactory sqlSessionFactory;static {try{//1 将主配置文件SqlMapConfig.xml转换成字节输入流InputStream is Resources.getResourceAsStream(SqlMapConfig.xml);//2创建一个SqlSessionFactoryBuilderSqlSessionFactoryBuilder factoryBuilder new SqlSessionFactoryBuilder();//3使用factoryBuilder对象加载字节输入流创建 SqlSessionFactory对象sqlSessionFactory factoryBuilder.build(is);is.close();} catch (IOException e) {e.printStackTrace();}}/*** 创建SqlSession对象* return*/public static SqlSession openSqlSession(){return sqlSessionFactory.openSession();}/*** 提交事务并且关闭SqlSession* param sqlSession*/public static void commitAndClose(SqlSession sqlSession){sqlSession.commit();sqlSession.close();}/*** 回滚事务并且关闭SqlSession* param sqlSession*/public static void rollbackAndClose(SqlSession sqlSession){sqlSession.rollback();sqlSession.close();}
}
测试
public class TestSqlSessionFactoryUtils {Testpublic void test1(){//1. 创建SqlSession对象SqlSession sqlSession SqlSessionFactoryUtils.openSqlSession();//2. 创建UserDao的代理对象UserDao userDao sqlSession.getMapper(UserDao.class);//3. 调用userDao对象的findById()方法System.out.println(userDao.findById(6));//4. 关闭资源提交事务SqlSessionFactoryUtils.commitAndClose(sqlSession);}
}
parameterType深入
传递简单类型
单个参数方法就以简单类型传入即可那么在映射配置文件中的parameterType的值就是这个简单类型的别名;在SQL语句中引入简单类型的参数#{任意字符串} User findById(int id); select * from t_user where uid#{id}
传递 pojo 对象 或者 Map
将多个参数封装到一个POJO中,那么在映射配置文件中parameterType的值就是这个POJO的全限定名或者别名; 在SQL语句中引入参数#{POJO的属性名}或者’${POJO的属性名}’将多个参数封装到一个Map中(要封装的参数没有对应的POJO),那么在映射配置文件中parameterType的值是map; 在SQL语句中引入参数#{map的key}或者’${map的key}’
void addUser(User user);void updateUser(Map map);
insert idaddUser parameterTypeUserinsert into t_user (username, sex, birthday, address) values (#{username}, #{sex}, #{birthday}, #{address})
/insertupdate idupdateUser parameterTypemapupdate t_user set username#{username},sex#{sex} where uid#{uid}
/update
Test
public void test2() {SqlSession sqlSession SqlSessionFactoryUtils.openSqlSession();UserDao mapper sqlSession.getMapper(UserDao.class);User user new User(null, 麻子, 男, new Date(), 重庆);mapper.addUser(user);SqlSessionFactoryUtils.commitAndClose(sqlSession);
}Test
public void test3(){SqlSession sqlSession SqlSessionFactoryUtils.openSqlSession();UserDao mapper sqlSession.getMapper(UserDao.class);Map map new HashMap();map.put(username,老八);map.put(sex,女);map.put(uid,7);mapper.updateUser(map);SqlSessionFactoryUtils.commitAndClose(sqlSession);
}
传递多个参数
方式一通过参数索引
User findByUsernameAndAddress(String username, String address);select idfindByUsernameAndAddress resultTypeUserselect * from t_user where username#{arg0} and address#{arg1}
/select
方式二通过注解
Param使用注解指定参数的名称
User findByUsernameAndSex(Param(name) String username,Param(sex) String sex);select idfindByUsernameAndSex resultTypeUserselect * from t_user where username#{name} and sex#{sex}
/select
传递 pojo 包装对象类型
开发中通过 pojo 传递查询条件 查询条件是综合的查询条件不仅包括用户查询条件还包括其它的查询条件比如将用户购买商品信息也作为查询条件这时可以使用包装对象传递输入参数。Pojo 类中包含 pojo。
需求根据用户id查询用户信息并进行分页查询条件放到 QueryVo 的 user 属性中。
QueryVo.java
Data
AllArgsConstructor
NoArgsConstructor
public class QueryVo {public QueryVo(Long currentPage, Integer pageSize, User queryCondition) {this.currentPage currentPage;this.pageSize pageSize;this.queryCondition queryCondition;}private Long currentPage;private Integer pageSize;//查询条件private User queryCondition;private Long offset;public Long getOffset(){return (currentPage-1)*pageSize;}
}
UserDao.java
ListUser searchByCondition(QueryVo queryVo);UserDao.xml
select idsearchByCondition parameterTypeQueryVo resultTypeUserselect * from t_user where sex#{queryCondition.sex} and address#{queryCondition.address}limit #{offset},#{pageSize}
/select
测试
Test
public void test6() {SqlSession sqlSession SqlSessionFactoryUtils.openSqlSession();UserDao mapper sqlSession.getMapper(UserDao.class);User user new User();user.setSex(男);user.setAddress(北京);QueryVo queryVo new QueryVo(1l,5,user);ListUser userList mapper.searchByCondition(queryVo);for (User user1 : userList) {System.out.println(user1);}SqlSessionFactoryUtils.commitAndClose(sqlSession);
}
resultType深入
输出简单类型
查询的结果是单个数据, 映射配置文件中的resultType属性的值就是这个数据的类型
/*** 查询用户的总个数* return*/
Long findTotal();
select idfindTotal resultTypelongselect count(*) from t_user
/select
输出pojo对象(一个pojo对象就对应一行数据)或者一个Map
查询的结果是一行数据: • 将这一行数据存储到POJO对象中, 映射配置文件的resultType的值就是POJO的全限定名或者别名,此时就要求查询结果的字段名和类型 要和POJO的属性名和类型一致
/*** 根据id查询一条数据* param id* return*/
User findById(int id);select idfindById parameterTypeint resultTypeUserselect * from t_user where uid#{uid}
/select
• 将这一行数据存储到Map对象,映射配置文件的resultType的值就是map那么此时查询结果中的字段名就是 map的key字段值就是map的value
/*** 根据用户名查询用户* param username* return*/
Map findByUsername(String username);select idfindByUsername parameterTypestring resultTypemapselect *from t_userwhere username #{username}
/select
输出pojo列表(一个pojo列表就对应多行数据)或者Map的列表
查询的结果是多行数据: • 将多条数据存储到List中映射配置文件的resultType的值就是POJO的别名
ListUser findAll();select idfindAll resultTypeUserselect *from t_user
/select
• 将多条数据存储到List中映射配置文件的resultType的值就是map
ListMap findAll2();select idfindAll2 resultTypemapselect *from t_user
/selectresultMap结果类型
resultType可以指定pojo将查询结果映射为pojo但需要pojo的属性名和sql查询的列名一致方可映射成功。 如果sql查询字段名和pojo的属性名不一致可以通过resultMap将字段名和属性名作一个对应关系 resultMap实质上还需要将查询结果映射到pojo对象中。 resultMap可以实现将查询结果映射为复杂类型的pojo比如在查询结果映射对象中包括pojo和list实现一对一查询和一对多查询。(下次课讲) 那我们今天就来看返回的列名与实体类的属性不一致时的情况. 下次课再接着研究复杂的封
UserInfo
package com.gavin.pojo;import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;import java.io.Serializable;Data
AllArgsConstructor
NoArgsConstructor
public class UserInfo implements Serializable {private Integer userId;private String username;private String userSex;private String userBirthday;private String userAddress;
}UserDao
/*** 查询所有用户信息封装到UserInfo对象* return*/
ListUserInfo findAllUserInfo();UserDao.xml
resultMap iduserInfoMap typeUserInfo autoMappingtrue
Column是数据库字段名id columnuid propertyuserId/idresult columnsex propertyuserSex/resultresult columnbirthday propertyuserBirthday/resultresult columnaddress propertyuserAddress/result
/resultMapselect idfindAllUserInfo resultMapuserInfoMapselect *from t_user
/select
测试
public class TestMybatis {Testpublic void test1() {SqlSession sqlSession SqlSessionFactoryUtils.openSqlSession();UserDao mapper sqlSession.getMapper(UserDao.class);ListUserInfo userInfoList mapper.findAllUserInfo();for (UserInfo userInfo : userInfoList) {System.out.println(userInfo);}SqlSessionFactoryUtils.commitAndClose(sqlSession);}
}
文章转载自: http://www.morning.qtqk.cn.gov.cn.qtqk.cn http://www.morning.kpcdc.cn.gov.cn.kpcdc.cn http://www.morning.taipinghl.cn.gov.cn.taipinghl.cn http://www.morning.tpnx.cn.gov.cn.tpnx.cn http://www.morning.rykmz.cn.gov.cn.rykmz.cn http://www.morning.wynqg.cn.gov.cn.wynqg.cn http://www.morning.ytnn.cn.gov.cn.ytnn.cn http://www.morning.fwllb.cn.gov.cn.fwllb.cn http://www.morning.khxyx.cn.gov.cn.khxyx.cn http://www.morning.nhpmn.cn.gov.cn.nhpmn.cn http://www.morning.gcxfh.cn.gov.cn.gcxfh.cn http://www.morning.rttkl.cn.gov.cn.rttkl.cn http://www.morning.sqqkr.cn.gov.cn.sqqkr.cn http://www.morning.hrpmt.cn.gov.cn.hrpmt.cn http://www.morning.wgqtj.cn.gov.cn.wgqtj.cn http://www.morning.qgdsd.cn.gov.cn.qgdsd.cn http://www.morning.tdfyj.cn.gov.cn.tdfyj.cn http://www.morning.xfncq.cn.gov.cn.xfncq.cn http://www.morning.fkdts.cn.gov.cn.fkdts.cn http://www.morning.msgnx.cn.gov.cn.msgnx.cn http://www.morning.qkgwz.cn.gov.cn.qkgwz.cn http://www.morning.xpqsk.cn.gov.cn.xpqsk.cn http://www.morning.gbsby.cn.gov.cn.gbsby.cn http://www.morning.tqbqb.cn.gov.cn.tqbqb.cn http://www.morning.prmbb.cn.gov.cn.prmbb.cn http://www.morning.jcbjy.cn.gov.cn.jcbjy.cn http://www.morning.yqwrj.cn.gov.cn.yqwrj.cn http://www.morning.pjbhk.cn.gov.cn.pjbhk.cn http://www.morning.yptwn.cn.gov.cn.yptwn.cn http://www.morning.jsljr.cn.gov.cn.jsljr.cn http://www.morning.pqndg.cn.gov.cn.pqndg.cn http://www.morning.cywf.cn.gov.cn.cywf.cn http://www.morning.bmts.cn.gov.cn.bmts.cn http://www.morning.xrlwr.cn.gov.cn.xrlwr.cn http://www.morning.ngmjn.cn.gov.cn.ngmjn.cn http://www.morning.ybgt.cn.gov.cn.ybgt.cn http://www.morning.hmbxd.cn.gov.cn.hmbxd.cn http://www.morning.jmbgl.cn.gov.cn.jmbgl.cn http://www.morning.egmux.cn.gov.cn.egmux.cn http://www.morning.mnygn.cn.gov.cn.mnygn.cn http://www.morning.jwbnm.cn.gov.cn.jwbnm.cn http://www.morning.bmyrl.cn.gov.cn.bmyrl.cn http://www.morning.wbnsf.cn.gov.cn.wbnsf.cn http://www.morning.lzjxn.cn.gov.cn.lzjxn.cn http://www.morning.rxkl.cn.gov.cn.rxkl.cn http://www.morning.prmbb.cn.gov.cn.prmbb.cn http://www.morning.mlnzx.cn.gov.cn.mlnzx.cn http://www.morning.pwksz.cn.gov.cn.pwksz.cn http://www.morning.rnmyw.cn.gov.cn.rnmyw.cn http://www.morning.lywys.cn.gov.cn.lywys.cn http://www.morning.3jiax.cn.gov.cn.3jiax.cn http://www.morning.bzjpn.cn.gov.cn.bzjpn.cn http://www.morning.kzbpx.cn.gov.cn.kzbpx.cn http://www.morning.bxyzr.cn.gov.cn.bxyzr.cn http://www.morning.xwlmr.cn.gov.cn.xwlmr.cn http://www.morning.wlfxn.cn.gov.cn.wlfxn.cn http://www.morning.fqljq.cn.gov.cn.fqljq.cn http://www.morning.hhfwj.cn.gov.cn.hhfwj.cn http://www.morning.kskpx.cn.gov.cn.kskpx.cn http://www.morning.glnmm.cn.gov.cn.glnmm.cn http://www.morning.clpdm.cn.gov.cn.clpdm.cn http://www.morning.sgbss.cn.gov.cn.sgbss.cn http://www.morning.wptrm.cn.gov.cn.wptrm.cn http://www.morning.xymkm.cn.gov.cn.xymkm.cn http://www.morning.ghrhb.cn.gov.cn.ghrhb.cn http://www.morning.djbhz.cn.gov.cn.djbhz.cn http://www.morning.kzdwt.cn.gov.cn.kzdwt.cn http://www.morning.jpkhn.cn.gov.cn.jpkhn.cn http://www.morning.xshkh.cn.gov.cn.xshkh.cn http://www.morning.jstggt.cn.gov.cn.jstggt.cn http://www.morning.zjrnq.cn.gov.cn.zjrnq.cn http://www.morning.bcdqf.cn.gov.cn.bcdqf.cn http://www.morning.kljhr.cn.gov.cn.kljhr.cn http://www.morning.przc.cn.gov.cn.przc.cn http://www.morning.tbstj.cn.gov.cn.tbstj.cn http://www.morning.wtcbl.cn.gov.cn.wtcbl.cn http://www.morning.kdtdh.cn.gov.cn.kdtdh.cn http://www.morning.ypbdr.cn.gov.cn.ypbdr.cn http://www.morning.ylrxd.cn.gov.cn.ylrxd.cn http://www.morning.qsctt.cn.gov.cn.qsctt.cn