1.Mybatis介绍:
(1).MyBatis是一款优秀的基于java的持久层框架,它内部封装了jdbc,使开发者只需要关注sql语句本身,而不需要花费精力去处理加载驱动、创建连接、创建statement等繁杂的过程。
(2).通过xml 文件或注解的方式将要执行的各种 statement 配置起来,并通过java对象和 statement中sql的动态参数进行映射生成最终执行的sql语句,最后由mybatis框架执行sql并将结果映射为java对象并返回。
(3)优点:简化JDBC,能执行sql语句,将sql转换为Java对象
2.基本mybatis实现
需要定义实体类,Dao接口,Dao接口的Mapper文件,mybatis主配置文件。
(1)实体类:定义实体的属性,给属性设置set,get方法,重写toString方法
(2)Dao接口:定义操作数据库的方法
(3)Mapper文件:写入sql语句,与Dao接口中方法相映射
(4)主配置文件:写入数据库信息,Mapper文件位置
使用步骤:添加mybatis依赖,mysql驱动,定义dao接口,定义mapper文件,定义主配置文件,使用sqlsession对象执行sql语句
//实体类
public class Customer {
//属性
//set get方法
//toString方法
}
}
//dao接口
public interface CustomerDao {
public List<Customer> findAll();
public List<Customer> findLike(String name);
public int insert(Customer customer);
public int delete(int id);
public int update(Customer customer);
}
//映射文件
<mapper namespace="com.yuan.dao.CustomerDao">
<select id="findAll" resultType="com.yuan.domain.Customer">
select * from customer
</select>
<select id="findLike" resultType="com.yuan.domain.Customer">
select * from customer where cust_name like #{name}
</select>
<insert id="insert">
insert into customer(cust_id,cust_name) values(#{cust_id},#{cust_name})
</insert>
<update id="update">
update customer cust_name=#{type_name} where cust_id=#{cust_id}
</update>
<delete id="delete">
delete from customer where cust_id=#{typeId}
</delete>
</mapper>
//mybatis主配置文件
<configuration>
<environments default="mydev">
<environment id="mydev">
<transactionManager type="JDBC"/>
<dataSource type="POOLED">
<!--数据库的驱动类名-->
<property name="driver" value="com.mysql.jdbc.Driver"/>
<!--连接数据库的url字符串-->
<property name="url" value="jdbc:mysql://localhost:3306/18jxnu_boot"/>
<!--访问数据库的用户名-->
<property name="username" value="root"/>
<!--密码-->
<property name="password" value=""/>
</dataSource>
</environment>
</environments>
<!-- sql mapper(sql映射文件)的位置-->
<mappers>
<!--一个mapper标签指定一个文件的位置。
从类路径开始的路径信息。 target/clasess(类路径)
-->
<mapper resource="com/yuan/dao/CustomerDao.xml"/>
<mapper resource="com/yuan/dao/UserDao.xml"/>
</mappers>
</configuration>
3.SqlSessionFactoryBuilder、SqlSessionFactory、SqlSession分析
SqlSessionFactoryBuilder从命名上可以看出,这个是一个 Builder 模式的,用于创建 SqlSessionFactory的类
SqlSessionFactory顾名思义,是用于生产 SqlSession 的工厂。
SqlSession 包含了执行 SQL 的所有的方法
4.将获取sqlsession对象封装为工具类
//工具类
public class MyBatisUtils {
private static SqlSessionFactory factory = null;
static {
String config="mybatis.xml";
try {
//Resources负责读取主配值文件
InputStream in = Resources.getResourceAsStream(config);
//创建SqlSessionFactory对象,使用SqlSessionFactoryBuild
factory = new SqlSessionFactoryBuilder().build(in);
} catch (IOException e) {
e.printStackTrace();
}
}
//获取SqlSession的方法
public static SqlSession getSqlSession() {
SqlSession sqlSession = null;
if( factory != null){
sqlSession = factory.openSession();// 非自动提交事务
}
return sqlSession;
}
}
5.Mybatis的动态代理:
SqlSession中可以通过getMapper()拿到代理对象,SqlSession.getMapper 运用了 JDK动态代理,产生了目标Mapper接口的代理对象。
动态代理的 代理类是 MapperProxy ,这里边mapperMethod.execute(sqlSession, args)最终完成了增删改查方法的调用。
//测试方法
public void TestFindAll() throws IOException {
SqlSession session = MyBatisUtils.getSqlSession();
CustomerDao dao = session.getMapper(CustomerDao.class);
//动态代理:session.getMapper() 方法内部产生了CustomerDao的实现类。
List<Customer> customers = dao.findAll();
for(Customer cust: customers){
System.out.println("顾客="+cust);
}
session.close();
}
6.多表查询
需要使用resultMap关联结果集映射
<mapper namespace="com.yuan.dao.UserDao">
<resultMap id="cust_user" type="com.yuan.domain.Sys_user">
<result column="cust_name" property="customer.cust_name"/>
</resultMap>
<select id="findAll" resultMap="cust_user">
select sys_user.user_id,customer.cust_id,customer.cust_name,customer.cust_address,sys_user.user_name from sys_user inner join customer on customer.cust_id=sys_user.cust_id
</select>
</mapper>
7.#{}和${}的区别是什么?
(1)Mybatis 在处理#{}时,会将 sql 中的#{}替换为?号,调用 PreparedStatement 的 set 方法来赋值
(2)Mybatis在处理美元符号时,就是把其替换成变量的值
(3)使用#{}可以有效的防止 SQL 注入,提高系统安全性
#是预编译处理, $是字符串替换
8.MyBatis 传递参数
(1)一个简单参数
Dao 接口中方法的参数只有一个简单类型(java 基本类型和 String),占位符 #{ 任意字符 },和方
法的参数名无关。
(2)多个参数-使用@Param
当 Dao 接口方法多个参数,需要通过名称使用参数。在方法形参前面加入@Param(“自定义参数名”),
mapper 文件使用#{自定义参数名}。
9.resultType
执行 sql 得到 ResultSet 转换的类型,使用类型的完全限定名或别名。 注意如果返回的是集
合,那应该设置为集合包含的类型,而不是集合本身。resultType 和 resultMap,不能同时使用。
返回的类型使用构造方法创建对象。调用 setXXX 给属性赋值。