一、Mybatis简介
1.定义
MyBatis 是支持普通 SQL 查询,存储过程和高级映射的优秀持久层(dao)框架。MyBatis 消除 了几乎所有的 JDBC代码和 参数的手工设置 以及对 结果集的检索。MyBatis 可以使用简单的 XML 或注解用于配置和原始映射,将接口和 Java 的POJO(Plain Old Java Objects,普通的 Java 对象)映射成数据库中的记录。
2.环境搭建
(1)Mybatis配置文件
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
<environments default="development">
<environment id="development">
<!-- 使用jdbc方式控制事务 -->
<transactionManager type="JDBC"/>
<!-- mybatis提供的连接池链接数据
未来:mybatis+spring+sprignmvc 这一步交给spring
-->
<dataSource type="POOLED">
<property name="driver" value="com.mysql.jdbc.Driver"/>
<property name="url" value="jdbc:mysql:///mystu?unicode=true&characterEncoding=utf-8"/>
<property name="username" value="root"/>
<property name="password" value="111"/>
</dataSource>
</environment>
</environments>
<!-- mapper配置 -->
<mappers>
<mapper resource="com/qf/bean/UserMapper.xml"></mapper>
</mappers>
</configuration>
(2)映射文件
<!-- namespace指定的实体类的全路径 -->
<mapper namespace="com.qf.bean.User">
<!--根据id查询用户的方法
id="selectById" 在同一个文件中唯一
parameterType="int" 参数类型
resultType="com.qf.bean.User" 返回值类型
-->
<select id="selectById" parameterType="int" resultType="com.qf.bean.User">
select * from user where id=#{id}
</select>
<!-- 全查
resultType:指定该 sql语句的结果集(每一行对应的)
-->
<select id="findAll" resultType="com.qf.bean.User" >
select * from User
</select>
<!-- 新增
如果参数为对象的话,sql语句中的占位变量应该与数据库中的保持一致
-->
<insert id="saveUser" parameterType="com.qf.bean.User">
insert into User(username,password) values(#{username},#{password})
</insert>
<!-- 修改 -->
<update id="updateUser" parameterType="com.qf.bean.User">
update User set password=#{password} where id=#{id}
</update>
<!-- 删除 -->
<delete id="deleteById">
delete from User where id=#{id}
</delete>
<!-- 新增+返回自增主键 -->
<!-- <insert id="saveUserAndRuturnId" parameterType="com.qf.bean.User">
配置返回自增主键
方法一:使用selectKey节点配置
keyProperty="id":实体类中主键的属性名
keyColumn="id" :数据库中为主键的列名
order="AFTER" :执行该sql语句的时机
resultType="int":该sql语句的返回值类型
<selectKey keyProperty="id" keyColumn="id" order="AFTER" resultType="int">
select last_insert_id()
</selectKey>
insert into User(username,password) values(#{username},#{password})
</insert> -->
<insert id="saveUserAndRuturnId" parameterType="com.qf.bean.User" useGeneratedKeys="true"
keyProperty="id" keyColumn="id">
insert into user(username,password)
values(#{username},#{password})
</insert>
</mapper>
(3)测试类
public class TestMybatis {
public static void main(String[] args) {
//1.指定配置文件
String Config="MybatisConfig.xml";
try {
//2.读取配置文件
Reader reader=Resources.getResourceAsReader(Config);
//3.构建SqlSessionFactory对象
SqlSessionFactory sqlSessionFactory =new SqlSessionFactoryBuilder().build(reader);
//4.通过SqlSessionFactory获得SqlSession
SqlSession sqlSession=sqlSessionFactory.openSession();
//5.通过SqlSession调用映射文件中的sql文件
User user=sqlSession.selectOne("selectById", 2);
System.out.println(user);
sqlSession.commit();
sqlSession.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
3.执行流程
4.插入数据
- 主键返回之自增主键
第一种:
<insert id="saveUserAndRuturnId" parameterType="com.qf.bean.User">
<!--使用selectKey节点配置
keyProperty="id":实体类中主键的属性名
keyColumn="id" :数据库中为主键的列名
order="AFTER" :执行该sql语句的时机
resultType="int":该sql语句的返回值类型-->
<selectKey keyProperty="id" keyColumn="id" order="AFTER" resultType="int">
select last_insert_id()
</selectKey>
insert into User(username,password) values(#{username},#{password})
</insert>
第二种:
<insert id="saveUserAndRuturnId" parameterType="com.qf.bean.User" useGeneratedKeys="true"
keyProperty="id" keyColumn="id">
insert into user(username,password)
values(#{username},#{password})
</insert>
-
主键返回值UUID
UUID函数是mysql的函数<insert id="saveUsersReturnId" parameterType="cm.itqf.pojo.Users"> <!-- select uuid():mysql的函数 能够生成一个随机字符串 keyColumn="id" 表中为主键的列名 keyProperty="id" 表中为主键的属性名 resultType="String" 主键的类型 order="BEFORE" 执行时机 在新增语句的前执行 --> <selectKey keyColumn="id" keyProperty="id" resultType="String" order="BEFORE"> select UUID() </selectKey> insert into users(id,username,password) values(#{id},#{username},#{password}) </insert>
二、mybatis开发dao的方式
- 原始dao层开发方式(例)
MybatisUtils工具类
public class MybatisUtils {
static SqlSession sqlSession;
static SqlSessionFactory sqlSessionFactory;
static{
try {
sqlSessionFactory=new SqlSessionFactoryBuilder().build(Resources.getResourceAsReader("MybatisConfig.xml"));
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
public static SqlSession getSqlSession(){
return sqlSessionFactory.openSession();
}
}
UserDaoimpl实现类
public class UserDaoImpl implements UserDao{
public void saveUser(User u) {
// TODO Auto-generated method stub
SqlSession sqlSession=MybatisUtils.getSqlSession();
sqlSession.insert("saveUser",u);
sqlSession.commit();
sqlSession.close();
}
public User selectById(int id) {
SqlSession sqlSession=MybatisUtils.getSqlSession();
User user=sqlSession.selectOne("selectById",id);
sqlSession.commit();
sqlSession.close();
return user;
}
}
UserMapper 映射文件
<!-- namespace指定的实体类的全路径 -->
<mapper namespace="com.qf.bean.User">
<!--根据id查询用户的方法
id="selectById" 在同一个文件中唯一
parameterType="int" 参数类型
resultType="com.qf.bean.User" 返回值类型
-->
<select id="selectById" parameterType="int" resultType="com.qf.bean.User">
select * from user where id=#{id}
</select>
<!-- 全查
resultType:指定该 sql语句的结果集(每一行对应的)
-->
<select id="findAll" resultType="com.qf.bean.User" >
select * from User
</select>
<!-- 新增
如果参数为对象的话,sql语句中的占位变量应该与数据库中的保持一致
-->
<insert id="saveUser" parameterType="com.qf.bean.User">
insert into User(username,password) values(#{username},#{password})
</insert>
</mapper>
注意:
SqlSessionFactory,它的生命周期,应该是应用范围,全局范围只有一个工厂,使用单例模式来实现这个功
能。与spring集成之后,由spring来对其进行单例管理。
SqlSession,它内部含有一块数据区域,存在线程不安全的问题,所以应该将sqlsession声明到方法内部。