先看一张图
不难发现, mybatis就是通过映射文件来管理sql语句的, 不再是传统的将sql语句写在代码中, 将sql和代码分开解耦了.
1. mybatis的更新操作
1.1 插入操作
注意点:
<?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="userMapper">
<insert id="save" parameterType="com.itdong.domain.User">
/*对应User类的属性名*/
insert into tb_user value (#{id},#{name},#{age})
</insert>
</mapper>
@Test
public void test2() throws IOException {
//模拟数据
User user = new User();
user.setId(3);
user.setName("hahaha");
user.setAge(20);
//加载核心配置文件 Resources就是mybatis框架提供的, 注意是在org.apache.ibatis.io.Resources包下
InputStream resourceAsStream = Resources.getResourceAsStream("sqlMapperConfig.xml"); //就在resources下, 直接写
//获取session工厂对象
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(resourceAsStream);
//获取会话对象
SqlSession sqlSession = sqlSessionFactory.openSession();
//执行操作 参数就是, namespace+id
int insert = sqlSession.insert("userMapper.save",user);
//测试, 打印出来数据
System.out.println(insert);
//mybatis的更新操作默认是不提交事务的
sqlSession.commit();
//释放资源
sqlSession.close();
}
有人可能会问返回值是什么, 配置时为什么不用加resultType
属性
1.2 修改操作
<update id="update" parameterType="com.itdong.domain.User">
update tb_user set name = #{name} , age = #{age} where id = #{id}
</update>
@Test
public void test3() throws IOException {
//模拟数据
User user = new User();
user.setId(3);
user.setName("hehehe");
user.setAge(21);
//加载核心配置文件 Resources就是mybatis框架提供的, 注意是在org.apache.ibatis.io.Resources包下
InputStream resourceAsStream = Resources.getResourceAsStream("sqlMapperConfig.xml"); //就在resources下, 直接写
//获取session工厂对象
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(resourceAsStream);
//获取会话对象
SqlSession sqlSession = sqlSessionFactory.openSession();
//执行操作 参数就是, namespace+id
int num = sqlSession.update("userMapper.update",user);
//测试, 打印出来数据
System.out.println(num);
//mybatis的更新操作默认是不提交事务的
sqlSession.commit();
//释放资源
sqlSession.close();
}
1.3 删除操作
<delete id="delete" parameterType="java.lang.Integer">
delete from tb_user where id = #{id}
</delete>
@Test
public void test4() throws IOException {
//加载核心配置文件 Resources就是mybatis框架提供的, 注意是在org.apache.ibatis.io.Resources包下
InputStream resourceAsStream = Resources.getResourceAsStream("sqlMapperConfig.xml"); //就在resources下, 直接写
//获取session工厂对象
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(resourceAsStream);
//获取会话对象
SqlSession sqlSession = sqlSessionFactory.openSession();
//执行操作 参数就是, namespace+id
int num = sqlSession.delete("userMapper.delete",6);
//测试, 打印出来数据
System.out.println(num);
//mybatis的更新操作默认是不提交事务的
sqlSession.commit();
//释放资源
sqlSession.close();
}
1.4 小结
可见, 更新操作的返回值都是int, 表示生效的行数
如果sqlSessionFactory.openSession(); 开启事务会话
也就是默认的不自动提交
更新操作是不会自动提交到数据库的. 但是查询操作可以随表查
查询操作就是两个api, 一个是one一个是list
接下来学习映射文件深入的部份, 以上都是简单的入门
2. 映射文件深入学习
首先就要认识mybatis的映射文件真正的作用是什么, 以上的学习, 我们只知道映射文件可以写我们的sql语句, 配置好sql语句之后, 使用时可以通过namespace+id来锁定要的sql语句
mybatis是用在dao层的框架, 映射文件里配置和存放sql语句和dao层又有什么关系呢
在以前javaweb阶段我们学习到, dao层的存在是为业务层的方法提供基础
传统的方法就是, dao层的接口要我们自己写实现类来实现方法, sql语句在这个过程中也会和实现类耦合在一起, 也就是说, mybatis的存在, 可以将传统的方法改变成, 接口+映射文件的形式, 不再需要我们自己写dao层的实现类了, 这样一来不就使得代码和sql语句分开了吗, 也体现了框架面向接口和配置文件做项目的目的.
那么, 怎么实现映射文件来取代实现类, 就是我们学习的重点
2.1 代理开发模式
例如
说白了, 实现类不用写了, mybatis自动会给我们创建代理对象
也就是说, 不再是直接使用namespace+id
而是使用getMapper(接口类)获取代理对象
在通过代理对象锁定sql
2.2 动态sql
动态的sql极大的方便了sql的使用
因为当你给不同的参数
就会动态的执行不同的sql
2.2.1 if
<select id="findByCondition" parameterType="com.itdong.domain.User" resultType="com.itdong.domain.User">
select * from tb_user
<where>
<if test="id!=0">
and id=#{id}
</if>
<if test="name!=null">
and name=#{name}
</if>
<if test="age!=0">
and age=#{age}
</if>
</where>
</select>
@Test
public void test5() throws IOException {
//模拟数据
User user = new User();
//user.setId(4);
user.setName("lll");
//user.setAge(21);
//加载核心配置文件 Resources就是mybatis框架提供的, 注意是在org.apache.ibatis.io.Resources包下
InputStream resourceAsStream = Resources.getResourceAsStream("sqlMapperConfig.xml"); //就在resources下, 直接写
//获取session工厂对象
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(resourceAsStream);
//获取会话对象
SqlSession sqlSession = sqlSessionFactory.openSession();
//获取代理对象
UserMapper mapper = sqlSession.getMapper(UserMapper.class);
List<User> userList = mapper.findByCondition(user);
//测试, 打印出来数据
System.out.println(userList);
//mybatis的更新操作默认是不提交事务的
sqlSession.commit();
//释放资源
sqlSession.close();
}
2.2.2 foreach
<select id="findByIds" parameterType="list" resultType="com.itdong.domain.User">
select * from tb_user
<where>
<foreach collection="list" open="id in(" close=")" item="id" separator=",">
#{id}
</foreach>
</where>
</select>
@Test
public void test6() throws IOException {
//模拟数据
List<Integer> list = new ArrayList<Integer>();
list.add(1);
list.add(2);
list.add(3);
//加载核心配置文件 Resources就是mybatis框架提供的, 注意是在org.apache.ibatis.io.Resources包下
InputStream resourceAsStream = Resources.getResourceAsStream("sqlMapperConfig.xml"); //就在resources下, 直接写
//获取session工厂对象
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(resourceAsStream);
//获取会话对象
SqlSession sqlSession = sqlSessionFactory.openSession();
//获取代理对象
UserMapper mapper = sqlSession.getMapper(UserMapper.class);
List<User> userList = mapper.findByIds(list);
//测试, 打印出来数据
System.out.println(userList);
//mybatis的更新操作默认是不提交事务的
sqlSession.commit();
//释放资源
sqlSession.close();
}