目录
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
传输的是实体类
,
则
${}
中的变量只能写属性名。
parameterType和resultType
parameterType
:指定输⼊参数类型,
mybatis
通过
ognl
从输⼊对象中获取参数值拼接在
sql中。
resultType
:指定输出结果类型,
mybatis
将
sql
查询结果的⼀⾏记录数据映射为
resultType指定类型的对象。
selectOne和selectList
selectOne : 查询⼀条记录,如果使⽤selectOne查询多条记录则抛出异常:
selectList :
可以查询⼀条或多条记录。