mybatis01

tech2024-12-19  3

回顾

事务相关的方法

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(); //1. 类加载器 ClassLoader loader = Student.class.getClassLoader(); //2. 代理类要实现的接口(确定了代理类中有哪些方法) Class[] interfaces = {StudentInterface.class}; // 3. InvocationHandler 给代理类提供它方法的代码 // 创建代理类的对象 StudentInterface proxy = (StudentInterface) Proxy.newProxyInstance(loader, interfaces, new InvocationHandler() { @Override // 将来代理类中任意方法执行时,都会进入invoke, method 表示调用代理对象的哪个方法 public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { /*System.out.println("进入了 invoke 方法是:" + method + " 参数:" + Arrays.toString(args)); return null;*/ if(method.getName().equals("study")) { System.out.println("偷个懒!!"); return null; } else { // 正常 对象.方法(参数) // 反射调用 方法.invoke(对象, 参数) return method.invoke(stu, args); } } }); // System.out.println(proxy.getClass()); 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> <!-- 如果就一个参数,直接写参数的类型即可 #{随意} --> <!-- 如果向传递多个参数,可以使用 map 集合,map 的 key 对应参数 #{key} -->

多个参数例子

<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>
最新回复(0)