mybatis
1.框架
框架是一个半成品,已经对基础的代码进行了封装并提供相应的API,开发者在使用框架是直接调用封装好的api可以省去很多代码编写,从而提高工作效率和开发速度
2.mybatis框架
是一个持久层框架,和数据库打交道的一个框架,它对jdbc的操作数据库的过程进行了封装,是开发者是要关注sql语句,而不用话费太多时间去注册驱动,关闭资源等等。
MyBatis 本是apache的一个开源项目iBatis, 2010年这个项目由apache software foundation 迁移到了google code,并且改名为MyBatis,实质上Mybatis对ibatis进行一些改进。
3.mybatis入门程序
-
引入jar包(mybatis,驱动包)
-
配置mybatis的配置文件(SqlMapConfig.xml)
配置数据源,事务 (xml文件)
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configuration
PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
<environments default="dd">
<environment id="dd">
<!--事务:使用jdbc事务-->
<transactionManager type="JDBC"/>
<!--数据库连接池-->
<dataSource type="POOLED">
<property name="driver" value="oracle.jdbc.driver.OracleDriver"/>
<property name="url" value="jdbc:oracle:thin:@127.0.0.1:1521:orcl"/>
<property name="username" value="scott"/>
<property name="password" value="scott"/>
</dataSource>
</environment>
</environments>
<!--加载映射文件-->
<mappers>
<mapper resource="Goods.xml"/>
</mappers>
</configuration>
3.创建实体类(类中的属性和数据库表字段名一样) (java类)
public class Goods {
private Integer gid;
private String gname;
private double gprice; //BigDecimal
private GoodsType goodsType;
//setter 和 getter
}
4.配置映射文件(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">
<!--namespace 命名空间-->
<!--
parameterType 参数类型
resultType 结果类型 如果结果类型是一个类,
查询的结果会自动设置到类实例的属性中
-->
<mapper namespace="test">
<select id="findOneById" parameterType="int" resultType="com.sc.pojo.Goods">
select * from goods where gid = #{gid}
</select>
</mapper>
- 编程测试 (java类)
import com.sc.pojo.Goods;
import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
import java.io.Reader;
public class Test {
public static void main(String[] args) throws Exception {
//1.读取配置文件
Reader reader
= Resources.getResourceAsReader("SqlMapConfig.xml");
//2.创建会话工厂,用来创建sqlSession
SqlSessionFactory sqlSessionFactory
= new SqlSessionFactoryBuilder().build(reader);
//3.创建sqlSession,用来操作数据库
SqlSession sqlSession
= sqlSessionFactory.openSession();
//4.执行sql
//namespace.id
Goods goods =
sqlSession.selectOne("test.findOneById",10);
System.out.println(goods.getGname());
//5.关闭资源
sqlSession.close();
}
}
4.#{}和${}的使用
#{}表示一个占位符号,相当于预编译对象的? ,通过#{}可以实现preparedStatement向占位符中设置值,#{}可以有效防止sql注入。 #{}可以接收简单类型值或pojo属性值。 如果parameterType传输单个简单类型值,#{}括号中可以是value或其它名称。如果parameterType 是pojo,#{}括号中是类的属性名称。
${}表示拼接sql串,通过${}可以将parameterType 传入的内容拼接在sql中且不进行jdbc类型转换, ${}可以接收简单类型值或pojo属性值,如果parameterType传输单个简单类型值,${}括号中只能是value。
5.查询 (mapper.xml文件)
<select id="findOneById" parameterType="int" resultType="com.sc.pojo.Goods">
select * from goods where gid = #{gid}
</select>
6.删除 (mapper.xml文件)
<delete id="deleById" parameterType="int">
delete from GOODS where GID = #{value}
</delete>
7.修改 (java文件)
GoodsType goodsType = new GoodsType(2,"");
Goods goods = new Goods(12,"葡萄",100,goodsType);
int row = sqlSession.update("test.updateGoods",goods)
(mapper.xml文件)
<update id="updateGoods" parameterType="com.sc.pojo.Goods">
update GOODS set gname=#{gname},gprice=#{gprice}
where GID=#{gid}
</update>
8.添加 (java文件)
GoodsType goodsType = new GoodsType(2,"");
Goods goods = new Goods(12,"葡萄",100,goodsType);
(mapper.xml文件)
<insert id="saveGoods" parameterType="com.sc.pojo.Goods">
insert into GOODS values
(SEQ_GOOD.nextval,#{gname},#{gprice},#{goodsType.tid})
</insert>
9.resultMap
一对一查询
方式一:使用 association (单条记录)
方式二:定义一个扩展类 ,类中定义属性,属性和查询出来的表字段对应
一对多查询
resultMap :用来解决表字段和类属性名不一致的情况
如果类中有对象类型的属性,用到association标签 javaType.
如果类中有List 类型的属性,用到collection标签