MyBatis
文章目录
1.配置之映射器
注册绑定mapper配置文件
方式一:
<!-- 使用相对于类路径的资源引用 -->
<mappers>
<mapper resource="org/mybatis/builder/AuthorMapper.xml"/>
</mappers>
推荐使用第一种!!!
方式二:
<!-- 使用映射器接口实现类的完全限定类名 -->
<mappers>
<mapper class="org.mybatis.builder.AuthorMapper"/>
</mappers>
注意点:
- 接口和它的mapper配置文件必须同名
- 接口和它的mapper配置文件必须在同一个包下
方式三
<!-- 将包内的映射器接口实现全部注册为映射器 -->
<mappers>
<package name="org.mybatis.builder"/>
</mappers>
注意点:
- 接口和它的mapper配置文件必须同名
- 接口和它的mapper配置文件必须在同一个包下
2.ResultMap结果集映射
问题:若是pojo类的属性和数据库中表的字段不一致,会出现查询结果为空的现象
解决:
1.在sql语句中,给字段添加和pojo类的属性一致的别名
2.结果集映射
<resultMap id="map" type="user">
<!--column对应数据库中字段,proper对应pojo实体类中的属性,id和查询语句中的resultMap中的id对应-->
<result column="id" property="id"></result>
<result column="userCode" property="userCode"></result>
<result column="userName" property="userName"></result>
</resultMap>
ResultMap 的设计思想是,对简单的语句做到零配置,对于复杂一点的语句,只需要描述语句之间的关系就行了
3.日志工厂
需要掌握的日志:LOG4J,STDOUT_LOGGING
<settings>
<setting name="logImpl" value="STDOUT_LOGGING"/>
</settings>
STDOUT_LOGGING不需要导包,可以直接使用
Opening JDBC Connection
Created connection 2110756088.
Setting autocommit to false on JDBC Connection [com.mysql.cj.jdbc.ConnectionImpl@7dcf94f8]
==> Preparing: select * from smbms.smbms_user where userName like "%"?"%"
==> Parameters: 张(String)
<== Columns: id, userCode, userName, userPassword, gender, birthday, phone, address, userRole, createdBy, creationDate, modifyBy, modifyDate
<== Row: 6, zhanghua, 张华, 0000000, 1, 1983-06-15, 13544561111, 北京市海淀区学院路61号, 3, 1, 2013-02-11 10:51:17, null, null
<== Row: 12, zhangchen, 张晨, 0000000, 1, 1986-03-28, 18098765434, 朝阳区管庄路口北柏林爱乐三期13号楼, 3, 1, 2016-08-09 05:52:37, 1, 2016-04-14 14:15:36
<== Total: 2
6zhanghua张华
12zhangchen张晨
Resetting autocommit to true on JDBC Connection [com.mysql.cj.jdbc.ConnectionImpl@7dcf94f8]
Closing JDBC Connection [com.mysql.cj.jdbc.ConnectionImpl@7dcf94f8]
Returned connection 2110756088 to pool.
LOG4J
是什么:
- Log4j是Apache的一个开放源代码项目,通过使用Log4j,我们可以控制日志信息输送的目的地是控制台、文件、GUI组件,甚至是套接口服务器、NT的事件记录器、UNIX Syslog守护进程等;我们也可以控制每一条日志的输出格式
- 可以控制每一条日志的输出格式
- 通过定义每一条日志信息的级别,我们能够更加细致地控制日志的生成过程
- 通过一个配置文件来灵活地进行配置,而不需要修改应用的代码。
maven依赖:
<!-- https://mvnrepository.com/artifact/log4j/log4j -->
<dependency>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
<version>1.2.17</version>
</dependency>
log4j资源配置文件:
#将等级为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/fish.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
设置日志级别:
static Logger logger = Logger.getLogger(UserMapperTest.class);
logger.info("info:------>info");
logger.debug("debug:------->debug");
logger.error("error:------->error");
4.分页
为什么要分页
- 减少数据的处理量
limit分页:
select * from user limit stratIndex,pageSize
rowBounds分页:
java代码层次来实现分页,不经常使用
RowBounds rowBounds=new rowBounds(startIndex,pageSize);
sqlSession.selectList("com.fish.dao.userMapper.getUserByRowBounds",null,rowBounds);
分页插件
MyBatis pageHelper---->公司有需要可以使用
5.使用注解开发
5.1面向接口编程
根本原因:解耦
理解:
-
从更深层次的理解,应是定义(约束)与实现的分离
-
接口本身反映了系统设计人员对系统的抽象理解
-
分类:
一类是对一个个体的抽象,对应一个抽象体
一类是对一个个体某方面的抽象,形成一个抽象面
5.2核心
底层主要使用java的反射机制,来解析class文件
接口:sql语句中的参数需要和注解参数一致
@Select("select * from smbms_user where userCode=#{userName}")
public User getUserByUserName(@param("userName") String userName);
mapper注册
<mappers>
<mapper class="com.fish.dao.UserMapper"></mapper>
</mappers>
测试
@Test
public void getAdmin(){
SqlSession sqlSession = MybatisUtil.getSqlSession();
UserMapper mapper = sqlSession.getMapper(UserMapper.class);
User admin = mapper.getUserByUserName("admin");
System.out.println(admin);
}
其余的增删改同样
注意:#{} 很大程度上能够防止sql注入,${}不能防止sql注入
6.Lombok的使用
IDEA插件:lombok
maven依赖
<!-- https://mvnrepository.com/artifact/org.projectlombok/lombok -->
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.18.12</version>
</dependency>
注释:
- @data:无参构造,get,set,toString,hashcode,equals
- @AllArgsConstructor,有参构造
- @NoArgsConstructor,无参构造
- …
@Data
public class User {
private Integer id; //id
private String userCode; //用户编码
}
7.多表联合查询
多对一:
结果集映射时,复杂的属性,需要单独处理
- 对象:association
- 集合:collection
联表查询:
<select id="searchUserRole" resultMap="sMap">
select u.id id,u.userName name,r.roleName roleName from smbms_user u,smbms_role r where u.userRole=r.id
</select>
<resultMap id="sMap" type="user">
<result property="id" column="id"></result>
<result property="userName" column="name"></result>
<!--此处的property对应的是user实体类中的role属性,javaType代表属性对象-->
<association property="role" javaType="role">
<!--此处的property对应的是role实体类中对应的属性,column对应的是sql查询中的别名-->
<result property="roleName" column="roleName"></result>
</association>
</resultMap>
user实体类:
@Data
public class User {
private Integer id; //id
private String userCode; //用户编码
private String userName; //用户名称
private String userRole; //用户角色
private Role role;
public Integer getAge() {
Date date = new Date();
Integer age = date.getYear()-birthday.getYear();
return age;
}
}
role实体类:
public class Role {
private Integer id; //id
private String roleCode; //角色编码
private String roleName; //角色名称
private Integer createdBy; //创建者
private Date creationDate; //创建时间
private Integer modifyBy; //更新者
private Date modifyDate;//更新时间
@Override
public String toString() {
return "Role{" +
"roleName='" + roleName + '\'' +
'}';
}
}