编程思想的培养?
1.什么时候需要传参?
add(对象 引用) update(对象 引用) delete(int id) delete(对象 引用) findById(int id)
2.什么时候需要返回值?
List<对象> findAll() , 对象 findById()
3.返回值改为int类型 传参+返回值一起写 谁执行效率高?
int delete(int id) 代码会多 相对来说 返回值为int 需要判断
void delete(对象) 这样效率好 代码少
总结: 增加 更新 删除 都是无返回值 编译速度块 执行效率高
mybatis框架的优缺点:
优点:
(1)与jdbc相比,减少了50%以上的代码量.
(2)最简单的持久化框架,小巧并简单易学
(3)SQL代码从程序代码中彻底分离,可重用
(4)提供xml标签 支持编写动态sql
(5)提供映射标签,支持对象与数据库的ORM字段映射
缺点:
(1)SQL语句编写工作量大,对开发人员有一定要求
(2)数据库移植性差
mybatis专注于SQL本身,是一个足够灵活的Dao层解决方案,适用于性能要求较高或者需求多变的互联项目
MyBatis的开发步骤:
1.下载mybatis.jar包并导入工程
2.编写MyBatis核心配置文件(configuration.xml)
3.创建实体类 --entity
4.dao层-SQL映射文件(mapper.xml)***
5.创建测试类
读取核心配置文件mybatis-config.xml
创建SqlSessionFactory对象,读取配置文件
创建SqlSession对象
调用mapper文件进行数据操作
提交事物(可选)
三者的作用域:
SqSessionFactoryBuilder
- 用过即丢,推荐作用范围:方法体内
SqlSessionFactory - 最佳作用范围:应用的全局作用域
- 生命周期与应用的生命周期相同
SqlSession - 线程级
- 一个request请求期间
面试题: jdbc hibernate mybatis 区别
jdbc: 优点: sql语句非常灵活 可移植性最强(相对来说).
缺点: 代码量多 冗余 java代码和sql耦合在一起 不利用代码维护.
hibernate: 优点:完全面向对象写法 利用HQL语句 完全脱离java代码和sql.
缺点: 全封装的框架 底层代码出问题 不好调试 可移植性差.
mybatis: 优点: 半封装的框架 脱离java代码和sql 可移植性非常强 应用非常灵活.
缺点:大量写sql语句(不包含java代码 ) 代码量多.
Mybatis框架中最重要的是就是子配置文件中的SQL语句
List<T> 返回值就是T 默认对象存到数组([])
List<Map<String,Object>> 返回值就是第一个泛型的类型 集合类默认存集合({})
展示sql使用log4g
主配置文件
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE configuration PUBLIC"-//[mybatis.org//DTD](http://mybatis.org//DTD) Config 3.0//EN"
"[http://mybatis.org/dtd/mybatis-3-config.dtd"];>
<configuration>
<properties resource="db.properties"/>
<!--起别名 -->
<typeAliases>
<typeAlias alias="Dept" type="com.lanou.entity.Dept"/>
<typeAlias alias="user" type="com.lanou.entity.User"/>
</typeAliases>
<!-- 与数据库的连接 -->
<environments default="development"> -----默认的运行id
<environment id="development">---运行id
<transactionManager type="JDBC" />---事务管理器配置
<dataSource type="POOLED">---数据源配置
<property name="driver" value="${driver}" />
<property name="url" value="${url}" />
<property name="username" value="${username}" />
<property name="password" value="${password}" />
</dataSource>
</environment>
</environments>
<!--加入子配置文件:部门 -->
<mappers>
<mapper resource="com/lanou/entity/DeptMapper.xml" />
<mapper resource="com/lanou/entity/UserMapper.xml" />
</mappers>
</configuration>
子配置文件
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC"-//[mybatis.org//DTD](http://mybatis.org//DTD) Mapper 3.0//EN"
"[http://mybatis.org/dtd/mybatis-3-mapper.dtd"];>
<mapper namespace="com.lanou.dao.DeptDao">
<!-- id 是接口中的方法名 parameterType接口中参数 是全类名 resultType 返回值类型
占位符:#{字段名} 等同于?
注意事项: 任何SQL语句不要加分号 ;
命名空间:接口的全类名
-->
<insert id="add" parameterType="com.lanou.entity.Dept" > -----添加
insert into dept(dname,loc) values(#{dname},#{loc})
</insert>
<select id="findAll" resultType="com.lanou.entity.Dept">-----查询
select * from dept
</select>
<select id="findById" parameterType="Integer" resultType="com.lanou.entity.Dept">----通过id查询
select * from dept where deptno=#{id}
</select>
<update id="update" parameterType="com.lanou.entity.Dept">----更新
update dept set dname=#{dname},loc=#{loc} where deptno=#{deptno}
</update>
<delete id="delete" parameterType="com.lanou.entity.Dept">-----删除
delete from dept where deptno=#{deptno}
</delete>
<select id="findDnameByLoc" parameterType="String" resultType="com.lanou.entity.Dept">---查询 通过loc查dname
select * from dept where loc=#{loc}
</select>
<select id="findDnameByLoc2" parameterType="String" resultType="Map">--同上 返回值不同 List<Map<String,Object>>
select * from dept where loc=#{loc}
</select>
<!--动态sql 类似模糊查询 -->
<select id="find2" resultType="com.lanou.entity.Dept">
select * from dept
<where>
<if test="dname!=null">
and dname=#{dname}
</if>
<if test="loc!=null">
and loc=#{loc}
</if>
</where>
</select>
</mapper>
数据库中字段和实体类中的属性不一致 写SQL要起别名 都是在子配置文件
第一种方法
select u.id u_id,u.name u_name,u.age u_age from user u
id name age数据库中字段名
u_id u_name u_age 是实体类中的属性
第二种方法
<resultMap type="user" id="map">
<!-- 指定主键 -->
<id column="id" property="u_id"/>
<!-- 普通字段-->
<result column="name" property="u_name"/>
<result column="age" property="u_age"/>
</resultMap>
<select id="find2" resultType="map">
select * from user u
</select>
表关系
首先,建立三张表 user info book
建立实体类
public class Book {
private Integer b_id;
private String b_nanme;
private Info info;
public class Info {
private int i_id;
private String i_work;
public class User {
private int id;
private String name;
private int age;
//对一
private Info info;
// 对多
private Set<Book> book;
省略上面的set get方法以及toString方法
对一关系
在UserMapper.xml中
<!-- 对一 -->
<!-- <resultMap type="com.lanou.entity.User" id="u">
user表
<id column="id" property="id"/>
<result column="name" property="name"/>
<result column="age" property="age"/>
info 对一关系:association
property 对象中的属性
javaType:指定对象与对象之间的关系
id标签:声明表中的主键
result标签:声明表中普通字段
<association property="info" javaType="com.lanou.entity.Info">
<id column="i_id" property="i_id"/>
<result column="i_work" property="i_work"/>
</association>
</resultMap>
<select id="find" resultMap="u">
select u.id ,u.name,u.age,i.i_id,i.i_work from user u left join info i on u.i_id=i.i_id
</select>
测试
//@Test
public void testsel() throws IOException{
//加载主配置文件
Reader reader=Resources.getResourceAsReader("mybatis-config.xml");
//创建SqlSessionFactoryBuilder
SqlSessionFactoryBuilder sessionFactoryBuilder=new SqlSessionFactoryBuilder();
//创建session工厂
SqlSessionFactory sessionFactory=sessionFactoryBuilder.build(reader);
//利用工厂开始session
SqlSession session=sessionFactory.openSession();
List<User> list=session.selectList("user.find");
System.out.println(list);
}
对多关系
<resultMap type="com.lanou.entity.User" id="boo">
<!-- user表-->
<id column="id" property="id"/>
<result column="name" property="name"/>
<result column="age" property="age"/>
<!--book -->
<collection property="book" ofType="com.lanou.entity.Book">
<id column="b_id" property="b_id"/>
<result column="b_name" property="b_nanme"/>
</collection>
</resultMap>
<select id="findall" resultMap="boo">
select u.id ,u.name,u.age,b.b_id,b.b_name from user u left join book b on u.id=b.u_id
</select>
测试
@Test
public void testsel1() throws IOException{
//加载主配置文件
Reader reader=Resources.getResourceAsReader("mybatis-config.xml");
//创建SqlSessionFactoryBuilder
SqlSessionFactoryBuilder sessionFactoryBuilder=new SqlSessionFactoryBuilder();
//创建session工厂
SqlSessionFactory sessionFactory=sessionFactoryBuilder.build(reader);
//利用工厂开始session
SqlSession session=sessionFactory.openSession();
List<User> list=session.selectList("user.findall");
System.out.println(list);
}
模糊查询语句
<!-- 模糊查询 语法:'%'||#{模糊字段}||'%',其中||代表"连接符" -->
<select id="queryLike" resultType="com.lanou.entity.Emp" parameterType="String">
select * from emp where ename like '%'||#{ename}||'%'
</select>
mybatis框架就是连接数据库,做增删改查,我觉得最重要的就是sql语句,只要sql语句正确,其他的问题也就都不是问题了,在ssm项目中都不用单独建立mybatis的配置文件,之间在Spring的配置文件中写就可以,Spring中可以很好的整合mybatis框架. 重点是mapper文件 重点是mapper文件重点是mapper文件