回顾
事务相关的方法
conn.setAutoCommit(false)conn.commit()conn.rollback()
事务控制注意事项
放在 service 层事务执行过程中的多条 sql 需要使用同一个连接连接不应该在 dao 关闭,在 service 层关闭
连接池的好处
重用数据库连接创建数据库连接非常耗时,连接池可以节省创建连接的时间
连接池
接口 DataSource
druid 连接池的实现类是什么
DruidDataSource
c3p0 连接池的实现类是什么
ComboPooledDataSource
连接池能配置哪些东西
基本连接信息(驱动类、url,用户名、密码)初始连接数最大连接数获取连接超时时间
自定义连接池的核心是什么
返回的不是真正的数据库连接,而是经过包装后的数据库连接包装后的数据库连接 重写了 close,close 将连接归还给连接池
今日内容
1. 代理(难点)
动态代理 - 简化包装类的生成过程,它不需要编写 *.java 代码,在运行期间动态生成 *.class
public static void main(String
[] args
) {
Student stu
= new Student();
ClassLoader loader
= Student
.class.getClassLoader();
Class
[] interfaces
= {StudentInterface
.class};
StudentInterface proxy
= (StudentInterface
) Proxy
.newProxyInstance(loader
, interfaces
, new InvocationHandler() {
@Override
public Object
invoke(Object proxy
, Method method
, Object
[] args
) throws Throwable
{
if(method
.getName().equals("study")) {
System
.out
.println("偷个懒!!");
return null
;
} else {
return method
.invoke(stu
, args
);
}
}
});
proxy
.eat("aaa");
System
.out
.println("=========================");
proxy
.study();
}
2. mybaits(重点)
框架概念:dao 层框架,数据库的增删改查,底层封装了 jdbc
ORM 概念:object relational mapping(映射关系)
api
Resources.getResourceAsStream(“配置文件的路径(类路径 src)”)SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(配置文件的字节输入流);SqlSession sqlSession = factory.openSession() // 手动提交事务SqlSession sqlSession = factory.openSession(true) // 自动提交事务查询多个 : sqlSession.selectList(“sql的标识”, 参数);查询一个 : sqlSession.selectOne(“sql的标识”, 参数);新增 : sqlSession.insert(“sql的标识”, 参数);修改 : sqlSession.update(“sql的标识”, 参数);删除 : sqlSession.delete(“sql的标识”, 参数);
mapper 映射文件(增删改查)
<select id="唯一标识" resultType="要封装的对象类型" parameterType="参数的类型">
select 语句
</select>
多个参数例子
<select id="selectByNameAndAge" resultType="com.itheima.domain.Student"
parameterType="map">
select sid, name, age, birthday from student
where name=#{n} and age=#{a}
</select>
调用:
Map
<String, Object> map
= new HashMap<>();
map
.put("n", "张三");
map
.put("a", 23);
Student stu
= sqlSession
.selectOne("StudentMapper.selectByNameAndAge", map
);
新增获取自增id例子
<insert id="insert" parameterType="com.itheima.domain.Student"
useGeneratedKeys="true" keyProperty="sid">
insert into student values(null,#{name},#{age},#{birthday})
</insert>
useGeneratedKeys 作用:告诉 mybatis,请使用数据库产生的主键值
keyProperty :告诉 mybatis,student 中哪个属性对应着主键
关于#{} 参数
如果参数是简单类型 #{随便写}如果参数是map类型 #{key}如果参数是自定义类型(例如student类型)#{属性}
核心配置文件
下面的两个标签掌握即可
<typeAliases></typeAlias>
<mappers></mappers>