Mybatis入门就看这一篇

Mybatis

1.简介

1.1什么是Mybatis

百度百科: MyBatis 本是apache的一个开源项目iBatis, 2010年这个项目由apache software foundation 迁移到了[google code](https://baike.baidu.com/item/google code/2346604),并且改名为MyBatis 。2013年11月迁移到Github。iBATIS一词来源于“internet”和“abatis”的组合,是一个基于Java的持久层框架。

官方文档: MyBatis 是一款优秀的持久层框架,它支持自定义 SQL、存储过程以及高级映射。MyBatis 免除了几乎所有的 JDBC 代码以及设置参数和获取结果集的工作。MyBatis 可以通过简单的 XML 或注解来配置和映射原始类型、接口和 Java POJO(Plain Old Java Objects,普通老式 Java 对象)为数据库中的记录。

1.2特点

  • 简单易学:本身就很小且简单。没有任何第三方依赖,最简单安装只要两个jar文件+配置几个sql映射文件易于学习,易于使用,通过文档和源代码,可以比较完全的掌握它的设计思路和实现。
  • 灵活:mybatis不会对应用程序或者数据库的现有设计强加任何影响。 sql写在xml里,便于统一管理和优化。通过sql语句可以满足操作数据库的所有需求。
  • 解除sql与程序代码的耦合:通过提供DAO层,将业务逻辑和数据访问逻辑分离,使系统的设计更清晰,更易维护,更易单元测试。sql和代码的分离,提高了可维护性。
  • 提供映射标签,支持对象与数据库的orm字段关系映射
  • 提供对象关系映射标签,支持对象关系组建维护
  • 提供xml标签,支持编写动态sql。

2.第一个Mybatis程序

思路:搭建环境–>导入mybatis–>编写代码–>测试

2.0数据库操作(Navicat)

create database mybatis

use mybatis

create table user (
		id int(20) auto_increment primary key,
		username varchar(30) default null,
		pwd varchar(30) default null
)engine=innodb default charset=utf8;

insert into user(username,pwd) values
('张三',123456),
('李四',123456)

delete from user where id=2

update user set username = '李四' where id =3

select id from user where username = '李四'

2.1.导入mybatis依赖

<dependency>
    <groupId>org.mybatis</groupId>
    <artifactId>mybatis</artifactId>
    <version>3.5.2</version>
 </dependency>

2.2编写MybatisUtils工具类

经常使用

引入Maven项目rescources中的mybatis-config.xml配置文件

String resouce =“mybatis-config.xml”;

调用

import org.apache.ibatis.io.Resources;

Resources.getRescourceAsStream(resouce); 返回输入流

通过SqlSessionFactory (接口)的实现类SqlSessionFactoryBuilder的Builder(输入流)方法得到SqlSessionFactory 的实例

使用SqlSessionFactory 的实例openSession方法获得sqlsession

//  SqlSessionFactory -->  SqlSession
public class MybatisUtils {
    private static SqlSessionFactory sqlSessionFactory;

    static {
        try {
 //使用第一步 创建sqlSessionFactory对象
            String resource = "mybatis-config.xml";
            InputStream inputStream = Resources.getResourceAsStream(resource);
            sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    /**
     * 既然有了 SqlSessionFactory,顾名思义,我们可以从中获得 SqlSession 的实例。
     * SqlSession 提供了在数据库执行 SQL 命令所需的所有方法。你可以通过 SqlSession 实例来直接执行已映射的 SQL 语句
     */
    public static SqlSession getSqlSession() {
        return sqlSessionFactory.openSession();
    }

}

2.3编写mybatis-config.xml配置文件

点击idea右边的database,连接以后,可以看到数据库中的字段

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configuration
        PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
        "http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
    <environments default="development">
        <environment id="development">
            <transactionManager type="JDBC"/>
            <dataSource type="POOLED">
                <property name="driver" value="com.mysql.cj.jdbc.Driver"/>
                <property name="url"
                          value="jdbc:mysql://localhost:3306/mybatis?useUnicode&amp;characterEncoding=utf8&amp;serverTimezone=Asia/Shanghai"/>
                <property name="username" value="root"/>
                <property name="password" value="123456"/>
            </dataSource>
        </environment>
    </environments>
    <!--    每一个 Mapper.xml 都需要在Mybatis核心配置文件中注册!-->
    <mappers>
        <mapper resource="com/wgd/Mapper/UserMapper.xml"/>
    </mappers>
</configuration>

在这里值得注意的是数据库的URL : & 被 &amp; 替换掉

时区(serverTimezone=Asia/Shanghai)和编码(useUnicode&characterEncoding=utf8)

<mappers>
    <mapper resource="com/wgd/Mapper/UserMapper.xml"/>
</mappers>

resource中为实体类对应mapperxml文件 用/隔开 每一个Mapper需要在Mybatis核心配置文件中注册

2.4编写实体类User

private Integer id;
private String username;
private String pwd;

2.5Mapper层的接口

public interface UserMapper {
    List<User> getUserList();
}

2.6编写UserMapper.xml

官方文档:在之前版本的 MyBatis 中,**命名空间(Namespaces)**的作用并不大,是可选的。 但现在,随着命名空间越发重要,你必须指定命名空间。

  • 全限定名(比如 “com.mypackage.MyMapper.selectAllThings)将被直接用于查找及使用。

全限定名为mapper层对应的实体类的Mapper

select标签 id 为方法名 resultType为泛型中的类型

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
        PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
        "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.wgd.mapper.UserMapper">
    <select id="getUserList" resultType="com.wgd.pojo.User">
        select * from mybatis.user
    </select>
</mapper>

2.7测试

调用Mybatis工具类的getSqlSession方法获得SqlSession方法

然后调用Sqlsession的getMapper方法,传入实体类Mapper的Class文件即UserMapper.class

获得UserMapper对象===》调用方法

public class UserMapperTest {

    @Test
    public void test() {
        //第一步 获得SqlSession对象
        SqlSession sqlSession = MybatisUtils.getSqlSession();
        //第二步:执行sql
        //方式一: getMapper
        UserMapper mapper = sqlSession.getMapper(UserMapper.class);
        List<User> userList = mapper.getUserList();
        for (User user : userList) {
            System.out.println(user);
        }
        //关闭sqlSession
        sqlSession.close();
    }
}

2.8易错

1.Mybatis-config.xml
<!--    每一个 Mapper.xml 都需要在Mybatis核心配置文件中注册!-->
<mappers>
    <mapper resource="com/wgd/Mapper/UserMapper.xml"/>
</mappers>
2.UserMapper.xml  命名空间为持节层Mapper的全限定名 语句标签id为方法名,resultType为返回类型全限定名
<mapper namespace="com.wgd.mapper.UserMapper">
    <select id="getUserList" resultType="com.wgd.pojo.User">
        select * from mybatis.user
    </select>
</mapper>    

3.Maven是约定大于配置 有可能配置文件不能正常编译,解决办法是:

 <!--    在 Maven中 约定大于配置 遇到配置文件无法被导出或者生效的问题-->
    <!--    在build配置resources,来防止我们资源导出失败的问题-->
    <build>
        <resources>
            <resource>
                <directory>src/main/java</directory>
                <includes>
                    <include>**/*.properties</include>
                    <include>**/*.xml</include>
                </includes>
                <filtering>true</filtering>
            </resource>
            <resource>
                <directory>src/main/resources</directory>
                <includes>
                    <include>**/*.properties</include>
                    <include>**/*.xml</include>
                </includes>
                <filtering>true</filtering>
            </resource>
        </resources>
    </build>

2.9注意

官方文档:

SqlSessionFactoryBuilder

这个类可以被实例化、使用和丢弃,一旦创建了 SqlSessionFactory,就不再需要它了。 因此 SqlSessionFactoryBuilder 实例的最佳作用域是方法作用域(也就是局部方法变量)。 你可以重用 SqlSessionFactoryBuilder 来创建多个 SqlSessionFactory 实例,但最好还是不要一直保留着它,以保证所有的 XML 解析资源可以被释放给更重要的事情。

SqlSessionFactory

SqlSessionFactory 一旦被创建就应该在应用的运行期间一直存在,没有任何理由丢弃它或重新创建另一个实例。 使用 SqlSessionFactory 的最佳实践是在应用运行期间不要重复创建多次,多次重建 SqlSessionFactory 被视为一种代码“坏习惯”。因此 SqlSessionFactory 的最佳作用域是应用作用域。 有很多方法可以做到,最简单的就是使用单例模式或者静态单例模式。

SqlSession

每个线程都应该有它自己的 SqlSession 实例。SqlSession 的实例不是线程安全的,因此是不能被共享的,所以它的最佳的作用域是请求或方法作用域。 绝对不能将 SqlSession 实例的引用放在一个类的静态域,甚至一个类的实例变量也不行。 也绝不能将 SqlSession 实例的引用放在任何类型的托管作用域中,比如 Servlet 框架中的 HttpSession。 如果你现在正在使用一种 Web 框架,考虑将 SqlSession 放在一个和 HTTP 请求相似的作用域中。 换句话说,每次收到 HTTP 请求,就可以打开一个 SqlSession,返回一个响应后,就关闭它。 这个关闭操作很重要,为了确保每次都能执行关闭操作,你应该把这个关闭操作放到 finally 块中。 下面的示例就是一个确保 SqlSession 关闭的标准模式:

try (SqlSession session = sqlSessionFactory.openSession()) {
  // 你的应用逻辑代码
}

在所有代码中都遵循这种使用模式,可以保证所有数据库资源都能被正确地关闭。

3.CRUD

<select id="getUserList" resultType="com.wgd.pojo.User">
    select *
    from mybatis.user
</select>

<insert id="addUser" parameterType="com.wgd.pojo.User">
    insert into mybatis.user
    values (#{id}, #{username}, #{pwd});
</insert>
<delete id="deleteUser" parameterType="int">
    delete
    from mybatis.user
    where id = #{id};
</delete>

<update id="updateUser" parameterType="com.wgd.pojo.User">
    update mybatis.user
    set username = #{username},
    pwd      = #{pwd}
    where id = #{id};
</update>

注意:

需要提交事务

@Test
public void select() {
    //第一步 获得SqlSession对象
    SqlSession sqlSession = MybatisUtils.getSqlSession();
    //第二步:执行sql
    //方式一: getMapper
    UserMapper mapper = sqlSession.getMapper(UserMapper.class);
    List<User> userList = mapper.getUserList();
    for (User user : userList) {
        System.out.println(user);
    }
    //关闭sqlSession
    sqlSession.close();
}
@Test
public void addUser(){
    SqlSession sqlSession = MybatisUtils.getSqlSession();
    UserMapper mapper = sqlSession.getMapper(UserMapper.class);
    int i = mapper.addUser(new User(null,"zhangsan1","123456"));
    sqlSession.commit();
    sqlSession.close();
}

@Test
public void deltUser(){
    SqlSession sqlSession = MybatisUtils.getSqlSession();
    UserMapper mapper = sqlSession.getMapper(UserMapper.class);
    int i = mapper.deleteUser(11);
    System.out.println(i);
    sqlSession.commit();
    sqlSession.close();
}
@Test
public void update(){
    SqlSession sqlSession = MybatisUtils.getSqlSession();
    UserMapper mapper = sqlSession.getMapper(UserMapper.class);
    int 小米 = mapper.updateUser(new User(10, "小米", "123444"));
    System.out.println(小米);
    sqlSession.commit();
    sqlSession.close();
}

3.1万能的Map

在实际的开发中,由于一个pojo类的字段可能有很多,但是我们只需要填写其中几个 字段就好,所以我们在这样的情况下可以使用Map来作为 parameterType=“map” #{key}

map还可以自定义名字

<update id="updateUser2" parameterType="map">
    update mybatis.user
    set username = #{name}
    where id = #{id};
</update>
@Test
public void update2() {
    SqlSession sqlSession = MybatisUtils.getSqlSession();
    UserMapper mapper = sqlSession.getMapper(UserMapper.class);
    Map<String, Object> map = new HashMap<>();
    map.put("id", 10);
    map.put("name", "小三");
    int i = mapper.updateUser2(map);
    System.out.println(i);
    sqlSession.commit();
    sqlSession.close();
}

3.2模糊查询怎么写?

第一种: 在sql中写死了"%" 会引起sql注入

<mapper namespace="com.wgd.mapper.UserMapper">
<select id="selectLike" parameterType="string" resultType="User">
    select * from mybatis.user where username like "%"#{msg}"%"
</select>

第二种:在java代码中写%

@Test
public void selectLike(){
    SqlSession sqlSession = MybatisUtils.getSqlSession();
    UserMapper mapper = sqlSession.getMapper(UserMapper.class);
    List<User> userList = mapper.selectLike("%张%");
    for (User user : userList) {
        System.out.println(user);
    }
}

sql注入:

select * from user where username = ? or 1= 1 可以查出这个表的所有数据

select * from user where true 可以查出这个表的所有数据

3.3limit实现分页查询

为什么要实现分页查询?

查询大量数据的时候,使用分页查询,每次只查一部分,这样,对数据库的压力就在可控范围内

使用limit实现分页查询

select * from user limit StartIndex,PageSize

*PageNo=(StartIndex-1)PageSize

*StartIndex=(PageNo-1)PageSize

StartIndex: 从哪个下标开始

PageSize:每页展示数据的数量

PageNo:当前页码

SELECT * FROM table LIMIT 5,10; // 检索记录行 6-15  

#为了检索从某一个偏移量到记录集的结束所有的记录行,可以指定第二个参数为 -1:  
#这个在最近的Mysql中已经没有了,被官方视为一个BUG,已经被修复
SELECT * FROM table LIMIT 95,-1; // 检索记录行 96-last.  

#如果只给定一个参数,它表示返回最大的记录行数目:   
SELECT * FROM table LIMIT 5; //检索前 5 个记录行  

#换句话说,LIMIT n 等价于 LIMIT 0,n。 

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-9zM3Ohha-1635868573653)(C:\Users\Jelly\AppData\Roaming\Typora\typora-user-images\image-20211102235425743.png)]

4.配置解析

在mybatis-config.xml中

标签有着自己的顺序

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-0CCE0ur3-1635868573655)(C:\Users\Jelly\AppData\Roaming\Typora\typora-user-images\image-20211102161744719.png)]

