MyBatis的CRUD

MyBatis的CRUD

一、关于namespace

在之前版本的 MyBatis 中,命名空间(Namespaces)的作用并不大,是可选的。 但现在,随着命名空间越发重要,你必须指定命名空间。
命名空间的作用有两个,一个是利用更长的全限定名来将不同的语句隔离开来,同时也实现了你上面见到的接口绑定。就算你觉得暂时用不到接口绑定,你也应该遵循这里的规定,以防哪天你改变了主意。 长远来看,只要将命名空间置于合适的 Java 包命名空间之中,你的代码会变得更加整洁,也有利于你更方便地使用 MyBatis。
命名解析:为了减少输入量,MyBatis 对所有具有名称的配置元素(包括语句,结果映射,缓存等)使用了如下的命名解析规则。
全限定名(比如 “com.mypackage.MyMapper.selectAllThings)将被直接用于查找及使用。
短名称(比如 “selectAllThings”)如果全局唯一也可以作为一个单独的引用。 如果不唯一,有两个或两个以上的相同名称(比如 “com.foo.selectAllThings” 和 “com.bar.selectAllThings”),那么使用时就会产生“短名称不唯一”的错误,这种情况下就必须使用全限定名。
所以配置文件中namespace中的名称为对应Mapper接口或者Dao接口的完整包名,必须一致!

二、CRUD

环境的准备跟上一篇文章一样,可以去看看

select
1、使用

select标签是mybatis中最常用的标签之一,select语句有很多属性可以详细配置每一条SQL语句

SQL语句返回值类型。【完整的类名或者别名】

传入SQL语句的参数类型 。【万能的Map,可以多尝试使用】,命名空间中唯一的标识符

<select id="selectUser" parameterType="int" resultType="hashmap">
  SELECT * FROM User WHERE ID = #{id}
</select>

这个语句名为 selectUser,接受一个 int(或 Integer)类型的参数,并返回一个 HashMap 类型的对象,其中的键是列名,值便是结果行中的对应值。

 <select id="selectUserById" resultType="user" parameterType="int">
        select * FROM  user WHERE id=#{id}
    </select>

这个语句名为 selectUserById,接受一个 int(或 Integer)类型的参数,并返回一个 user类型的对象。
在接口编写方法

 List<User> selectUser();
    //根据id查询用户
 User selectUserById(int id);

在UserMapper.xml编写语句

 <select id="selectUser" resultType="user" >
        select * from user
    </select>

    <select id="selectUserById" resultType="user" parameterType="int">
        select * FROM  user WHERE id=#{id}
    </select>

测试

  @Test
    public void TestUser() {
        // 定义SqlSession变量
        SqlSession sqlSession = null;
        try {
            // 创建SqlSession实例
            sqlSession = MyFactroySqlsession.getSqlSession();
            //方式一
            Object o = sqlSession.selectOne("Mapper.UserMapper.selectUserById", 1);
             System.out.println(o);
                //方式二
            UserMapper userMapper=sqlSession.getMapper(UserMapper.class);
       
           System.out.println(userMapper.selectUserById(1));
            // 提交事务
            sqlSession.commit();
        } catch (Exception e) {
            // 回滚事务
            sqlSession.rollback();
            e.printStackTrace();
        }finally {
            // 关闭SqlSession
            if(sqlSession != null)
                sqlSession.close();
        }
    }

问题:(1)如果实体类跟数据库字段名不一致可能导致查询不出来所以我们在接口的参数如果是普通类型都加上@Param属性,不是基本类型不用加,相当于取别名。

 User selectUsernp(@Param("na") String name, @Param("p") String pw);
  <select id="selectUsernp" resultType="user">
        SELECT * FROM user WHERE name=#{na} or password=#{p}
    </select>

(2)如果参数过多可以使用map

User selectUsernp2(Map<String,String> map);
  <select id="selectUsernp2" resultType="user" parameterType="map">
        SELECT * FROM user WHERE name=#{name} or password=#{password}
    </select>

