SqlSessionFactoryBuilder一旦创建了SqlSessionFactory之后就被销毁了,最佳作用域就是方法作用域就是局部方法变量
SqlSessionFactory一旦被创建就应该在应用运行的时候一直存在,没有理由丢弃它,除非要连接另一个数据库才会重新创建一个新的实例,在运行期间不要重复创建多次,建议放到静态代码块中
每个线程都应该有自己的SqlSession实例,SqlSession的实例不是线程安全的,因此是不能被共享的,所以他的它的最佳作用域是请求作用域
mybatis中实际上采用了代理模式,在内存中生成Dao接口的代理类,然后创建代理类的实例
Mybatis面向接口编程的两个一致
#{}:底层是使用PreparedStatement。特点:先进行SQL语句的编译,然后给SQL语句的占位符?传值
${}:底层是使用Statement。特点是先进行SQL语句的拼接,再进行SQL语句的编译
Statement存在SQL注入的现象
如果需要SQL语句的关键字放到SQL语句当中就要使用${}
#{}是以值的形式放到SQL语句当中的
批量删除有两种方式
delete from t_car
where id=1 or id=2 or id=3
delete from t_car
where id in(${ids})
select *
from t_car
where brand like concat('%',#{brand},'%')
在核心配置文件当中可以添加typeAliases标签,要写在properties后面,别名不区分大小写
namespace不能用别名机制,resultType可以用别名机制
alias可以省略,省略alias的别名就是类的简名
将这个包下的所有类都起别名,都是类的简名
mapper的标签属性有三个
加上 useGeneratedKeys="true"表示可以使用获取的自增的id值
keyProperty="id"表示将获取的主键赋到对象的哪个属性上
insert into t_Car values (null,#{carNum},#{brand},#{guidePrice},#{produceTime},#{carType})
public void insertCatUseGenerateKeysTest() throws IOException {
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(Resources.getResourceAsStream("org/example/mapper/mybatis-config.xml"));
SqlSession sqlSession = sqlSessionFactory.openSession();
//获取mapper对象
CarMapper mapper = sqlSession.getMapper(CarMapper.class);
Car car = new Car(null,"11111","奥迪a8",200.00,"2023-12-12","新能源");
mapper.insertCarUseGenerateKeys(car);
sqlSession.commit();
sqlSession.close();
System.out.println(car);
}
注意:mapper的方法应该和映射文件当中的sql的id对应
parameterType属性的作用是:告诉方法的参数类型是什么类型
mybatis框架自身带有类型自动推断机制,所以大部分情况下,parameterType属性是省略不写的
当传入的是Map参数的时候,映射文件中sql语句中的#{}写的是map中的key
insert into t_student (id,name,age,height,birth,sex) values (null,#{姓名},#{年龄},#{身高},#{出生日期},#{性别});
public void testInsertStudentByMap(){
SqlSession sqlSession = SqlSessionUtils.openSession();
StudentMapper mapper = sqlSession.getMapper(StudentMapper.class);
Map map = new HashMap<>();
map.put("姓名","赵六");
map.put("年龄",18);
map.put("身高",1.82);
map.put("出生日期",new Date());
map.put("性别",'男');
mapper.insertStudentByMap(map);
sqlSession.commit();
sqlSession.close();
}
当传入的参数是POJO实体类的时候,映射文件中的sql语句的#{}是实体类的属性
insert into t_student (id,name,age,height,birth,sex) values (null,#{name},#{age},#{height},#{birth},#{sex});
mybatis框架会自动创建map集合,并且map集合是以map的方式存储参数的
map.put("arg0",name)
map.put("arg1",age)
当传入的参数是多个参数是,映射文件中的sql语句的#{}是param1,param2....,param n
或者arg0,arg1,...,argn