MyBatis实现数据的增删查改

MyBatis的配置请参考我的上一篇文章,在上一篇文章的基础上我们实现数据的增删查改。

创建实现增删查改的xml文件,这里才是真正实现增删查改的文件。
创建完后要在配置文件中注册创建好的xml文件:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Config3.0//EN"
    "http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
    <environments default="development">
        <environment id="development">
            <!-- 所支持的事物类型不多,记住这个即可 -->
            <transactionManager type="JDBC"></transactionManager>
            <!-- 配置数据库连接信息 -->
            <!-- 类型POOLED UNPOLED JNDI -->
            <dataSource type="POOLED">
                <property name="driver" value="com.mysql.cj.jdbc.Driver"/>
                <property name="url" value="jdbc:mysql://localhost:3306/learnmybatis?useSSL=false&amp;serverTimezone=UTC&amp;"/>
                <property name="username" value="ffy"/>
                <property name="password" value="root"/>
            </dataSource>
        </environment>
    </environments>
    <!-- 注册userMapper.xml文件,
        userMapper.xml位于com.ffy.mapping这个包下,
        所以resource写成com/ffy/mapping/userMapping.xml
     -->
     <mappers>
        <mapper resource="com/ffy/mapping/userMapper.xml"/>
        <mapper resource="com/ffy/mapping/objectMapper.xml"/>
     </mappers>
</configuration>

在新建的xml文件中增加增删查改标签:

mybatis增删查改##

1.插入数据
- 先创建实体类entity,有些地方叫POJO,或者VO,或者Bean,一般来说,尽量和数据库里的字段一一对应。
- 我们需要另外准备一个mapper.xml,一般来说,对应于一个实体entity,我们会准备一个mapper

<insert 
    id="insertAuthor"
    parameterType="domain.blog.Author"
    keyProperty=""
    useGeneratedKeys=""
>

在userMapper.xml中添加插入标签

