2.1使用MyBatis
我们在使用和学习MyBatis时最好去下载官方的文件,里面包含了所需要的依赖和官方文档https://github.com/mybatis/mybatis-3/releases
我在这里放出官方的中文网站,里面都是关于MyBatis的使用介绍:https://mybatis.org/mybatis-3/zh/getting-started.html
2.1.1具体步骤:
- 在数据库建好目标表
- 在idea(pom文件)加入maven的mybatis坐标,mysql驱动坐标
<!--mybatis依赖--> <dependency> <groupId>org.mybatis</groupId> <artifactId>mybatis</artifactId> <version>3.5.1</version> </dependency> <!--mysql依赖--> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <version>5.1.9</version> </dependency>
-
创建实体类(保存表中一行数据)
public class Student {//推荐和表名一致,方便记忆 //定义属性,和列名一致 private Integer id; private String name; private String email; private int 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 String getEmail() { return email; } public void setEmail(String email) { this.email = email; } public int getAge() { return age; } public void setAge(int age) { this.age = age; } @Override public String toString() { return "student{" + "id=" + id + ", name='" + name + '\'' + ", email='" + email + '\'' + ", age=" + age + '}'; } }
-
创建持久层的dao接口,定义操作数据库的方法
import java.util.List; //接口,操作student表 public interface StudentDao { public List<Student> selectStudents();//查询student表的所有数据 }
-
创建mybatis使用的配置文件(sql映射文件,是个xml文件)
用于写sql语句,一般一个表一个sql映射文件;文件名和目标接口同名且位于同一个目录下
id
:是该sql语句的唯一表示,mybatis会根据这个id来找到对应的sql语句可自定义,但最好是和接口中的方法保持一致
resultType
:表示结果类型,是sql语句执行后得到的ResultSet,遍历这个ResultSet得到的java对象类型
操作标签:要什么操作,就把对应的sql语句放到下面对应的标签中要填类型的全限定名称<select>
<update>
<insert>
<delete>
<mapper>
:根标签<?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="com.mybatis.dao.StudentDao"> <select id="selectStudents" resultType="com.mybatis.domain.Student"> select id,name,email,age from student order by id </select> </mapper>
我们要确保src/main/resources下的主配置文件在target/classes/com下也有,所以我们在pom中加入以下代码,这样主配置文件在编译时就会被copy到target目录下了
<build> <resources> <resource> <directory>src/main/java</directory><!--所在目录--> <includes><!--包括目录下的.properties,.xml文件都会被扫描到--> <include>**/*.properties</include> <include>**/*.xml</include> </includes> <filtering>false</filtering> </resource> </resources> </build>
然后在idea右侧的maven/项目名/Lifecycle点击compile,这样项目会进行编译,编译完后我们就可以看到多出个target文件
-
创建mybatis的主配置文件(放在resource目录下,名称自定义)
提供了数据库的连接信息和sql映射文件的位置信息,一个项目一个主配置文件各个标签的功能和用法在下面都有说明
<?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> <!--环境配置: 数据库连接信息 default:必须和下面其中的环境id一致,以用于选择目标数据库 --> <environments default="myenv"> <!--environment:一个数据库信息的配置,环境 id:唯一值,自定义,表示环境名称 --> <environment id="myenv"> <!--transactionManager:mybatis事务类型 type:JDBC(表示使用JDBC的Connection对象的commit,rollback做事务处理) --> <transactionManager type="JDBC"/> <!--dataSource:数据源,用于连接数据库 type:数据源类型,POOLED:连接池 --> <dataSource type="POOLED"> <property name="driver" value="com.mysql.jdbc.Driver"/> <property name="url" value="jdbc:mysql://localhost:3306/ssm"/> <property name="username" value="root"/> <property name="password" value="root"/> </dataSource> </environment> </environments> <!--sql mapper(sql映射文件)位置--> <mappers> <!--单个mapper,从类路径目录开始,target/class(类路径)--> <mapper resource="com/mybatis/dao/StudentDao.xml"/> </mappers> </configuration>
-
创建使用mybatis类
通过mybatis访问数据库注意getResourceAsStream()要选择InputStream类的
public class MyApp { public static void main(String[] args) throws IOException { //访问mybatis获取student数据 //1.定义mybatis主配置文件的名称,从类路径的根开始(target/class) String con="mybatis.xml"; //2.读取上面的con文件 InputStream in = Resources.getResourceAsStream(con); //3.创建SqlSessionFactoryBuilder对象 SqlSessionFactoryBuilder builder=new SqlSessionFactoryBuilder(); //4.创建SqlSessionFactory对象 SqlSessionFactory factory = builder.build(in); //5.从SqlSessionFactory中获取和创建SqlSession对象 SqlSession sqlSession = factory.openSession(); //6.执行目标sql语句标识;sql映射文件中的namespace + "." + 标签id String sqlId="com.mybatis.dao.StudentDao"+"."+"selectStudents"; //7.执行sql语句,通过sqlId找到语句 List<Student> studentList = sqlSession.selectList(sqlId); //8.输出结果 for (Student student : studentList){ System.out.println(student); } //9.关闭SqlSession对象 sqlSession.close(); } }
进行insert操作的代码:
public class Test01 { @Test public void t1() throws IOException { //访问mybatis获取student数据 //1.定义mybatis主配置文件的名称,从类路径的根开始(target/class) String con="mybatis.xml"; //2.读取上面的con文件 InputStream in = Resources.getResourceAsStream(con); //3.创建SqlSessionFactoryBuilder对象 SqlSessionFactoryBuilder builder=new SqlSessionFactoryBuilder(); //4.创建SqlSessionFactory对象 SqlSessionFactory factory = builder.build(in); //5.从SqlSessionFactory中获取和创建SqlSession对象 SqlSession sqlSession = factory.openSession(); //6.执行目标sql语句标识;sql映射文件中的namespace + "." + 标签id String sqlId="com.mybatis.dao.StudentDao.insertStudent"; //7.执行sql语句,通过sqlId找到语句 Student student=new Student(); student.setId(1006); student.setName("中文"); student.setEmail("66@tt.com"); student.setAge(6); int nums = sqlSession.insert(sqlId, student); //MyBatis默认不提供事务提交,当我们进行insert、update和delete操作后要手动提交事务 sqlSession.commit(); //8.输出结果 System.out.println("插入所影响的行数="+nums); //9.关闭SqlSession对象 sqlSession.close(); } }
2.1.2连接MyBatis类介绍
-
Resources
:负责读取主配置文件 -
SqlSessionFactoryBuilder
:创建SqlSessionFactory对象 -
SqlSessionFactory
:重量级对象,该对象的创建耗时耗资源较多,一个项目中有一个就够了
SqlSessionFactory
是一个接口,实现类为DefaultSqlSessionFactory
作用是获取SqlSession
对象
openSession()
:参数默认是false
,获取的是非自动提交事务的SqlSession
对象; -
SqlSession
:定义了操作数据的方法 例如selectOne()
、selectList()
、insert()
、update()
、delete()
、commit()
、rollback()
使用要求:SqlSession
对象不是线程安全的,需要在方法内部使用
在执行sql语句之前,使用openSession()
获取SqlSession
对象
在执行完sql语句后,需要关闭它,执行SqlSession.close()
这样能保证他的使用是线程安全的
注:如果我们插入数据后,发现数据库显示的新的数据的中文都是问号的话,一个要检查idea本身的编码是否都是utf-8,一个检查数据库的创建是否是utf-8
如果以上都没问题,我们可以在主配置文件中的<property name="url" value="jdbc:mysql://localhost:3306/ssm"/>
后加入?useUnicode=true&characterEncoding=UTF-8