mybatis笔记

Maven配置mybatis依赖:

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

Mysql驱动:

<dependency>
  <groupId>mysql</groupId>
  <artifactId>mysql-connector-java</artifactId>
  <version>8.0.13</version>
</dependency>

创建mybatis配置文件:

IDEA放在resources文件夹:
在这里插入图片描述

<?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>
    <!-- 别名 -->
    <typeAliases>
        <package name="pojo"/>
    </typeAliases>
    <!-- 数据库环境 -->
    <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/smbms?zeroDateTimeBehavior=convertToNull"/>
                <property name="username" value="root"/>
                <property name="password" value="188278"/>
            </dataSource>
        </environment>
    </environments>
    <!-- 映射文件 -->
    <mappers>
        <mapper resource="daoMapers/User.xml"/>
    </mappers>

</configuration>

其中,

	<typeAliases>
        <package name="pojo"/>默认名称,指定包下的javabean非限定类名
    </typeAliases>

创建实体类:

在这里插入图片描述

创建DAO层的接口,定义访问数据库的方法:

在这里插入图片描述

创建映射文件,IDEA放在resources文件夹下:
在这里插入图片描述

<?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="dao.UserDao">
    <select id="findById" resultType="User" parameterType="int">
        select * from smbms_user where id = #{id}  #{}中写参数名称
    </select>
</mapper>

Mybatis配置文件中指定映射文件:

<mappers>
        <mapper resource="daoMapers/User.xml"/>
    </mappers>

Namespace值为DAO层的接口,select的id值为接口中方法名。

获取DAO对象:

// 根据 mybatis-config.xml 配置的信息得到 sqlSessionFactory
String resource = "mybatis-config.xml";
InputStream inputStream = Resources.getResourceAsStream(resource);
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
// 然后根据 sqlSessionFactory 得到 session
SqlSession session = sqlSessionFactory.openSession();
UserDao userDao = session.getMapper(UserDao.class);
User user = userDao.findById(3);
session.close();

通过session对象的getMapper方法即可获取dao对象,通常将获取session封装到MybatisUtils类。

查询

如上,使用select标签
Select的parameterType可以是java基础类型,也可以是实体类,但只能传一个参数:
在这里插入图片描述

#{中写实体类中的属性名}

在这里插入图片描述

在这里插入图片描述

自由传入多个参数:
使用@Param注解,不用parameterType属性。
在这里插入图片描述
在这里插入图片描述

#{}中写@Param注解的名称

在这里插入图片描述

Select标签的返回类型:
resultType :直接表示返回类型,直接返回基本数据类型或实体类。如果sql结果集字段名和实体类属性名相同则自动映射,如果数据类型不相同会自动转换。以上就是用的resultType。

resultMap:自己配置结果集到实体类的映射。
在User实体类增加属性:
在这里插入图片描述

映射文件ResultMap:

<select id="findById" parameterType="int" resultMap="r1">
    select u.id as uid,u.userName,u.userCode,u.userPassword,r.id as rid,r,roleName,r.creationTime
        from smbms_user u join smbms_smbms_role
        on u.userRole=r.id
        where uid=#{id}
</select>
<resultMap id="r1" type="User">
    <id column="uid" property="id"/>
    <result column="roleName" property="roleName"/>
</resultMap>

Column为查询结果集中的列名,property是实体类中的属性。
如上,手动映射了id和rolename属性,其他属性自动映射。

一对多映射

使用collection标签
如一个用户(user表)有多个地址(adress表)。在用户实体类中增加adress的List属性:
在这里插入图片描述

映射文件:

<select id="findById" resultMap="r1" parameterType="int">
    select u.id,u.userName,a.id as aid,a.addressDesc from smbms_user u join smbms_address a
    on u.id=a.userId
    where u.id = #{id}
</select>

<resultMap id="r1" type="pojo.User">
    <id column="id" property="id"/>
    <result column="userName" property="userName"/>
    <collection ofType="pojo.Address" property="addressList">
        <id column="aid" property="id"/>
        <result column="addressDesc" property="addressDesc"/>

    </collection>
