1.引言
在上一篇博客中,我们介绍了MyBatis最简单的使用(只是向数据库插入了一条数据),但是在上一篇博客中还存在一些问题,比如:
SQL
语句是写死的,我们不可以给SQL
语句传入参数- 虽然我们定义了
Student
类和student
表的映射关系,但是我们没有用到
在本篇博客中我们就解决上一篇博客中遗留的这两个问题。
2.MyBatis插入数据
2.1 插入一条数据(使用自定义类型Student
)
- 编写我们的语句
<insert id="add" parameterType="com.Student">
insert into student(id,name,sal) values(#{id},#{name},#{sal})
</insert>
- 编写测试类
@Test
public void testStudent()
{
SqlSession sqlSession = MyBatisUtil.getSqlSession();
try{
//执行mynamespace.add1的sql语句,正好我们的映射文件想对应
Student s=new Student();
s.setId(2);
s.setName("wpx");
s.setSal(1000D);
sqlSession.insert("mynamespace.add", s);
}catch(Exception e){
e.printStackTrace();
sqlSession.rollback();
}finally{
sqlSession.commit();
}
MyBatisUtil.closeSqlSession();
}
- 运行结果
SQL
语句参数解释
parameterType:代表sql传入的参数类型
如果传入的参数是自定义类型,比如我们这里的Student
那么我们在SQL中使用#{}来读取自定义类型的值,括号里面写自定义类型的属性,比如#{id}读取id属性
虽然我们括号里面写的是属性,但是还是通过get方法得到的参数,比如#{id},调用的是getId方法
3 MyBatis更新数据
3.1更新一条数据(传入自定义类型Student
)
- 编写我们的语句
<update id="update" parameterType="com.Student">
update student set name=#{name},sal=#{sal} where id=#{id}
</update>
- 编写我们的测试类
@Test
public void testStudent()
{
SqlSession sqlSession = MyBatisUtil.getSqlSession();
try{
//执行mynamespace.update的sql语句,正好我们的映射文件想对应
Student s=new Student();
s.setId(2);
s.setName("zlr");
s.setSal(1000D);
sqlSession.update("mynamespace.update", s);
}catch(Exception e){
e.printStackTrace();
sqlSession.rollback();
}finally{
sqlSession.commit();
}
MyBatisUtil.closeSqlSession();
}
- 运行结果
3 MyBatis查找数据
3.1 查询一条记录(通过主键:基本类型)
- 编写我们的SQL语句
<select id="selectOne" parameterType="java.lang.Integer" resultMap="studentMap">
select id,name,sal from student where id=#{id}
</select>
- 编写我们的测试类
@Test
public void testSelectOne()
{
SqlSession sqlSession = MyBatisUtil.getSqlSession();
try{
Student student=sqlSession.selectOne("mynamespace.selectOne", 1);
System.out.print(student);
}catch(Exception e){
e.printStackTrace();
sqlSession.rollback();
}finally{
sqlSession.commit();
}
MyBatisUtil.closeSqlSession();
}
- 运行结果
- 代码解释
注意第一点:
这里我们传入的参数是基本数据类型:int类型
我们同样使用#{}来取得参数,就好比例子中的#{id}
但是需要注意的是括号里面的值随便填,这个例子也可以写成#{xxx},程序照样可以运行
注意第二点:
因为select语句有返回值,所以设置resultMap属性,我们通过这个属性设置映射关系,也就是告诉mybatis,我们查询到的是一个什么样子的对象
3.2 查询所有记录
编写我们的SQL语句
<select id="selectAll" parameterType="com.Student" resultMap="studentMap"> select id,name,sal from student </select>
- 编写测试类
@Test
public void testSelectAll()
{
SqlSession sqlSession = MyBatisUtil.getSqlSession();
try{
List<Student> students=sqlSession.selectList("mynamespace.selectAll");
System.out.print(students);
}catch(Exception e){
e.printStackTrace();
sqlSession.rollback();
}finally{
sqlSession.commit();
}
MyBatisUtil.closeSqlSession();
}
- 运行结果
- 代码解释
在本次事例中只需要注意一个地方:
我们需要的类型是:List<Student>
但是我们设置的类型是:parameterType="com.Student"
3.3 分页查询(使用Map
类型,也可以使用自定义类型)
- 编写SQL语句
<select id="findAllWithFy" parameterType="map" resultType="com.Student">
select id,name,sal from student limit #{pstart},#{psize}
</select>
- 编写测试类
@Test
public void testFindAllWithFy()
{
SqlSession sqlSession = MyBatisUtil.getSqlSession();
try{
Map map=new HashMap();
map.put("pstart",1);
map.put("psize",1);
List<Student> students=sqlSession.selectList("mynamespace.findAllWithFy",map);
System.out.print(students);
}catch(Exception e){
e.printStackTrace();
sqlSession.rollback();
}finally{
sqlSession.commit();
}
MyBatisUtil.closeSqlSession();
}
- 运行结果
- 代码解释
这个代码需要注意一个地方:
#{}表达式,括号里面需要填写map的key值
4.MyBatis删除数据
4.1 删除一条数据
- 编写SQL语句
<delete id="delete" parameterType="java.lang.Integer">
delete from student where id = #{id}
</delete>
- 编写测试类
@Test
public void testDelete()
{
SqlSession sqlSession = MyBatisUtil.getSqlSession();
try{
sqlSession.delete("mynamespace.delete", 2);
}catch(Exception e){
e.printStackTrace();
sqlSession.rollback();
}finally{
sqlSession.commit();
}
MyBatisUtil.closeSqlSession();
}
- 运行结果