1、概念-什么是MyBatis
MyBatis
是属于持久层框架,它支持自定义 SQL
、存储过程以及高级映射。MyBatis
免除了几乎所有的 JDBC
操作细节。MyBatis
可以通过简单的 XML
或注解来配置和映射原始类型、接口和 Java POJO
(Plain Old Java Objects
,普通老式 Java
对象)为数据库中的记录。
2、数据库事务(Database Transaction)
1、数据库的事务,简称事务
如果N
个数据库的操作放到了同一个事务中,那么这N
个操作最终要么全都生效,要么全都不生效
2、事务关键语句
START TRANSACTION
:开启事务
ROLLBACK
:回滚事务:只要一个操作失败,其他所有操作都回到事务开始时状态
COMMIT
:提交事务,如果事务中的所有操作都成功了,提交事务,这些操作才真正生效
START TRANSACTION;
UPDATE skill SET level = level - 500 WHERE id = 1;
UPDATE skill SET level = level + 500 WHERE id = 2;
COMMIT;
3、事务的四大特性(ACID
)
原子性(Atomicity
)
事务作为一个整体被执行,包含在其中的对数据库的操作要么全部被执行,要么都不执行。
一致性(Consistency
)
事务应确保数据库的状态从一个一致状态转变为另一个一致状态。指数据库中数据应满足完整性约束。
隔离性(Isolation
)
多个事务并发执行时,一个事务的执行不影响其他事务的执行
持久性(Durability
)
已被提交的事务对数据库的修改应该永久保存在数据库中
3、JDBC的事务管理
在JDBC
中,使用connection
对象来管理事务
Connection connection = DriverManager.getConnection("", "", "");
// 不要自动提交事务
connection.setAutoCommit(false);
try {
PreparedStatement statement1 = connection.prepareStatement("UPDATE 1");
statement1.executeUpdate();
PreparedStatement statement2 = connection.prepareStatement("UPDATE 2");
statement2.executeUpdate();
} catch (Exception e) {
e.printStackTrace();
connection.rollback();
}
connection.commit();
setAutoCommit(false)
:开启事务
rollback()
:回滚事务
commit()
:提交事务
4、MyBatis的使用
1、在pom.xml
中添加依赖
<dependencies>
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.5.5</version>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.49</version>
</dependency>
</dependencies>
2、在resources
文件夹下创建resources/mappers/skill.xml
配置文件
<?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">
<!--命名空间-->
<mapper namespace="skill">
<!-- 字段映射-->
<resultMap id="rmSkill" type="com.sj.bean.Skill">
<result property="id" column="id"></result>
<result property="createdTime" column="created_time"></result>
<result property="name" column="name"></result>
<result property="level" column="level"></result>
</resultMap>
<select id="list" resultMap="rmSkill">
SELECT * FROM skill
</select>
<!--传一个参数 # 只是相当于占位符, parameterMap可沈略-->
<select id="get" resultMap="rmSkill" parameterType="int">
SELECT * FROM skill WHERE id = ${id}
</select>
<!-- 传多个参数-->
<select id="list2" resultMap="rmSkill" parameterMap="java.util.Map">
SELECT * FROM skill WHERE id = #{id} OR level > #{level}
</select>
</mapper>
1、
#{id}
是参数的占位符,名字任意
2、${}
:直接文本替换,模糊查询'%${key}%'
可以正常使用,在替换整条SQL
语句中可以使用
3、#{}
:预编译传值,可以防止SQL
注入,在模糊查询中'%${key}%'`不能正常使用
- 不传参数
public void select1() throws Exception {
try(SqlSession session = Mybatises.openSession()) {
List<Skill>skills = session.selectList("skill.list");
for (Skill skill: skills) {
System.out.println(skill);
}
}
}
- 传一个参数
public void select2() throws Exception{
try(SqlSession session = Mybatises.openSession()) {
Skill skill = session.selectOne("skill.get", 4);
System.out.println(skill);
}
}
- 传多个参数
public void select3() throws Exception{
try(SqlSession session = Mybatises.openSession()) {
Map map = new HashMap();
map.put("id", 4);
map.put("level", 50);
List<Skill> skills = session.selectList("skill.list2", map);
System.out.println(skills);
// 或者
Skill skill = new Skill();
skill.setId(4);
skill.setLevel(50);
List<Skill> skills2 = session.selectList("skill.list2", skill);
System.out.println(skills2);
}
}
3、在resources
下创建mybatis-config.xml
文件,并配置mybatis-config.xml
文件
<?xml version="1.0" encoding="UTF-8" ?>
<!--两个参数是约束xml文件-->
<!DOCTYPE configuration
PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
<!-- 其他设置-->
<settings>
<!-- 是否开启驼峰命名自动映射, 例如: A_COLUMN 映射到Java属性名 aColumn-->
<setting name="mapUnderscoreToCamelCase" value="true"/>
<!-- 打印日志信息-->
<setting name="logImpl" value="STDOUT_LOGGING"/>
</settings>
<!-- 环境-->
<environments default="development">
<!-- 开发环境-->
<environment id="development">
<transactionManager type="JDBC"/>
<!-- 采用连接池的方式管理-->
<dataSource type="POOLED">
<property name="driver" value="com.mysql.jdbc.Driver"/>
<property name="url" value="jdbc:mysql://localhost:3306/xr"/>
<property name="username" value="root"/>
<property name="password" value="shijikl126"/>
</dataSource>
</environment>
</environments>
<!-- 映射文件-->
<mappers>
<mapper resource="mappers/skill.xml"/>
</mappers>
</configuration>
配置SQL
日志打印,可以在mybatis-config.xml
文件配置如下
<setting name="logImpl" value="STDOUT_LOGGING"/>
或者,在pom.xml
文件中配置
<dependency>
<groupId>ch.qos.logback</groupId>
<artifactId>logback-classic</artifactId>
<version>1.2.3</version>
<scope>test</scope>
</dependency>
4、在test
文件夹下编辑Test
代码
public class SkillTest {
@Test
public void select() throws Exception {
Reader reader = Resources.getResourceAsReader("mybatis-config.xml");
// 创建工厂构建器
SqlSessionFactoryBuilder builder = new SqlSessionFactoryBuilder();
// 创建一个工厂
SqlSessionFactory factory = builder.build(reader);
// 创建一个session
SqlSession session = factory.openSession();
// 执行sql语句
List<Skill>skills = session.selectList("skill.list");
for (Skill skill: skills) {
System.out.println(skill);
}
session.close(); // 关闭session
}
}
5、多表查询
对company
和experience
两张表进行查询
编写test
测试代码
public void select1() throws Exception {
try(SqlSession session = Mybatises.openSession()) {
List<Experience>experiences = session.selectList("experience.list");
for (Experience experience: experiences) {
System.out.println(experience);
}
}
}
创建resources/experience.xml
配置文件
<?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">
<!--命名空间-->
<mapper namespace="experience">
<!-- 字段映射-->
<resultMap id="rmExperience" type="com.sj.bean.Experience">
<result property="company.id" column="t2_id"></result>
<result property="company.name" column="t2_name"></result>
</resultMap>
<select id="list" resultMap="rmExperience">
SELECT
t1.*,
t2.id t2_id,
t2.name t2_name
FROM
experience t1
JOIN company t2 ON t1.company_id = t2.id
</select>
</mapper>
或者experience.xml
配置文件也可以配置成如下
<?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">
<!--命名空间-->
<mapper namespace="experience">
<select id="list" resultType="com.sj.bean.Experience">
SELECT
t1.*,
t2.id `company.id`,
t2.name `company.name`
FROM
experience t1
JOIN company t2 ON t1.company_id = t2.id
</select>
</mapper>
亦可以映射成为map
<mapper namespace="experience">
<select id="list" resultType="java.util.LinkedHashMap">
SELECT
t1.*,
t2.id `company.id`,
t2.name `company.name`
FROM
experience t1
JOIN company t2 ON t1.company_id = t2.id
</select>
</mapper>
java
的测试代码编写
@Test
public void select2() throws Exception {
try(SqlSession session = Mybatises.openSession()) {
List<Map<String, Object>>experiences = session.selectList("experience.list");
for (Map<String, Object> experience: experiences) {
System.out.println(experience);
}
}
}
网友评论