MyBatis学习(2)

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 + '\'' +
                '}';
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值