mybatis的复习笔记【来源:bilibili的编程不良人】

mybatis

1.mybatis的引言
定义:mybatis使用来完成数据库操作的半ORM框架【纯ORM Hibernate ORM框架】
ORM:Object Relationship Mapping 对象关系映射
作用:用来操作数据库mysql,oracle,sqlServer等,解决了原始jdbc的中代码冗余的,方便访问数据

1.入门环境与数据的添加
(1).引入依赖

         <!--   mybatis的依赖-->
             <dependency>
               <groupId>org.mybatis</groupId>
               <artifactId>mybatis</artifactId>
               <version>3.5.7</version>
           </dependency>
         <!--    数据库依赖-->
           <dependency>
                <groupId>mysql</groupId>
                <artifactId>mysql-connector-java</artifactId>
                <version>8.0.27</version>
            </dependency>
  (2)mybatis的主配置文件【用来创建SqlSessionFactory】
           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/zt"/>
                   <property name="username" value="root"/>
                   <property name="password" value="12138"/>
               </dataSource>
           </environment>
         </environments> 
         </configuration>
      ```
    (3)获取sqlsession
```java
          //  读取主配置文件
           InputStream resourceAsStream = Resources.getResourceAsStream("mybatis-config.xml");
            //  创建核心对象sqlSessionFactory
           SqlSessionFactory build = new SqlSessionFactoryBuilder().build(resourceAsStream); 
           //  获取sqlSession  sql会话
           SqlSession sqlSession = build.openSession();

(4)创建数据库表user【省略】
(5)实体对象entity.User【省略】
public class User {
private Integer id;
private String name;
private String message;
}
(6)创建DAO的接口
public interface UserDao {int save(User user);}
*注意事项:不能定义方法的重载
*
(7)创建映射文件

<!DOCTYPE mapper
    PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
        "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<!--每个接口dao文件都对应着一个mapper文件
   所以这里必须制指定与那个到接口练习namespace
-->
<mapper namespace="com.example.demo.dao.UserDao">
<!--    id  表示方法的名字
        parameterType  参数
