Mybatis入门学习02--Mybatis增删改查操作

目录

Mybatis 插入用户

UserMapper映射文件

插入用户代码实现

主键返回

Mybatis 根据ID删除用户

UserMapper.xml

删除用户代码实现

Mybatis 根据ID更新用户

UserMapper.xml

更新用户代码实现

Mybatis 根据ID查询用户

UserMapper.xml配置

根据ID查询用户代码实现

Mybatis 根据用户名查询用户

UserMapper.xml

代码实现

小结

#{}和${}

parameterType和resultType

selectOne和selectList


Mybatis 插入用户

UserMapper映射文件

<mapper namespace="userMapper">
     <!--插⼊⽤户-->
     <!--
         parameterType: 参数的类型
         #{id} : 代表sql语句中的占位符 ? , 其中的id 代表的是 User对象中的属性名
     -->
     <insert id="insert" parameterType="com.test_wensong.pojo.User">
         insert into user values(#{id}, #{username}, #{sex}, #{address})
     </insert>
</mapper>

插入用户代码实现

/**
* 查询⽤户
* @throws IOException
*/
@Test
public void insertTest() throws IOException {
     //加载核⼼配置⽂件 SqlMapConfig.xml
     InputStream inputStream = Resources.getResourceAsStream("SqlMapConfig.xml");
     //构造SQLSessionFactory对象
     SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
    //构造SQLSession对象
     SqlSession sqlSession = sqlSessionFactory.openSession();
     //执⾏插⼊语句
     User user = new User();
     user.setUsername("jack");
     user.setSex("男");
     user.setAddress("北京");
     //参数⼀: 要执⾏的sql [ 名称空间.id ]
     //参数⼆: 传⼊到sql的参数
     int count = sqlSession.insert("userMapper.insert", user);
     System.out.println("user表增加的⾏数: " + count);
     //user对象, 已经存⼊到数据库中, 说明user的属性id值 已经有啦, 打印⼀下id值
     System.out.println("user Id值 = " + user.getId());
     //提交事务
     sqlSession.commit();
     //释放资源
     sqlSession.close();
}
Mybatis 会⾃动的将事务设置为⼿动提交 :

所以在进⾏增删改操作时 , 记得提交事务;

主键返回

需求: 由于表结构中的主键, 是主键⾃增的, 需要将此次插⼊的主键获取到, 在程序中使⽤;

1. ⾃增主键
A. UserMapper.xml 配置
<!--插⼊⽤户-->
<!--
 parameterType: 参数的类型
 #{id} : 代表sql语句中的占位符 ? , 其中的id 代表的是 User对象中的属性名
 在查询⽤户完成后, 把数据库中user的id值 赋值给 pojo中 user的id属性
 keyProperty="id" 把⾃增主键值 赋值给 pojo中 user的id属性
 order="AFTER" 在insert语句执⾏完成后 执⾏ selectKey查询操作
 resultType="integer" selectKey查询的返回值类型
-->
<insert id="insert" parameterType="com.wensong.pojo.User">
     insert into user values(#{id}, #{username}, #{sex}, #{address})
     <selectKey keyProperty="id" order="AFTER" resultType="integer">
         select LAST_INSERT_ID()
     </selectKey>
</insert>
配置详解 :
属性
含义
1
keyProperty
返回的主键存储在 pojo 中的哪个属性
2
order
selectKey 的执⾏顺序,是相对与 insert 语句来说,由于 mysql的⾃增 原理执⾏完 insert 语句之后才将主键⽣成,所以这⾥ selectKey的执⾏顺序为 after
3
resultType
返回的主键是什么类型
4
LAST_INSERT_ID()
mysql 的函数,返回 auto_increment ⾃增列新记录 id 值。

Mybatis 根据ID删除用户

UserMapper.xml

<!--根据⽤户id 删除⽤户-->
<delete id="delete" parameterType="integer">
 delete from user where id=#{id}
</delete>

删除用户代码实现

/**
* 根据id 删除⽤户
* @throws IOException
*/
@Test
public void deleteTest() throws IOException {
    //加载核⼼配置⽂件 SqlMapConfig.xml
     InputStream inputStream = Resources.getResourceAsStream("SqlMapConfig.xml");
     //构造SQLSessionFactory对象
     SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
     //构造SQLSession对象
     SqlSession sqlSession = sqlSessionFactory.openSession();
     //执⾏删除语句
     sqlSession.delete("userMapper.delete", 9);
     //提交事务
     sqlSession.commit();
     //释放资源
     sqlSession.close();
}

Mybatis 根据ID更新用户

UserMapper.xml

<!--根据⽤户id 更新⽤户-->
<update id="update" parameterType="com.wensong.pojo.User">
     update user
     set username=#{username}, sex=#{sex}, address=#{address}
     where id=#{id}
</update>

更新用户代码实现

/**
* 根据⽤户id 根据⽤户
* @throws IOException
*/
@Test
public void updateTest() throws IOException {
     //加载核⼼配置⽂件 SqlMapConfig.xml
     InputStream inputStream = Resources.getResourceAsStream("SqlMapConfig.xml");
     //构造SQLSessionFactory对象
     SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
     //构造SQLSession对象
     SqlSession sqlSession = sqlSessionFactory.openSession();
     //执⾏更新语句
     User user = new User();
     user.setId(7);
     user.setUsername("jack");
     user.setSex("男");
     user.setAddress("⽇本");
     //参数⼀: 要执⾏的sql [ 名称空间.id ]
     //参数⼆: 传⼊到sql的参数
     sqlSession.update("userMapper.update", user);
     //提交事务
     sqlSession.commit();
     //释放资源
     sqlSession.close();
}

Mybatis 根据ID查询用户

UserMapper.xml配置

<!--根据⽤户id, 查询⽤户-->
<select id="fingById" parameterType="integer" resultType="com.wensong.pojo.User">
     select * from user where id=#{id}
</select>
{...} : 如果参数的类型是简单数据类型 ( 基本数据类型 , 基本数据类型包装类 ,String) , 参数名可以随便写 ; 如果 参数的类型是 POJO 实体类 , 参数名只能写 pojo 的属性名 ;

根据ID查询用户代码实现

/**
* 根据⽤户id 查询⽤户
* @throws IOException
*/
@Test
public void findByIdTest() throws IOException {
     //加载核⼼配置⽂件 SqlMapConfig.xml
     InputStream inputStream = Resources.getResourceAsStream("SqlMapConfig.xml");
     //构造SQLSessionFactory对象
     SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
     //构造SQLSession对象
     SqlSession sqlSession = sqlSessionFactory.openSession();
     //执⾏查询语句
     User user = sqlSession.selectOne("userMapper.fingById", 7);
     System.out.println("user = " + user);
     //释放资源
     sqlSession.close();
}

Mybatis 根据用户名查询用户

UserMapper.xml

<!--根据⽤户名, 模糊查询-->
<!--
     当parameterType 值 为 基本数据类型或包装类时, ${value} ⽤于获取值, 完成字符拼接
     当parameterType 值 为 引⽤数据类型 Pojo时, ${pojo属性名} ⽤于获取值, 完成字符拼接

 ⽅式1: 字符串拼接, 相当于 Statament
 select * from user where username like '%${value}%'

 ⽅式2: 使⽤mysql函数 Concat进⾏拼接
 select * from user where username like CONCAT('%',#{username}, '%');

 两种sql 的区别 :
 ⽅式1: select * from user where username like '%j% or 1=1'
 ⽅式2: select * from user where username like CONCAT('%',?, '%')
-->

<select id="findByName" parameterType="java.lang.String" resultType="com.wensong.pojo.User">
     select * from user where username like CONCAT('%',#{username}, '%')
</select>
${..} : 是字符串拼接符号 ; 如果传递的参数类型是简单数据类型 , 变量名只能写 value ; 如果传递的是POJO 实体类 , 变量名依然写类中属性名 ; %代表任意位任意字符,_代表一位任意字符,比如第二位为d的模糊查询:like '_d%'

代码实现

/**
* 根据⽤户名 模糊查询⽤户
* @throws IOException
*/
@Test
public void findByNameTest() throws IOException {
     //加载核⼼配置⽂件 SqlMapConfig.xml
     InputStream inputStream = Resources.getResourceAsStream("SqlMapConfig.xml");
     //构造SQLSessionFactory对象
     SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
     //构造SQLSession对象
     SqlSession sqlSession = sqlSessionFactory.openSession();
     //执⾏模糊查询语句
     List<User> userList = sqlSession.selectList("userMapper.findByName","j");
     for (User user : userList) {
         System.out.println("user = " + user);
     }
     //释放资源
     sqlSession.close();
}

小结

#{}${}

1). #{} 表示⼀个占位符号,通过 #{} 可以实现 preparedStatement 向占位符中设置值,⾃动进⾏ java类型和 jdbc 类型转换, #{} 可以有效防⽌ sql 注⼊。 #{} 可以接收简单类型值或 pojo属性值。 如果parameterType 传输单个简单类型, #{} 中的变量可以写 value 或其他名称 ; 如果 parameterType传输的是实体类 , #{} 中的变量只能写属性名。
2). ${} 表示⼀个字符串拼接符号,通过 ${} 可以将 parameterType 传⼊的内容拼接在 sql 中且不进⾏jdbc类型转换, ${} 可以接收简单类型值或 pojo 属性值,如果 parameterType 传输单个简单类型值, ${}括号中只能是 value ; 如果 parameterType 传输的是实体类 , ${} 中的变量只能写属性名。

parameterTyperesultType

parameterType :指定输⼊参数类型, mybatis 通过 ognl 从输⼊对象中获取参数值拼接在 sql中。
resultType :指定输出结果类型, mybatis sql 查询结果的⼀⾏记录数据映射为 resultType指定类型的对象。

selectOneselectList

selectOne : 查询⼀条记录,如果使⽤selectOne查询多条记录则抛出异常:

selectList : 可以查询⼀条或多条记录。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值