学习笔记-Mybatis(二)
基本的增删改查:
实体类(映射数据库表)–>Mybatis-config.xml文件(配置数据库,别名,以及配置映射规则)–>实体类配置文件(执行相应的数据库语句)–>测试类
实体类配置文件:
<?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.bean">
<insert id="addCategory" parameterType="Category">
insert into category_(name) values (#{name})
</insert>
<delete id="deleteCategory" parameterType="Category">
delete from category_ where id= #{id}
</delete>
<select id="getCategory" parameterType="_int" resultType="Category">
select * from category_ where id=#{id}
</select>
<update id="updateCategory" parameterType="Category">
update category_ set name=#{name} where id=#{id}
</update>
<select id="listCategory" resultType="Category"><!-- 因为myBatis-config.xml直接写Category -->
select * from category_
</select>
</mapper>
parameterType的用法:
1.基本数据类型,如输入参数只有一个,其数据类型可以是基本的数据类型,也可以是自己定的类类型。包括int,String,Integer,Date,如下:
(1)根据id进行相应的删除:<delete id="deleteById" parameterType="Integer">
(2)添加员工:<insert id="addEmp" parameterType="com.pojo.Employee">
2.复杂数据类型:包含java实体类,map。
另外MyBatis还提供了一个使用注解来参入多个参数的方式。这种方式需要在接口的参数上添加@Param注解
/**
* 此处要注意的是,由于该方法需要传入多个参数,在进行Mybatis配置时,
* 没有办法同时配置多个参数,另外MyBatis还提供了一个使用注解来参入
* 多个参数的方式。这种方式需要在接口的参数上添加@Param注解。。
* 注意,以下两种写法是完全相同的。但使用的时候要使用第一种类型
*/Userlogin(@Param(value=”name”)Stringname,@Param(value=”password”)String password );
// User login(String name,String password);
配置如下:
<select id="login" resultType="com.pojo.User">
select * from us where name=#{name} and password=#{password}
</select>
注:不同版本的MyBatis对基本类型传递过来的参数名称不能识别,要使用_parameter来代替。
<select id="getWinLogByEventId" parameterType="java.lang.Long"
resultMap="BaseResultMap">
select <include refid="Base_Column_List"/> from win_log where eventId = #{_parameter,jdbcType=BIGINT} </select>
3.获取参数中的值:
1.基本数据类型:#{参数}获取参数中的值
2.复杂数据类型:#{属性名},map中则是#{key}
测试类:
public class TestMybatis {
public static void main(String[] args) throws IOException {
String resource = "mybatis-config.xml";
InputStream inputStream = Resources.getResourceAsStream(resource);
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
// 通过配置文件"mybatis-config.xml"得到SQLSessionFactory(创建SqlSession对象的工厂)
SqlSession session = sqlSessionFactory.openSession();
// 通过SQLSessionFactory得到Session
Category c = new Category();
// 增加
c.setName("addCategory");
session.insert("addCategory", c);
// 删除
c.setId(6);
session.delete("deleteCategory", c);
// 查询
c = session.selectOne("getCategory", 3);
System.out.println(c.getName());
// 更改
c = session.selectOne("getCategory", 4);
c.setName("修改了姓名");
session.update("updateCategory", c);
// 遍历
listAll(session);
session.commit();
session.close();
}
private static void listAll(SqlSession session) {
// TODO Auto-generated method stub
List<Category> cs = session.selectList("listCategory");
// 通过session的selectList方法,调用sql语句listCategory。
for (Category c : cs) {
System.out.println(c.getName());
}
}
}
模糊查询:
实体类配置文件:
<select id="listCategoryByName" parameterType="String"
resultType="Category">
select * from category_ where name like concat('%',#{0},'%')
<!-- 如果是oracle,写法是 -->
<!-- select * from category_ where name like '%'||#{0}||'%' -->
</select>
测试代码:
List<Category> cs = session.selectList("listCategoryByName", "cat");
for (Category c1 : cs) {
System.out.println(c1.getName());
}
多条件查询:
结合前面的模糊查询,多一个id>多少的条件
1. Category.xml 准备sql语句
<select id="listCategoryByIdAndName" parameterType="map"
resultType="Category">
select * from category_ where id> #{id} and name like concat('%',#{name},'%')
</select>
- 测试代码
因为是多个参数,而selectList方法又只接受一个参数对象,所以需要把多个参数放在Map里,然后把这个Map对象作为参数传递进去
Map<String, Object> params=new HashMap<>();
params.put("id", 0);
params.put("name", "cat");
List<Category> cs = session.selectList("listCategoryByIdAndName", params);
for (Category c1 : cs) {
System.out.println(c1.getName());
}