-->
      <insert id="save" parameterType="com.example.demo.entity.User" >
      <!--
      useGenerateKeys="true"   使用数据库自动生成的id策略 ,这属性只对mysql有效【可以不写】
      keyProperty ="id"       主键属性,当使用数据库自动生成策略的时候,将自动生成的主键值付给参数对象的那个属性
       -->
          insert into user values (#{id},#{name},#{message})
      </insert>
</mapper>

(8)注册mapper

<?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/zt"/>
                <property name="username" value="root"/>
                <property name="password" value="12138"/>
            </dataSource>
        </environment>

    </environments>
    <mappers>
        <mapper resource="mapper.xml"/>
     <!--因为我这个是在resource路径下面直接写这个的 如果在目录下面创建的话则com/example/demo/mapper/mapper.xml-->
    </mappers>
</configuration>

(9)结果测试

//        读取主配置文件
        InputStream resourceAsStream = Resources.getResourceAsStream("mybatis-config.xml");
//        创建核心对象sqlSessionFactory
        SqlSessionFactory build = new SqlSessionFactoryBuilder().build(resourceAsStream);
//        获取sqlSession  sql会话
        SqlSession sqlSession = build.openSession();
//       获取dao
        UserDao mapper = sqlSession.getMapper(UserDao.class);
       try {
           User user = new User();
//        user.setId();    
//       可以不写这个如果在数据库中自动生成了id,则可以不用写着一句
//        
           user.setName("球儿");
           user.setMessage("七大临时工之一,跟丁嶋安有点相似,也是一个学百家艺的人,最常用的技能是神格面具,年龄虽然是七个人中最小的,但是思路清晰,武艺高超之人");
           int save = mapper.save(user);
//           提交事务
           sqlSession.commit();
       }catch (Exception e){
           e.printStackTrace();
//           事务回滚
           sqlSession.rollback();
       }finally {
    //      关闭事务
           sqlSession.close();
       }

===mybatis删除修改方法=
注意事项:在增删改的时候的必须要提交事务才行 ,不然则无法添加到数据库
修改
1.创建DAO接口
void uodate(User user);
2.设置xml配置文件

<update id="update" parameterType="com.example.demo.entity.User">
    update user set
         name = #{name},
         message = #{message} where  id = #{id}
</update>

3.测试代码

//        读取主配置文件
        InputStream resourceAsStream = Resources.getResourceAsStream("mybatis-config.xml");
        SqlSessionFactory build = new SqlSessionFactoryBuilder().build(resourceAsStream);
        SqlSession sqlSession = build.openSession();
        try {
            UserDao mapper = sqlSession.getMapper(UserDao.class);
            User user = new User();
            user.setId(16);
            user.setName("马村长");
            user.setMessage("八奇技之一神机百炼的继承人,为人友善,喜欢意气用事,曾一人之力抵挡八个临时工");
            mapper.update(user);
            sqlSession.commit();
        }catch (Exception e){
            e.printStackTrace();
            sqlSession.rollback();
        }finally {
            sqlSession.close();
        }

注意事项
如果修改的时候想 有值则更新 无值则保留原来的值
解决方案:
1 先查再改
2. 动态sql

<update id="update" parameterType="com.example.demo.entity.User">
    update user
      <set>
      <!--
         set 是用来去掉多余的逗号
         test里面的name和message 是 对象user的属性值
       -->
         <if test="name!=null and name!=''">
         name = #{name},
         </if>
         <if test = "mesage!=null and message != ''">
         message = #{message}
         </if>
      </set>
       where  id = #{id}
</update>

删除操作
查询操作
基本跟上面的相似
但是有几个要注意的点
1.sql的复用问题

    <sql id="all">
        select id,name,message from user
    </sql>
    <select id="byId" parameterType="Integer" resultType="com.example.demo.entity.User">
        <include refid="all"></include>
        where id = #{id}
    </select>

2.模糊查询的问题

    <sql id="all">
        select id,name,message from user
    </sql>
    <select id="" parameterType="String" resultType="com.example.demo.entity.User">
        <include refid="all"></include>
        <!--concat为连接符号-->
        where name like concat('%',#{name},'%');
    </select>

3.分页查询的多参数的问题
a.写接口的时候List ByPage(@Param("start) Integer start,@Param(“rows”) Integer rows )
b.

    <sql id="all">
        select id,name,message from user
    </sql>
    <select id=""  resultType="com.example.demo.entity.User">
        <include refid="all"></include>
       limit #{start},#{rows};
    </select>

4.ResultType 和 ResultMap的区别
ResultType 只能封装简单类型的对象 【也就是说对象中没有对象类型的属性】
ResultMap 封装复杂类型的对象======》处理关联关系的【简单类型和复杂类型都能解决】

处理关联关系
处理一对一的关系
1.创建数据库的表

create	table user{
   id int primary key auto_increment;
   name varchar(255);
   num int;
   message_id varchar(10) references message(mess_no); 
}
create table message{
 id int primary key auto_increment;
 mess_no int;
 text varchar(255);
}

2.创建的对应的对象
entity.User
entity.Message

3.创建DAO文件
dao.UserDao
dao.MessageDao

4.书写mapper文件

<mapper namespace="com.example.demo.dao.UserDao">

    <resultMap id="userMap" type="com.example.demo.entity.User">
        <id column="id" property="id"></id>
        <result column="username" property="name"></result>
        <result column="message" property="message"></result>
        <association property="clan" javaType="com.example.demo.entity.Clan">
            <result column="name" property="name"></result>
        </association>
    </resultMap>
    <select id="all" resultMap="userMap">
      select u.id,u.name username,u.message,cl.name
      from user u left join clan cl
          on u.clan_no = cl.num;
  </select>

一对多的关联关系处理

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值