本小节通过XML配置方式,实现基本的增删改查。
增、删、改、查
增删改查分别对应的标签是:insert、delete、update、select。
id:唯一标识符,与接口中的方法一一对应;
parameterType:传入sql语句的参数类型,当参数是基本类型并且只有一个时该属性可以不写;
resultType:sql语句返回值的类型(完整的类名或者别名);
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.liwq.mapper.UserMapper">
<insert id="addUser" parameterType="com.liwq.entity.User">
insert into user
values (#{id}, #{userName}, #{passWord})
</insert>
<delete id="deleteUserById" parameterType="int">
delete
from user
where id = #{id}
</delete>
<update id="updateUserById" parameterType="com.liwq.entity.User">
update user
set user_name=#{userName},
pass_word=#{passWord}
where id = #{id}
</update>
<select id="getUserById" resultType="com.liwq.entity.User" parameterType="int">
select *
from user
where id = #{id}
</select>
<select id="listUsers" resultType="com.liwq.entity.User">
select *
from user
</select>
</mapper>
增删改的标签属性和查的差不多,但需要注意的是增删改都需要提交事务才能改变数据库中的数据。
MyBatis获取参数值
MyBatis获取参数值的两种方式:${}和#{}
- ${}的本质就是字符串拼接,#{}的本质就是占位符赋值
- ${}使用字符串拼接的方式拼接sql,若为字符串类型或日期类型的字段进行赋值时,需要手动加单引号;但是#{}使用占位符赋值的方式拼接sql,此时为字符串类型或日期类型的字段进行赋值时,可以自动添加单引号
单个字面量类型的参数
若mapper接口中的方法参数为单个的字面量类型,此时可以使用${}和#{}以任意的名称(最好见名识意)获取参数的值,注意${}需要手动加单引号。
<select id="getUserByUsername" resultType="User">
select * from user where username = #{username}
</select>
<select id="getUserByUsername" resultType="User">
select * from user where username = '${username}'
</select>
map集合类型的参数
若mapper接口中的方法需要的参数为多个时,此时可以手动创建map集合,将这些数据放在map中只需要通过${}和#{}访问map集合的键就可以获取相对应的值,注意${}需要手动加单引号。
<select id="getUserById2" resultType="com.liwq.entity.User" parameterType="map">
select *
from user
where user_name = #{username}
and pass_word = #{password}
</select>
public void getUserById2() throws IOException {
//读取MyBatis的核心配置文件
InputStream is = Resources.getResourceAsStream("mybatis-config.xml");
//获取SqlSessionFactoryBuilder对象
SqlSessionFactoryBuilder sqlSessionFactoryBuilder = new SqlSessionFactoryBuilder();
//通过核心配置文件所对应的字节输入流创建工厂类SqlSessionFactory,生产SqlSession对象
SqlSessionFactory sqlSessionFactory = sqlSessionFactoryBuilder.build(is);
//获取sqlSession,此时通过SqlSession对象所操作的sql都必须手动提交或回滚事务
//SqlSession sqlSession = sqlSessionFactory.openSession();
//创建SqlSession对象,此时通过SqlSession对象所操作的sql都会自动提交
SqlSession sqlSession = sqlSessionFactory.openSession(true);
//通过代理模式创建UserMapper接口的代理实现类对象
UserMapper userMapper = sqlSession.getMapper(UserMapper.class);
//调用UserMapper接口中的方法,就可以根据UserMapper的全类名匹配元素文件,通过调用的方法名匹配映射文件中的SQL标签,并执行标签中的SQL语句
Map<String, Object> map = new HashMap<String, Object>();
map.put("username", "tom3153e703-582b-40b1-96b1-142889d476d0");
map.put("password", "pass398f68fd-b4cc-47d9-83e3-947750bddae6");
User result = userMapper.getUserById2(map);
//提交事务
//sqlSession.commit();
System.out.println("result:" + result.toString());
}
实体类类型的参数
若mapper接口中的方法参数为实体类对象时此时可以使用${}和#{},通过访问实体类对象中的属性名获取属性值,注意${}需要手动加单引号。
<insert id="addUser" parameterType="com.liwq.entity.User">
insert into user
values (#{id}, #{userName}, #{passWord})
</insert>
public void addUser() throws IOException {
//读取MyBatis的核心配置文件
InputStream is = Resources.getResourceAsStream("mybatis-config.xml");
//获取SqlSessionFactoryBuilder对象
SqlSessionFactoryBuilder sqlSessionFactoryBuilder = new SqlSessionFactoryBuilder();
//通过核心配置文件所对应的字节输入流创建工厂类SqlSessionFactory,生产SqlSession对象
SqlSessionFactory sqlSessionFactory = sqlSessionFactoryBuilder.build(is);
//获取sqlSession,此时通过SqlSession对象所操作的sql都必须手动提交或回滚事务
//SqlSession sqlSession = sqlSessionFactory.openSession();
//创建SqlSession对象,此时通过SqlSession对象所操作的sql都会自动提交
SqlSession sqlSession = sqlSessionFactory.openSession(true);
//通过代理模式创建UserMapper接口的代理实现类对象
UserMapper userMapper = sqlSession.getMapper(UserMapper.class);
//调用UserMapper接口中的方法,就可以根据UserMapper的全类名匹配元素文件,通过调用的方法名匹配映射文件中的SQL标签,并执行标签中的SQL语句
User user = new User();
user.setUserName("tom" + UUID.randomUUID());
user.setPassWord("pass" + UUID.randomUUID());
int result = userMapper.addUser(user);
//提交事务
//sqlSession.commit();
System.out.println("result:" + result);
}