MyBatis框架的使用(入门)
作者:互联网
MyBatis框架
MyBatis前述
原生JDBC编程存在的问题
JDBC程序
public static void main(String[] args) {
Connection connection = null;
PreparedStatement preparedStatement = null;
ResultSet resultSet = null;
try {
//①加载数据库驱动
Class.forName("com.mysql.JDBC.Driver");
//②通过驱动管理类获取数据库链接
connection = DriverManager.getConnection("JDBC:mysql://localhost:3306/mybatis?characterEncoding=utf-8", "root", "mysql");
//定义sql语句 ?表示占位符
String sql = "select * from user where username = ?";
//③获取预处理statement
preparedStatement = connection.prepareStatement(sql);
//设置参数,第一个参数为sql语句中参数的序号(从1开始),第二个参数为设置的参数值
preparedStatement.setString(1, "王五");
//④向数据库发出sql执行查询,查询出结果集
resultSet = preparedStatement.executeQuery();
//遍历查询结果集
while(resultSet.next()){
System.out.println(resultSet.getString("id")+" "+resultSet.getString("username"));
}
} catch (Exception e) {
e.printStackTrace();
}finally{
//⑤释放资源
if(resultSet!=null){
try {
resultSet.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
if(preparedStatement!=null){
try {
preparedStatement.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
if(connection!=null){
try {
connection.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
}
上边使用JDBC的原始方法(未经封装)实现了查询数据库表记录的操作。
JDBC编程步骤
- 加载数据库驱动
- 创建并获取数据库链接
- 创建JDBC statement对象
- 设置sql语句
- 设置sql语句中的参数(使用preparedStatement)
- 通过statement执行sql并获取结果
- 对sql执行结果进行解析处理
- 释放资源(resultSet、preparedstatement、connection)
JDBC存在问题
- 数据库链接创建、释放频繁造成系统资源浪费从而影响系统性能,如果使用数据库链接池可解决此问题。
- Sql语句在代码中硬编码,造成代码不易维护,实际应用sql变化的可能较大,sql变动需要改变java代码。
- 使用preparedStatement向占位符号传参数存在硬编码,因为sql语句的where条件不一定,可能多也可能少,修改sql还要修改代码,系统不易维护。
- 对结果集解析存在硬编码(查询列名),sql变化导致解析代码变化,系统不易维护,如果能将数据库记录封装成pojo对象解析比较方便。
MyBatis简介
MyBatis
- MyBatis 是支持定制化 SQL、存储过程以及高级映射的优秀的持久层框架;
- MyBatis 避免了几乎所有的 JDBC 代码和手动设置参数以及获取结果集;
- MyBatis可以使用简单的XML或注解用于配置和原始映射,将接口和Java的POJO(Plain Old JavaObjects,普通的Java对象)映射成数据库中的记录。
MyBatis特点
- MyBatis是一个半自动化的持久化层框架;
- 对开发人员而言,核心sql还是需要自己优化
- sql和java编码分开,功能边界清晰,一个专注业务、一个专注数据。
JDBC
- SQL夹在Java代码块里,耦合度高导致硬编码内伤
- 维护不易且实际开发需求中sql是有变化,频繁修改的情况多见
Hibernate和JPA
- 长难复杂SQL,对于Hibernate而言处理也不容易
- 内部自动生产的SQL,不容易做特殊优化。
- 基于全映射的全自动框架,大量字段的POJO进行部分映射时比较困难,导致数据库性能下降。
MyBatis使用
第一个MyBatis项目
- 基本步骤
- 创建项目
- 构建路径(build path),添加mybatis及mysql相关jar包
- 创建数据库及数据表
- 创建mybatis核心配置文件
- 创建对应的JavaBean和SQL映射文件
- 创建测试类
运行环境
- eclipse 2019 版
- Windows10系统
创建步骤
解压缩
再将压缩中DTD文件复制到桌面
通过压缩软件打开
打开eclipse
添加对应DTD文件
找到preferences->XML->XML Catalog ->add
location 写自己存放的dtd文件路径,key就写
http://mybatis.org/dtd/mybatis-3-config.dtd
点击OK
再add另一个DTD文件,location写存放文件路径。key写mybatis.org/dtd/mybatis-3-mapper.dtd
最后点击OK,再点击Apply and Close
创建Java项目
添加相关的jar包(相关jar包资源)
提取码:u5bm
设置JUnit
根据自己的JUnit版本来设置
自己创建过后,如图
Mybatis使用
//实体类
package lab_mybatis2.mybatis.bean;
public class Teacher {
private int id;
private String name;
private String email;
private String gender;
private int age;
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getEmail() {
return email;
}
public void setEmail(String email) {
this.email = email;
}
public String getGender() {
return gender;
}
public void setGender(String gender) {
this.gender = gender;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age=age;
}
@Override
public String toString() {
return "Teacher [id=" + id + ", name=" + name + ", email="
+ email + ", gender=" + gender +",age"+age+ "]";
}
}
//接口类
package lab_mybatis2.mybatis.dao;
import lab_mybatis2.mybatis.bean.Teacher;
public interface TeacherMapper {
public Teacher getTeacherById(int id);
public int addTeacher(Teacher newnoe);
public int updateTeacher(Teacher updatenoe );
public int deleteTeacherById(Integer id);
}
//测试类
package lab_mybatis2.mybatis.test;
import java.io.IOException;
import java.io.InputStream;
import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
import org.junit.Test;
import lab_mybatis2.mybatis.bean.Teacher;
import lab_mybatis2.mybatis.dao.TeacherMapper;
/**
* 1、SqlSession代表和数据库的一次会话;用完必须关闭;
* 2、SqlSession和connection一样她都是非线程安全。每次使用都应该去获取新的对象。
* 3、两个重要的配置文件:
* mybatis的全局配置文件:包含数据库连接池信息,事务管理器信息等...系统运行环境信息
* sql映射文件:保存了每一个sql语句的映射信息:
* 将sql抽取出来。
*
*/
public class MyBatisTest {
public SqlSessionFactory getSqlSessionFactory() throws IOException {
String resource = "mybatis-config.xml";
InputStream inputStream = Resources.getResourceAsStream(resource);
return new SqlSessionFactoryBuilder().build(inputStream);
}
/**
* 1、根据xml配置文件(全局配置文件)创建一个SqlSessionFactory对象 有数据源一些运行环境信息
* 2、sql映射文件;配置了每一个sql,以及sql的封装规则等。
* 3、将sql映射文件注册在全局配置文件中
* 4、写代码:
* 1)、根据全局配置文件得到SqlSessionFactory;
* 2)、使用sqlSession工厂,获取到sqlSession对象使用他来执行增删改查
* 一个sqlSession就是代表和数据库的一次会话,用完关闭
* 3)、使用sql的唯一标志来告诉MyBatis执行哪个sql。sql都是保存在sql映射文件中的。
*
* @throws IOException
*/
@Test
public void testselectTeacherById() throws IOException {
// 2、获取sqlSession实例,能直接执行已经映射的sql语句
// sql的唯一标识:statement Unique identifier matching the statement to use.
// 执行sql要用的参数:parameter A parameter object to pass to the statement.
SqlSessionFactory sqlSessionFactory = getSqlSessionFactory();
SqlSession openSession = sqlSessionFactory.openSession();
try {
TeacherMapper mapper = openSession.getMapper(TeacherMapper.class);
Teacher teacher = mapper.getTeacherById(1);
System.out.println(mapper.getClass());
System.out.println(teacher);
} finally {
openSession.close();
}
}
@Test
public void testAddTeacher() throws IOException{
SqlSessionFactory sqlSessionFactory=getSqlSessionFactory();
SqlSession openSession=sqlSessionFactory.openSession();
try {
TeacherMapper mapper=openSession.getMapper(TeacherMapper.class);
Teacher teacher=new Teacher();
teacher.setName("my");
teacher.setAge(22);
teacher.setGender("男");
teacher.setId(123);
teacher.setEmail("123@qq.com");
int rows=mapper.addTeacher(teacher);
openSession.commit();
System.out.println(rows);
}finally {
openSession.close();
}
}
@Test
public void testUpdateTeacher() throws IOException{
SqlSessionFactory sqlSessionFactory=getSqlSessionFactory();
SqlSession openSession=sqlSessionFactory.openSession();
try {
TeacherMapper mapper=openSession.getMapper(TeacherMapper.class);
Teacher teacher=new Teacher();
teacher.setName("mmm");
teacher.setAge(23);
teacher.setGender("女");
teacher.setId(123);
teacher.setEmail("234@qq.com");
int rows=mapper.updateTeacher(teacher);
System.out.println(rows);
}finally {
openSession.close();
}
}
@Test
public void testDeleteTeacher() throws IOException{
SqlSessionFactory sqlSessionFactory=getSqlSessionFactory();
SqlSession openSession=sqlSessionFactory.openSession();
try {
TeacherMapper mapper=openSession.getMapper(TeacherMapper.class);
int rows=mapper.deleteTeacherById(1);
openSession.commit();
System.out.println(rows);
}finally {
openSession.close();
}
}
}
配置文件
先创建文件file,命名为log4j.properties
log4j.properties
# Global logging configuration
log4j.rootLogger=DEBUG, stdout
# Console output...
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern=%5p [%t] - %m%n
创建xml文件
点击finish,完成创建
配置mybatis-config.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" />
<dataSource type="POOLED">
<property name="driver" value="com.mysql.jdbc.Driver" />
<property name="url" value="jdbc:mysql://localhost:3306/computer_dept" />
<property name="username" value="root" />
<property name="password" value="root" />
</dataSource>
</environment>
</environments>
<!-- 将我们写好的sql映射文件(EmployeeMapper.xml)一定要注册到全局配置文件(mybatis-config.xml)中 -->
<mappers>
<mapper resource="TeacherMapper.xml" />
</mappers>
</configuration>
再创建它的映射文件
同样选DTD file
配置TeacherMapper.xml文件
//根据自己所需要的数据库操作来写代码
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "mybatis.org/dtd/mybatis-3-mapper.dtd" "mybatis-3-mapper.dtd" >
<mapper namespace="lab_mybatis2.mybatis.dao.TeacherMapper">
<select id="getTeacherById" resultType="lab_mybatis2.mybatis.bean.Teacher">
select id,name,gender,age,email from teachers where id=#{id}
</select>
<insert id="addTeacher" parameterType="lab_mybatis2.mybatis.bean.Teacher">
insert into teachers (id,name,gender,age,email) values(#{id},#{name},#{gender},#{age},#{email})
</insert>
<update id="updateTeacher" parameterType="lab_mybatis2.mybatis.bean.Teacher">
update teachers set id=#{id},name=#{name},gender=#{gender},age=#{age},email=#{email} where id=#{id}
</update>
<delete id="deleteTeacherById" parameterType="Integer">
delete from teachers where id=#{id}
</delete>
</mapper>
最终效果
测试效果
数据库
测试中的问题
- 数据中没有数据,但是数据操纵语言并没有出错。那么就会出问题在没有及时更新到数据库中。
openSession.commit();//commit() 手动提交 数据库操作完成之后,要提交事务,数据库才会更新数据
openSession.commit(true); //自动提交
- Unknown column ‘name’ in 'field list’
这个是跟自己的数据库表中的字段名有关系,要保证代码写的字段名与数据库名一致
(记住字段名前面不要加空格,因为空格不好看出来)空格!!!
- Mybatis 报错 java.io.IOException: Could not find resource mybatis-config.xml
这个是自己在新建folder文件夹时,没有创建对。
修改一下:就OK了
- mybatis发现错误Error parsing SQL Mapper Configuration 和Unknown DataSource property
这个错误大部分是自己的代码写错了,要不就是单词写错了。
注意单词拼写!!!
标签:入门,框架,openSession,id,mybatis,sql,MyBatis,public 来源: https://blog.csdn.net/weixin_48469177/article/details/117488242