核心配置文件: mybatis-config.xml

  • mybatis-config.xml 系统核心配置文件

  • MyBatis 的配置文件包含了会深深影响 MyBatis 行为的设置和属性信息。

  • 能配置的内容如下:

    configuration(配置)
    properties(属性)
    settings(设置)
    typeAliases(类型别名)
    typeHandlers(类型处理器)
    objectFactory(对象工厂)
    plugins(插件)
    environments(环境配置)
    environment(环境变量)
    transactionManager(事务管理器)
    dataSource(数据源)
    databaseIdProvider(数据库厂商标识)
    mappers(映射器)
    <!-- 注意元素节点的顺序!顺序不对会报错 -->
    

    environments元素

    配置MyBatis的多套运行环境,将SQL映射到多个不同的数据库上,必须指定其中一个为默认运行环境(通过default指定)

    具体的一套环境,通过设置id进行区别,id保证唯一!

    <environments default="development">
        <environment id="development">
            <transactionManager type="JDBC">
                <property name="..." value="..."/>
            </transactionManager>
            <dataSource type="POOLED">
                <property name="driver" value="${driver}"/>
                <property name="url" value="${url}"/>
                <property name="username" value="${username}"/>
                <property name="password" value="${password}"/>
            </dataSource>
        </environment>
    </environments>
    
    • dataSource 元素使用标准的 JDBC 数据源接口来配置 JDBC 连接对象的资源。

    • 数据源是必须配置的。

    • 有三种内建的数据源类型

      type="[UNPOOLED|POOLED|JNDI]")
      
    • unpooled:这个数据源的实现只是每次被请求时打开和关闭连接。

    • pooled:这种数据源的实现利用“池”的概念将 JDBC 连接对象组织起来 , 这是一种使得并发 Web 应用快速响应请求的流行处理方式。

    • jndi:这个数据源的实现是为了能在如 Spring 或应用服务器这类容器中使用,容器可以集中或在外部配置数据源,然后放置一个 JNDI 上下文的引用。

    • 数据源也有很多第三方的实现,比如dbcp,c3p0,druid等等…

      namepace 命名空间

      • namespace中文意思:命名空间,作用如下:

        • namespace的命名必须跟某个接口同名
        • 接口中的方法与映射文件中sql语句id应该一一对应
        1. namespace和子元素的id联合保证唯一 , 区别不同的mapper
        2. 绑定DAO接口
        3. namespace命名规则 : 包名+类名

      MyBatis 的真正强大在于它的映射语句,这是它的魔力所在。由于它的异常强大,映射器的 XML 文件就显得相对简单。如果拿它跟具有相同功能的 JDBC 代码进行对比,你会立即发现省掉了将近 95% 的代码。MyBatis 为聚焦于 SQL 而构建,以尽可能地为你减少麻烦。

