1.什么是框架
在说mybatis之前先来说说什么是框架:所谓的框架的就是别人封装好的一些代码。你只需要在代码的基础上添加i需要的内容。使用框架可以提高开发效率。
2.什么是mybatis框架
mybatis就是ORM持久化框架。o:object对象 r:relative关系 m:mapping 映射。解决把数据库中的记录映射到java实体类对象上。通俗来说就是解决jdbc的。
3.为什么使用mybatis框架
1.思考:jdbc有什么问题?
(1)比如查询时需要把数据库中的列的值擦除并复制给对象的属性。
(2)增加修改时需要围殴每一个占位符赋值
2.mybatis框架可以解决上面这些问题。
4.如何使用mybatis框架
(1)创建一张表
create database mybatis;
use mybatis;
CREATE TABLE users(id INT PRIMARY KEY AUTO_INCREMENT, NAME
VARCHAR(20), age INT);
INSERT INTO users(NAME, age) VALUES('Tom', 12);
INSERT INTO users(NAME, age) VALUES('Jack', 11);
(2)创建maven的java工程
(3)加入相关的依赖jar包
<dependencies>
<!--mysql得驱动-->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.25</version>
</dependency>
<!--mybatis得依赖-->
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.5.6</version>
</dependency>
</dependencies>
(4)创建实体类
public class User {
private Integer id;
private String name;
private Integer age;
@Override
public String toString() {
return "User{" +
"id=" + id +
", name='" + name + '\'' +
", age=" + age +
'}';
}
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Integer getAge() {
return age;
}
public void setAge(Integer age) {
this.age = age;
}
}
(5)创建mybatis的配置文件。 xml--数据源信息
<?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">
<transactionManager type="JDBC" />
<!--数据源name对应的值是固定的。 -->
<dataSource type="POOLED">
<property name="driver" value="com.mysql.jdbc.Driver" />
<property name="url" value="jdbc:mysql://localhost:3306/mybatis?serverTimezone=Asia/Shanghai" />
<property name="username" value="root" />
<property name="password" value="root" />
</dataSource>
</environment>
</environments>
</configuration>
(6)配置映射文件--实体类和表的映射
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<!--namespace: 命名空间 现在可以随便起名
以后必须和dao得类名对应
-->
<mapper namespace="userDao">
<!--sql语句
select:表示查询标签
id: 唯一标识
resultType: 表示查询的结果以java中的哪种数据类型来封装
#{id}: 占位符
-->
<select id="getById" resultType="com.ykq.entity.User">
select * from users where id=#{id}
</select>
</mapper>
(7)把映射文件加入到配置文件中
(9)测试
5.通过mybatis完成crud
在映射文件中写:
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<!--namespace: 命名空间 现在可以随便起名
以后必须和dao得类名对应
-->
<mapper namespace="userDao">
<!--sql语句
select:表示查询标签
id: 唯一标识
resultType: 表示查询的结果以java中的哪种数据类型来封装
#{id}: 占位符
-->
<select id="getById" resultType="com.ykq.entity.User">
select * from users where id=#{id}
</select>
<!--增加
parameterType:参数的类型
注意: #{name}要和实体类属性对应
添加使用需要把生产的id值赋值给属性。
1. useGeneratedKeys=true 使用生成得key
2. keyProperty:把生产的key赋值给实体类中的哪个属性名
-->
<insert id="addUser" parameterType="com.ykq.entity.User" useGeneratedKeys="true" keyProperty="id">
insert into users(NAME, age) values(#{name},#{age})
</insert>
<!--修改-->
<update id="updateUser" parameterType="com.ykq.entity.User">
update users set name=#{name},age=#{age} where id=#{id}
</update>
<!--删除-->
<delete id="deleteUser" parameterType="int">
delete from users where id=#{id}
</delete>
<select id="selectAll" resultType="com.ykq.entity.User">
select * from users
</select>
</mapper>
测试:
public class TestMybatis01 {
public static void main(String[] args) throws Exception {
//1.读取mybatis配置文件
Reader reader = Resources.getResourceAsReader("mybatis-conf.xml");
//2.SqlSessionFactory对象
SqlSessionFactory sessionFactory=new SqlSessionFactoryBuilder().build(reader);
//3. 获取SqlSession对象--连接数据
SqlSession session=sessionFactory.openSession();
//4. 执行sql String statement 执行的是哪个sql标签, Object parameter 传递的参数
// User user=session.selectOne("userDao.getById",2);
// System.out.println(user);
// //添加
// User user=new User();
// user.setName("郑杰瀚");
// user.setAge(17);
// int row = session.insert("userDao.addUser", user);
// System.out.println(user);
// //修改
// User user =new User(8,"李兵帅",18);
// session.update("userDao.updateUser",user);
//删除
// int delete = session.delete("userDao.deleteUser", 1);
//查询所有
List<User> list = session.selectList("userDao.selectAll");
System.out.println(list);
//TODO 事物不了解 默认连接数据库的事物是开启。
session.commit();//提交
}
}
事务
1.什么时事物?
有一些动作组成,这些动作要么都成功或者都失败【原子性】
2.mybatis默认事物自动提交时关闭的
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.SQLException;
//转账功能: A(减钱)---B【加钱】转钱
public class TestJDBCTransaction {
public static void main(String[] args) {
Connection connection=null;
try {
Class.forName("com.mysql.cj.jdbc.Driver");
connection = DriverManager.getConnection("jdbc:mysql://localhost:3306/mybatis?serverTimezone=Asia/Shanghai", "root", "root");
connection.setAutoCommit(false); //关闭自动提交
String sql = "update users set age=age-100 where name='Jack'";
PreparedStatement ps = connection.prepareStatement(sql);
int i = ps.executeUpdate(); //事物自动提交
String sql2 = "update users set age=age+100 where name='褚松明'";
ps = connection.prepareStatement(sql2);
int i2 = ps.executeUpdate();
connection.commit();//手动提交事物
}catch (Exception e){
try {
connection.rollback(); //事物回滚
} catch (SQLException throwables) {
throwables.printStackTrace();
}
}finally {
}
}
}
3.Lombok插件
作用:省略实体类的get set构造函数以及tostring
(1)安装lombok插件====>settings---->plugins---->lombok
(2)引入lombok得jar包
<!--lombok-->
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.18.18</version>
</dependency>
(3)在实体类使用相关的注解
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
@Data //生产set和get方法 toString.
@NoArgsConstructor
@AllArgsConstructor
public class User {
private Integer id;
private String name;
private Integer age;
}
实际开发中mybatis的映射文件和DAO接口一起用
(1)创建相应的dao接口
(2)映射文件
(3)测试