Java框架——Mybatis(二)

Mybatis的模糊查询

1.添加接口中的模糊查询的方法
public interface MyMapper {
	public Student findById(Integer i);// 根据id查询单个值
	public List<Student> search(String name);// 根据名字模糊查询
}
2.在SQL映射文件中添加SQL语句
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.dao.MyMapper">
<!--  
namespace:名称空间——接口全类型
-->
	<select id="search"  resultType="com.dao.Student" >
		select * from student where name like #{name}
		<!-- 需要返回结果的类型作为映射,id值为方法名,resultType值为返回的List集合中元素的类型-->
	</select>
</mapper>
3.测试
	//重复的代码抽取出来
	private SqlSessionFactory getSqlSessionFactory() throws IOException {
		//log4j初始化
		MyLog4jInit.initLog();
		// 1.使用IO加载核心配置文件,mybatis核心包下io包中的jar
		InputStream inputStream = Resources.getResourceAsStream("mybatis-config.xml");
		// 2.创建sqlSessionFactory,mybatis核心包下session包中的jar
		SqlSessionFactory build = new SqlSessionFactoryBuilder().build(inputStream);
		return build;
	}
	@Test
	public void fun3() throws IOException {// 接口对象模糊查询
		// 1.获取SqlSessionFactory对象
		SqlSessionFactory build = getSqlSessionFactory();
		// 2.获取sqlSession
		SqlSession session = build.openSession();
		// 3.获取接口对象
		MyMapper mapper = session.getMapper(MyMapper.class);
		// 4.执行SQL
		List<Student> student = (List<Student>) mapper.serch("%马%");
		//输出查询结果
		for (Student s : student) {
			System.out.println(s);
		}

	}

Mybatis的单条记录的添加