1.开启日志

<settings>
    <!--        开启默认日志-->
    <setting name="logImpl" value="STDOUT_LOGGING"/>
</settings>

2.设置别名,就是resultType中不用写全限定名了,写类名就好

<typeAliases>
    <!--        设置别名 设置到包-->
    <package name="com.wgd.pojo"/>
</typeAliases>

类型别名是为 Java 类型设置一个短的名字。它只和 XML 配置有关,存在的意义仅在于用来减少类完全限定名的冗余。

<!--配置别名,注意顺序-->
<typeAliases>
   <typeAlias type="com.kuang.pojo.User" alias="User"/>
</typeAliases>

在Mapper的xml中resultType可以写类名了

namespace命名空间对应Mapper类

<mapper namespace="com.wgd.mapper.UserMapper">
<select id="selectLike" parameterType="string" resultType="User">
    select * from mybatis.user where username like "%"#{msg}"%"
</select>

3.在配置文件中绑定Mapper

使用映射器接口实现类的完全限定类名
需要配置文件名称和接口名称一致,并且位于同一目录下

可以将mapper配置文件放在resource文件下,建立对应的包(因为实体类对应的Mapper类要和对应的Mapper配置文件(xxxMapper.xml)在一个目录下,并且名字要一样)

<!--    每一个 Mapper.xml 都需要在Mybatis核心配置文件中注册!-->
<mappers>
    <mapper resource="com/wgd/Mapper/UserMapper.xml"/>