使用时记得传入map就行

 Map<String, String> map = new HashMap<String, String>();
            map.put("name","map");
            map.put("password","123456");

关于模糊查询like

<select id=”selectlike”>
select * from user where username like #{value}
</select>
<select id=”selectlike”>
    select * from user where username like "%"#{value}"%"
</select>

第1种:在Java代码中添加sql通配符。

string name =%c%;
list<User> names = mapper.selectlike(name);
string name = “c”;
list<User> names = mapper.selectlike(name);

第2种:在sql语句中拼接通配符,会引起sql注入

2、select属性
<select
  id="selectUser"
  parameterType="int"
  parameterMap="deprecated"
  resultType="hashmap"
  resultMap="userResultMap"
  flushCache="false"
  useCache="true"
  timeout="10"
  fetchSize="256"
  statementType="PREPARED"
  resultSetType="FORWARD_ONLY">

在这里插入图片描述

insert
1、使用

insert的使用与select基本一样,直接上测试用例了。
在接口编写方法

int addUser(User user);

在UserMapper.xml编写语句

<insert id="addUser" parameterType="user">
        insert into user(id,name,password) VALUES (
        #{id},#{name},#{password}
        )
    </insert>

然后跟上面一样测试就行。
不同点:如果你的数据库支持自动生成主键的字段(比如 MySQL 和 SQL Server),那么你可以设置 useGeneratedKeys=”true”,然后再把 keyProperty 设置为目标属性就 OK 了。例如,如果上面的 user表已经在 id 列上使用了自动生成,那么语句可以修改为:

<insert id="addUser" parameterType="user" useGeneratedKeys="true"
            keyProperty="id">
        insert into user(id,name,password) VALUES (
        #{id},#{name},#{password}
        )
    </insert>

如果你的数据库还支持多行插入, 你也可以传入一个 user 数组或集合,并返回自动生成的主键。

 <insert id="addUser" useGeneratedKeys="true"
            keyProperty="id">
        insert into user(id,name,password) VALUES
        <foreach item="item" collection="list" separator=",">
            (#{item.id}, #{item.name}, #{item.password}
        </foreach>
    </insert>

对于不支持自动生成主键列的数据库和可能不支持自动生成主键的 JDBC 驱动,MyBatis 有另外一种方法来生成主键。
这里有一个的示例,它可以生成一个随机 ID(不建议实际使用):

 <insert id="addUser">
        <selectKey keyProperty="id" resultType="int" order="BEFORE">
            select CAST(RANDOM()*1000000 as INTEGER) a from SYSIBM.SYSDUMMY1
        </selectKey>
        insert into Author
        insert into user(id,name,password) VALUES (
        #{id},#{name},#{password}
        )
    </insert>
    

selectKey 元素描述如下:

<selectKey
  keyProperty="id"
  resultType="int"
  order="BEFORE"
  statementType="PREPARED">

在这里插入图片描述

2、insert、update 和 delete属性

由于这三个属性几乎一样,就放一起说了

<insert
  id="insertAuthor"
  parameterType="domain.blog.Author"
  flushCache="true"
  statementType="PREPARED"
  keyProperty=""
  keyColumn=""
  useGeneratedKeys=""
  timeout="20">

<update
  id="updateAuthor"
  parameterType="domain.blog.Author"
  flushCache="true"
  statementType="PREPARED"
  timeout="20">

<delete
  id="deleteAuthor"
  parameterType="domain.blog.Author"
  flushCache="true"
  statementType="PREPARED"
  timeout="20">

在这里插入图片描述

update

同上

int update(User user);
<update id="update" parameterType="user">
        UPDATE user set name=#{name},password=#{password} where id = #{id}
    </update>
delete

同上

    int dedate(@Param("id") int id);
<delete id="dedate" parameterType="int">
        DELETE  FROM  user WHERE id=#{id}
    </delete>

在这里插入图片描述

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值