1.在接口添加相关方法
public int insert(Student stu);// 插入一条数据
2.在映射文件中添加SQL插入语句
<insert id="insert" >
	insert into student(name,age) values(#{name},#{age})
	<!-- 传入多个参数时,参数名要与student的属性名一致 -->
</insert>
3.测试
		// 1.获取SqlSessionFactory对象
		SqlSessionFactory build = getSqlSessionFactory();
		// 2.获取sqlSession对象
		// SqlSession session = build.openSession(true);
		//true为自动提交事务,false则相反
		SqlSession session = build.openSession();
		// 3.获取接口对象
		MyMapper mapper = session.getMapper(MyMapper.class);
		// 4.执行SQL
		Student stu = new Student();
		stu.setName("阿大");
		stu.setAge(32);
		//调用接口方法
		int insert = mapper.insert(stu);
		System.out.println(insert);
		//提交
		session.commit();
关于SQL的增删改操作需要提交数据
提交数据的方式:
1.SqlSession对象来commit();手动提交数据
2.SqlSessionFactory对象获取SqlSession对象的openSession(true)中参数为true,开启自动提交

添加记录时返回主键值

原生的JDBC要返回主键,可以用Statement对象的getGeneratedKeys()方法,返回自增的主键
Mybatis也是利用Statement对象的getGeneratedKeys()方法

通过SQL映射文件的useGeneratedKeys和keyProperty属性获取
useGeneratedKeys="true"  使用自增主键获取主键值策略
keyProperty="id " 指定对应主键属性,即mybatis获取的主键值封装到JavaBean对象那个属性,与parameterType配合
<insert id="insert" useGeneratedKeys="true" keyProperty="id" >
	insert into student(name,age) values(#{name},#{age})	
</insert>
获取返回的主键id值
	@Test
	public void fun4() throws IOException {// 接口对象模糊查询
		// 1.获取SqlSessionFactory对象
		SqlSessionFactory build = getSqlSessionFactory();
		// 2.获取sqlSession对象
		// SqlSession session = build.openSession(true);
		SqlSession session = build.openSession();
		// 3.获取接口对象
		MyMapper mapper = session.getMapper(MyMapper.class);
		// 4.执行SQL
		Student stu = new Student();
		stu.setName("阿ss盖");
		stu.setAge(32);
		//执行插入SQL语句
		int insert = mapper.insert(stu);
		System.out.println(insert);
		session.commit();
		//获取主键id值
		System.out.println(stu.getId());

	}
Oracle不支持自增,可以使用序列来模拟自增
查询序列:select EMP_SEQ(序列名) .nextval from dual;从表中获取序列的下一个值
查询序列:select EMP_SEQ(序列名) .currval from dual;从表中获取序列的当前值
<!--  Oracle获取非自增主键的值-->
<insert  id="add"  databaseId="oracle"><!--指定为Oracle数据库插入数据-->
	<selectKey keyProperty="id" order="BEFORE" resultType="Integer">
	<!-- keyProperty="id " 指定对应主键属性,即oracle获取的主键值封装到JavaBean对象那个属性
	order="BEFORE" ,在插入SQL操作之前执行
	resultType="Integer"返回值的数据类型
	select EMP_SEQ(序列名) .nextval from dual;
	-->
	</selectKey>
	insert into emp (id,name,age) values (#{id},#{name},#{age});
</insert >
mysql获取主键
<insert id="insert" parameterType="com.pojo.Category" >
    <selectKey keyProperty="id" resultType="long" order="AFTER">
    	select last_insert_id()
    	<!-- 
    	keyProperty="id " 将主键封装到对象的id属性上
    	resultType="long" 返回的主键类型为long
    	order="AFTER"	在新增SQL之后执行
	-->
    </selectKey>
    insert into tb_content_category (id, parent_id, name, 
      status, sort_order, is_parent, 
      created, updated)
    values (#{id,jdbcType=BIGINT}, #{parentId,jdbcType=BIGINT}, #{name,jdbcType=VARCHAR}, 
      #{status,jdbcType=INTEGER}, #{sortOrder,jdbcType=INTEGER}, #{isParent,jdbcType=BIT}, 
      #{created,jdbcType=TIMESTAMP}, #{updated,jdbcType=TIMESTAMP})
  </insert>

Mybatis的单条记录的更新

1.在接口中添加更新方法
public int update(Student stu);// 更新数据
2.在SQL映射文件在添加更新语句
<update id="update">
	update student set name=#{name},age=#{age} where id = #{id}
</update>
3.测试
@Test
	public void fun5() throws IOException {
		//...
		//...
		// 4.执行SQL
		Student stu = new Student();
		stu.setId(36);
		stu.setName("GGG");
		stu.setAge(37);
		int insert = mapper.update(stu);
		//提交数据
		session.commit();

	}

Mybatis的单条记录的删除

1.在接口中添加删除方法
public int del(Integer id);// 删除数据
2.SQL中添加删除语句
<delete id="del">
	delete from student where id = #{id}
</delete>
3.测试
		// 1.获取SqlSessionFactory对象
		SqlSessionFactory build = getSqlSessionFactory();
		// 2.获取sqlSession对象
		SqlSession session = build.openSession();
		// 3.获取接口对象
		MyMapper mapper = session.getMapper(MyMapper.class);
		// 4.执行sql
		int insert = mapper.del(36);
		session.commit();

Mybatis中SQL语句的参数名

#{}:以预编译的形式(表示为占位符?),将参数设置到SQL语句中,可以防止SQL注入
${}:取出的值直接拼接在SQL语句中,会有安全问题

对于单个参数,mybatis不会做特殊处理
select * from student where id = #{id}
#{id}中的id可以任意,#{aa},#{bb},#{cc}都是可以的

对于多个参数,mybatis会做特殊处理,将多个参数封装为一个map
key:param1,param2...paramN
value:传入的参数
例如:
select * from student where id = #{param1} and name=#{param2}
这样不美观,不易操作,易混淆,对于接口形式的传参不适用

mybatis提供的自定义参数名:
在对应接口中的方法上使用注解
public Student getStudent(@Param("myId")Integer i,@Param("myName")String  name);
多个参数会被封装为1个map
key:@Param("参数名")中指定的值
value:传入的参数
select * from student where id = #{myId} and name=#{myName}

Mybatis的传参类型

1.传入的多个参数正好是业务模型对象
<insert id="insert" parameterType="模型对象全类名">
	insert into student(name,age) values(#{模型对象的属性名},#{模型对象的属性名})	
</insert>
2.传入的参数不是业务模型,是不常用的类型,可以用map
参数名就是map的key
<insert id="insert" parameterType="map">
	insert into student(name,age) values(#{key},#{key})	
</insert>
3.传入的参数是对象的属性
public Student getById(@Param("stu")Student stu);
<select id="getById" >
	select * from student where id = #{stu.id}
</select>
4.传入的参数是List对象的元素
public Student getById(@Param("list")List<Integer> ids);
如果不使用自定义参数,List集合封装到Map中默认的key就是list
<select id="getById" >
	select * from student where id = #{list[0]}
</select>
collection或array在Mybatis参数的Map中对应的key
 Collection(collection) 
 List(list)  	
 Array(array)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值