</mappers>
<!-- 使用相对于类路径的资源引用 -->
<mappers>
    <mapper resource="org/mybatis/builder/PostMapper.xml"/>
</mappers>
<!-- 使用完全限定资源定位符(URL) -->
<mappers>
    <mapper url="file:///var/mappers/AuthorMapper.xml"/>
</mappers>
<!--
使用映射器接口实现类的完全限定类名
需要配置文件名称和接口名称一致,并且位于同一目录下
-->
<mappers>
    <mapper class="org.mybatis.builder.AuthorMapper"/>
</mappers>
<!--
将包内的映射器接口实现全部注册为映射器
但是需要配置文件名称和接口名称一致,并且位于同一目录下
-->
<mappers>
    <package name="org.mybatis.builder"/>
</mappers>

4.优化数据库连接,配置properties

<properties resource="db.properties"/>
<environments default="development">
    <environment id="development">
        <transactionManager type="JDBC"/>
        <dataSource type="POOLED">
            <property name="driver" value="${driver}"/>
            <property name="url"
                      value="${url}"/>
            <property name="username" value="${username}"/>
            <property name="password" value="${password}"/>
        </dataSource>
    </environment>
</environments>

注意:

driver=com.mysql.cj.jdbc.Driver
url=jdbc:mysql://localhost:3306/mybatis?useUnicode&characterEncoding=utf8&serverTimezone=Asia/Shanghai
username=root
password=123456