</resultMap>

使用了collection等嵌套类型将不会自动映射,要想自动映射要加上autoMapping属性或者在配置文件加上:

<settings>
    <setting name="autoMappingBehavior" value="FULL"/>
</settings>

推荐不要自动映射。

多表查询有同名字段id,需要用as取别名。

多对一

用association标签进行嵌套
一个用户(User)只有一个角色(Role),一个角色有多名用户
在User中添加Role属性:
在这里插入图片描述

映射文件:

<select id="findByName" resultMap="r2" parameterType="pojo.User">
    select u.id as uid,u.userName,r.id as rid,r.roleName from smbms_user u join smbms_role r
    on u.userRole=r.id
    where userName = #{userName}
</select>


<resultMap id="r2" type="pojo.User">
    <id column="uid" property="id"/>
    <result column="userName" property="userName"/>
    <association property="role" javaType="Role">
        <id column="rid" property="id"/>
        <result column="roleName" property="roleName"/>
    </association>
</resultMap>

注解方式实现dao层接口
通过注解方式就不用配置映射文件了

public interface UserDao {
    @Select("select * from tab_user where uid=#{id}")
    public User findById(int id);
}

配置文件(mybatis-config.xml)中引入映射:

   <!-- 引入映射文件 -->
    <mappers>
<!--        <mapper class="com.test.dao.UserDao"></mapper>-->
        <package name="com.test.dao"/>
    </mappers>

插入

插入需要调用sqlsession.commit()方法提交后才能插入成功
插入当前日期用now()函数