<!-- 
            第一行的code name password对应的是数据库里的字段
            而第二行的带# {}的code name password,对应的反而是POJO里的属性
         -->
         <insert id="insertOne" parameterType="com.ffy.POJO.User"
            keyProperty="userId" useGeneratedKeys="true">
            insert into user(code,name,password) values
                (#{code},#{name},#{password})        
         </insert>
         <insert id="insertNoUserId" parameterType="com.ffy.POJO.User"
             keyProperty="userId" useGeneratedKeys="true">
            insert into user(user_id,code,name,password) values
                (#{userId},#{code},#{name},#{password})
         </insert>
         <insert id="insertNoUserIdFull" parameterType="com.ffy.POJO.User"
             >
            insert into user(user_id,code,name,password) values
                (#{userId},#{code},#{name},#{password})
         </insert>

测试代码:

package com.ffy.Test;

import java.io.InputStream;
import java.util.Random;

import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;

import com.ffy.POJO.User;

public class App {
    public static void main(String[] args) {
        //mybatis的配置文件
        String resource="mybaties_conf.xml";
        //使用类加载器加载mybatis的配置文件(它也加载关联的映射文件)
        //下面这个方式,值得琢磨琢磨
        InputStream is=App.class.getClassLoader().getResourceAsStream(resource);
        //构建sqlSession的工厂,mybatis的类,给予输入流去构建
        SqlSessionFactory sessionFactory=new SqlSessionFactoryBuilder().build(is);
        //使用MyBatis提供的Resources类加载mybatis的配置文件(它也加载关联的映射文件)
        //Reader reader=Resources.getResourceAsReader(resource);
        //构建sqlSession的工厂
        //sqlSessionFactory sessionFactory=new SqlSessionFactoryBuilder().build(is);

        //创建能执行映射文件中sql的sqlSession
        SqlSession session=sessionFactory.openSession();

        /**
         * 映射sql的表示字符串
         * me.gocl.mapping.userMapper是userMapper.xml文件中mapper标签的namesapce属性
         * getUser是select标签的id属性值,通过select标签的id属性值就可以找到要执行的SQL
         */
        //无论有没有设置id都是按数据库的现有id自增
//      String statement="com.ffy.mapping.userMapper.insertOne";//映射sql的标识符字符串
//      User user=new User();
//      user.setUserId(100);
//      user.setCode("UC"+(new Random()).nextInt(100));
//      user.setName("ffy");
//      user.setPassword("ffyffy");
//      int count=session.insert(statement,user);
//      session.commit();
//      System.out.println("isnert count:"+count+"as"+user);

        //若设置了id就按设置的id存储,若没有设置id则按数据库的id自增
//      String statement2="com.ffy.mapping.userMapper.insertNoUserId";
//      User user2=new User();
//      user2.setCode("UC2"+(new Random()).nextInt(100));
//      user2.setName("ffy2");
//      user2.setPassword("ffy2ffy2");
//      int count2=session.insert(statement2,user2);
//      session.commit();
//      System.out.println("isnert count:"+count2+"as"+user2);

        //没有设置id的话数据库存储的是数据库现有id自增后的id,返回的id为该类型的默认值(int型则返回0)
        //若设置了id数据库存储的就是自己设置的id,返回的也是自己设置的id
        String statement3="com.ffy.mapping.userMapper.insertNoUserIdFull";
        User user3=new User();
        user3.setUserId(200);
        user3.setCode("UCC"+(new Random()).nextInt(100));
        user3.setName("ffy2");
        user3.setPassword("ffyffy2");
        int count1=session.insert(statement3,user3);
        session.commit();
        System.out.println("count1"+count1+":"+user3);


        session.close();
    }
}

2.删除数据
在userMapper.xml中加入以下标签:

<delete
    id="deleteAuthor"
    parameterType="domain.blog.Author"
>

代码:
xml:

<delete id="deleteById" parameterType="int">
            delete from user where user_id=#{id}
         </delete>

测试代码:

public class TestDelete {
    public static void main(String[] args) {
        String resource="mybaties_conf.xml";
        InputStream is=TestDelete.class.getClassLoader().getResourceAsStream(resource);
        SqlSessionFactory sessionFactory=new SqlSessionFactoryBuilder().build(is);
        SqlSession session=sessionFactory.openSession();

        String statement="com.ffy.mapping.userMapper.deleteById";
        int id=8;

        int count=session.delete(statement,id);
        session.commit();
        System.out.println("delete count"+count);

        session.close();
    }
}

3.更新
在userMapper.xml中加入以下标签:

<update
    id="updateAuthor"
    parameterType="domain.blog.Author"
>

代码:
xml标签

 <update id="updateById" parameterType="com.ffy.POJO.User">
            update user set code=#{code},
                name=#{name},
                password=#{password}
            where user_id=#{userId}
         </update>

测试代码:

public class TestUpdate {
    public static void main(String[] args) {
        String resource="mybaties_conf.xml";
        InputStream is=TestUpdate.class.getClassLoader().getResourceAsStream(resource);
        SqlSessionFactory sessionFactory=new SqlSessionFactoryBuilder().build(is);
        SqlSession session=sessionFactory.openSession();

        String statement="com.ffy.mapping.userMapper.updateById";

        User user=new User();
        user.setUserId(200);
        user.setName("fhy");
        user.setCode("fhy");
        user.setPassword("fhy88fhy88");
        int count=session.update(statement,user);
        session.commit();
        System.out.println("delete count"+count+" as "+user);
        session.close();
    }
}

4.查询(三种方式):
第一种:返回值可以是HashMap或者map,这种方式适合一条记录。实现方式如下:

 <!-- 查询的第一种方式,返回一个值 -->
         <select id="selectById" parameterType="int" resultType="hashmap">
                select * from user where user_id=#{userId}
         </select>

第二种:这种方式可以查询单个记录,也可以多个记录,就看查询结果。但是对于resultType里面的类型,有一个要求,就是属性名要和数据库字段名相吻合。如果不一致,会导致数据无法返回回来。实现方式如下:

 <!-- 查询的第二种方式,返回一个结果集,缺点是实体类属性名字必须与数据库列名一致 -->
         <select id="selectAllUser" resultType="com.ffy.POJO.User">
            select * from user
         </select>

第三种:返回值为resultMap,resultMap是一个标签,需要自己定义,这种方式改善了前两种方式的缺陷。之前一直用resultType,不管是用hashmap,还是我们自己定义的类,看起来都有点小缺陷,遇事mybatis引入了resultMap.利用这个东西,我们就可以把数据库里面的字段,映射成我们的POJO的属性,比resultType灵活多了。实现方式如下:

xml文件:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Config3.0//EN"
    "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
    <!-- 为这个mapper指定一个唯一的namesapce,namespace的值习惯上设置成包名+sql映射文件名,
        例如:namespace="me.gacl.mapping.userMapper"就是me.gacl.mapping(包名)+userMapper(us?)
     -->
     <mapper namespace="com.ffy.mapping.userMapper">

        <!-- 
            resultMap,查询的返回的类型
            type:查询结果返回的实体类的类型
            column:与数据库的字段名相对于
            property:与实体类的属性名相对应
            column与property相互对应
            jdbcType:数据库该字段的类型
         -->
        <resultMap type="com.ffy.POJO.User" id="BaseResultMap">
            <id column="user_id" property="userId" jdbcType="INTEGER"/>
            <result column="code" property="code" jdbcType="VARCHAR"/>
            <result column="name" property="name" jdbcType="VARCHAR"/>
            <result column="password" property="password" jdbcType="VARCHAR"/>
        </resultMap>

         <!-- 
            查询的第三种方式 
            resultMap="BaseResultMap"对应上文定义的resultMap
         -->
         <select id="getAllUsers" resultMap="BaseResultMap">
             select * from user
        </select>

     </mapper>

完整的xml文件:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Config3.0//EN"
    "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
    <!-- 为这个mapper指定一个唯一的namesapce,namespace的值习惯上设置成包名+sql映射文件名,
        例如:namespace="me.gacl.mapping.userMapper"就是me.gacl.mapping(包名)+userMapper(us?)
     -->
     <mapper namespace="com.ffy.mapping.userMapper">

        <resultMap type="com.ffy.POJO.User" id="BaseResultMap">
            <id column="user_id" property="userId" jdbcType="INTEGER"/>
            <result column="code" property="code" jdbcType="VARCHAR"/>
            <result column="name" property="name" jdbcType="VARCHAR"/>
            <result column="password" property="password" jdbcType="VARCHAR"/>
        </resultMap>

        <!-- 
            第一行的code name password对应的是数据库里的字段
            而第二行的带# {}的code name password,对应的反而是POJO里的属性
         -->
         <insert id="insertOne" parameterType="com.ffy.POJO.User"
            keyProperty="userId" useGeneratedKeys="true">
            insert into user(code,name,password) values
                (#{code},#{name},#{password})        
         </insert>
         <insert id="insertNoUserId" parameterType="com.ffy.POJO.User"
             keyProperty="userId" useGeneratedKeys="true">
            insert into user(user_id,code,name,password) values
                (#{userId},#{code},#{name},#{password})
         </insert>
         <insert id="insertNoUserIdFull" parameterType="com.ffy.POJO.User"
             >
            insert into user(user_id,code,name,password) values
                (#{userId},#{code},#{name},#{password})
         </insert>


         <delete id="deleteById" parameterType="int">
            delete from user where user_id=#{id}
         </delete>

         <update id="updateById" parameterType="com.ffy.POJO.User">
            update user set code=#{code},
                name=#{name},
                password=#{password}
            where user_id=#{userId}
         </update>

         <!-- 查询的第一种方式,返回一个值 -->
         <select id="selectById" parameterType="int" resultType="hashmap">
                select * from user where user_id=#{userId}
         </select>

         <!-- 查询的第二种方式,返回一个结果集,缺点是实体类属性名字必须与数据库列名一致 -->
         <select id="selectAllUser" resultType="com.ffy.POJO.User">
            select * from user
         </select>

         <!-- 查询的第三种方式 -->
         <select id="getAllUsers" resultMap="BaseResultMap">
             select * from user
        </select>

     </mapper>

三种方式的测试代码:

package com.ffy.Test;

import java.io.InputStream;
import java.util.List;
import java.util.Map;

import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;

import com.ffy.POJO.User;

public class TestSelect {
    public static void main(String[] args) {
        String resource="mybaties_conf.xml";
        InputStream is=TestSelect.class.getClassLoader().getResourceAsStream(resource);
        SqlSessionFactory sessionFactory=new SqlSessionFactoryBuilder().build(is);
        SqlSession session=sessionFactory.openSession();

//      String statement="com.ffy.mapping.userMapper.selectById";
        //执行查询返回一个唯一user对象的sql
//      Map<String, Object> map=session.selectOne(statement,200);
//      for(String key:map.keySet()){
//          System.out.println(key+"="+map.get(key));
//      }

//      String statement2="com.ffy.mapping.objectMapper.getAllObjects";
//      List<Object> objects=session.selectList(statement2);
//      
//      for(Object obj:objects){
//          System.out.println(obj);
//      }

//      String statement3="com.ffy.mapping.userMapper.selectAllUser";
//      List<User> users=session.selectList(statement3);
//      for(User u:users){
//          System.out.println(u);
//      }

        String statement4="com.ffy.mapping.userMapper.getAllUsers";
        //执行查询返回一个唯一user对象的sql
        List<User> users=session.selectList(statement4);
        for(User u:users){
            System.out.println(u);
        }
        session.close();

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值