properties中的url中的原xml中的&amp;需要改成&

5.ReslutMap

当实体类属性名与数据库字段名不一致时可以使用ResultMap

mybatis会根据这些查询的列名(会将列名转化为小写,数据库不区分大小写) , 去对应的实体类中查找相应列名的set方法设值 ,

由于找不到setPwd() , 所以password返回null ; 【自动映射】

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-zyA3HgXH-1635868573656)(C:\Users\Jelly\AppData\Roaming\Typora\typora-user-images\image-20211102181916814.png)]

解决方案

方法一:

sql语句 as 起别名对应实体类 因为mybatis是根据查询结果去映射到set方法

 select id , name , pwd as password from user where id = #{id}

方法二:使用结果集映射->ResultMap 【推荐】

<select id="getUserList" resultMap="UserMap">
    select *
    from mybatis.user
</select>
<resultMap id="UserMap" type="user">
    <result property="password" column="pwd"></result>
</resultMap>

resultMap标签中的id 对应 select标签中的resultMap中的值

property对应实体类属性的变量名 column对应数据库中字段名

type为泛型的类型

<resultMap id="UserMap" type="User">
    <!-- id为主键 -->
    <id column="id" property="id"/>
    <!-- column是数据库表的列名 , property是对应实体类的属性名 -->
    <result column="name" property="name"/>
    <result column="pwd" property="password"/>