insert into tab_favorite values(#{rid}, now(), #{uid})

Mybatis使用log4j输出sql执行日志
Pom.xml加入log4j依赖:

<!--日志开始-->
        <dependency>
            <groupId>log4j</groupId>
            <artifactId>log4j</artifactId>
            <version>1.2.17</version>
        </dependency>
        <dependency>
            <groupId>org.slf4j</groupId>
            <artifactId>slf4j-api</artifactId>
            <version>1.7.25</version>
        </dependency>
        <dependency>
            <groupId>org.slf4j</groupId>
            <artifactId>slf4j-log4j12</artifactId>
            <version>1.7.25</version>
            <scope>test</scope>
        </dependency>
        <dependency>
            <groupId>org.slf4j</groupId>
            <artifactId>slf4j-simple</artifactId>
            <version>1.7.25</version>
            <scope>test</scope>
        </dependency>
        <!--日志end-->

Mybatis Generator

可以自动帮我们生成数据库中的实体类,DAO和基础增删查改的映射文件.

pom.xml中加入依赖:

<build>
    <plugins>
      <plugin>
        <groupId>org.mybatis.generator</groupId>
        <artifactId>mybatis-generator-maven-plugin</artifactId>
        <version>1.3.5</version>
        <configuration>
          <!-- 在控制台打印执行日志 -->
          <verbose>true</verbose>
          <!-- 重复生成时会覆盖之前的文件-->
          <overwrite>true</overwrite>
          <configurationFile>src/main/resources/generatorConfig.xml</configurationFile>
        </configuration>
        <!-- 该插件需要使用数据库驱动-->
        <dependencies>
          <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>8.0.13</version>
          </dependency>
        </dependencies>
      </plugin>
    </plugins>

  </build>

resource中创建generatorConfig.xml配置文件:
在这里插入图片描述

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE generatorConfiguration
        PUBLIC "-//mybatis.org//DTD MyBatis Generator Configuration 1.0//EN"
        "http://mybatis.org/dtd/mybatis-generator-config_1_0.dtd">
<generatorConfiguration>
    <!-- context 是逆向工程的主要配置信息 -->
    <!-- id:起个名字 -->
    <!-- targetRuntime:设置生成的文件适用于那个 mybatis 版本 -->
    <context id="default" targetRuntime="MyBatis3">
        <property name="javaFileEncoding" value="UTF-8"/>
        <!--optional,指在创建class时,对注释进行控制-->
        <commentGenerator>
            <property name="suppressDate" value="true"/>
            <!-- 是否去除自动生成的注释 true:是 : false:否 -->
            <property name="suppressAllComments" value="true"/>
        </commentGenerator>
        <!--jdbc的数据库连接 wg_insert 为数据库名字-->
        <jdbcConnection driverClass="com.mysql.cj.jdbc.Driver"
                        connectionURL="jdbc:mysql://localhost:3306/ch04_test2?useUnicode=true&amp;characeterEncoding=utf-8&amp;serverTimezone=UTC" userId="root"
                        password="1234"></jdbcConnection>
        <!--非必须,类型处理器,在数据库类型和java类型之间的转换控制-->
        <javaTypeResolver>
            <!-- 默认情况下数据库中的 decimal,bigInt 在 Java 对应是 sql 下的 BigDecimal 类 -->
            <!-- 不是 double 和 long 类型 -->
            <!-- 使用常用的基本类型代替 sql 包下的引用类型 -->
            <property name="forceBigDecimals" value="false"/>
        </javaTypeResolver>
        <!-- targetPackage:生成的实体类所在的包 -->
        <!-- targetProject:生成的实体类所在的硬盘位置 -->
        <javaModelGenerator targetPackage="com.test.domain.entity"
                            targetProject="src/main/java">
            <!-- 是否允许子包 -->
            <property name="enableSubPackages" value="false"/>
            <!-- 是否对modal添加构造函数 -->
            <property name="constructorBased" value="true"/>
            <!-- 是否清理从数据库中查询出的字符串左右两边的空白字符 -->
            <property name="trimStrings" value="true"/>
            <!-- 建立modal对象是否不可改变 即生成的modal对象不会有setter方法,只有构造方法 -->
            <property name="immutable" value="false"/>
        </javaModelGenerator>
        <!-- targetPackage 和 targetProject:生成的 mapper 文件的包和位置 -->
        <sqlMapGenerator targetPackage="daoMappers"
                         targetProject="src/main/resources">
            <!-- 针对数据库的一个配置,是否把 schema 作为字包名 -->
            <property name="enableSubPackages" value="false"/>
        </sqlMapGenerator>
        <!-- targetPackage 和 targetProject:生成的 interface 文件的包和位置 -->
        <javaClientGenerator type="XMLMAPPER"
                             targetPackage="com.test.dao.interfaces" targetProject="src/main/java">
            <!-- 针对 oracle 数据库的一个配置,是否把 schema 作为字包名 -->
            <property name="enableSubPackages" value="false"/>
        </javaClientGenerator>
        <!-- tableName是数据库中的表名,domainObjectName是生成的JAVA模型名,后面的参数不用改,要生成更多的表就在下面继续加table标签 -->
        <table tableName="course" domainObjectName="Course"
               enableCountByExample="false" enableUpdateByExample="false"
               enableDeleteByExample="false" enableSelectByExample="false"
               selectByExampleQueryId="false"/>
        <table tableName="score" domainObjectName="Score"
               enableCountByExample="false" enableUpdateByExample="false"
               enableDeleteByExample="false" enableSelectByExample="false"
               selectByExampleQueryId="false"/>
        <table tableName="Users" domainObjectName="User"
               enableCountByExample="false" enableUpdateByExample="false"
               enableDeleteByExample="false" enableSelectByExample="false"
               selectByExampleQueryId="false"/>
    </context>
</generatorConfiguration>

如果IDEA提示URI is not registered,alt+shit+enter导入该dtd即可.

数据库中的表:
在这里插入图片描述
generator会根据配置文件中配置的实体类,DAO和映射文件位置来放置生成的文件,我们需先创建:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
双击generate:
在这里插入图片描述
生成了我们配置文件中配置的table的实体类,dao和映射文件:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值