</resultMap>

<select id="selectUserById" resultMap="UserMap">
    select id , name , pwd from user where id = #{id}
</select>

有参数:

<select id="getUserList" resultMap="UserMap" parameterType="string">
    select *
    from mybatis.user where id=#{id}
</select>
<resultMap id="UserMap" type="user">
    <result property="password" column="pwd"></result>
</resultMap>

6.日志工厂

指定 MyBatis 应该使用哪个日志记录实现

STDOUT_LOGGING为默认日志

<settings>
<setting name="logImpl" value="STDOUT_LOGGING"/>
</settings>

测试,可以看到控制台有大量的输出!我们可以通过这些输出来判断程序到底哪里出了Bug

Log4j

简介:

  • Log4j是Apache的一个开源项目

  • 通过使用Log4j,我们可以控制日志信息输送的目的地:控制台,文本,GUI组件…

  • 我们也可以控制每一条日志的输出格式;

  • 通过定义每一条日志信息的级别,我们能够更加细致地控制日志的生成过程。最令人感兴趣的就是,这些可以通过一个配置文件来灵活地进行配置,而不需要修改应用的代码。

    使用步骤:

    1、导入log4j的包

    <dependency>
        <groupId>log4j</groupId>
        <artifactId>log4j</artifactId>
        <version>1.2.17</version>
    </dependency>
    

    2、log4j.properties配置文件编写

    console:控制台

    #将等级为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/wgd.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设置日志实现

    <settings>
    <setting name="logImpl" value="LOG4J"/>
    </settings>
    

    4、在程序中使用Log4j进行输出!

//注意导包:org.apache.log4j.Logger
static Logger logger = Logger.getLogger(MyTest.class);
@Test
public void selectUser() {
    logger.info("info:进入selectUser方法");
    logger.debug("debug:进入selectUser方法");
    logger.error("error: 进入selectUser方法");
    SqlSession session = MybatisUtils.getSession();
    UserMapper mapper = session.getMapper(UserMapper.class);
    List<User> users = mapper.selectUser();
    for (User user: users){
    System.out.println(user);
    }
    session.close();
}

5、测试,看控制台输出!

  • 使用Log4j 输出日志
  • 可以看到还生成了一个日志的文件 【需要修改file的日志级别】

7.注解开发

8.多对一处理

8.1环境搭建

9.一对多

10.别名

别名	映射的类型
    _byte	byte
    _long	long
    _short	short
    _int	int
    _integer	int
    _double	double
    _float	float
    _boolean	boolean
    string	String
    byte	Byte
    long	Long
    short	Short
    int	Integer
    integer	Integer
    double	Double
    float	Float
    boolean	Boolean
    date	Date
    decimal	BigDecimal
    bigdecimal	BigDecimal
    object	Object
    map	Map
    hashmap	HashMap
    list	List
    arraylist	ArrayList
    collection	Collection
    iterator	Iterator

(UserMapper.class);
List users = mapper.selectUser();
for (User user: users){
System.out.println(user);
}
session.close();
}


5、测试,看控制台输出!

- 使用Log4j 输出日志
- 可以看到还生成了一个日志的文件 【需要修改file的日志级别】

## 7.注解开发

## 8.多对一处理

### 8.1环境搭建

## 9.一对多

## 10.别名

```xml
别名	映射的类型
    _byte	byte
    _long	long
    _short	short
    _int	int
    _integer	int
    _double	double
    _float	float
    _boolean	boolean
    string	String
    byte	Byte
    long	Long
    short	Short
    int	Integer
    integer	Integer
    double	Double
    float	Float
    boolean	Boolean
    date	Date
    decimal	BigDecimal
    bigdecimal	BigDecimal
    object	Object
    map	Map
    hashmap	HashMap
    list	List
    arraylist	ArrayList
    collection	Collection
    iterator	Iterator
  • 3
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值