maven的依赖
下面代码部分给出了使用mybatis相关依赖、其中junit是默认依赖,主要需要的依赖有两个:就是mybatis本身的依赖和数据库的加载驱动。其他都只是辅助的,如果没有不太影响使用
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.11</version>
<scope>test</scope>
</dependency>
<!-- https://mvnrepository.com/artifact/org.mybatis/mybatis -->
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.5.5</version>
</dependency>
<!-- https://mvnrepository.com/artifact/mysql/mysql-connector-java -->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.21</version>
</dependency>
<!--日志包-->
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-log4j12</artifactId>
<version>1.7.25</version>
</dependency>
<dependency>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
<version>1.2.17</version>
</dependency>
配置mybatis核心配置文件
其实应该是叫什么都可以,不过个人喜欢叫mybatisConfig.xml
typeAliases :里面写的是别名,如果没有别名,则后续写包名的时候需要写完全部的包名
environments:里面配置jdbc链接的相关信息,比如数据库驱动,数据库用户名密码等
ps:
- 这里有一个注意点 mysql 8.x版本加载驱动的语句有所不同
从前的:com.mysql.jdbc.Driver 被废弃 需要使用新的加载驱动路径
com.mysql.cj.jdbc.Driver,如果使用低版本则不需要注意这个问题 - mysql的高版本在url这个参数上也有不同:
相比于低版本在地址之后只需要指定:数据库名、编码格式等参数
较高版本则还需要指定是否使用SSL链接方式,以及指定时区等
这里有一个小坑需要注意,&符号可能需要用它的转义&;不然可能回合后续的字母组成转义而出错
<?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">
<!--dtd是对xml配置标签与属性的约束-->
<configuration>
<typeAliases>
<!-- <typeAlias type="com.wzx.bean.User" alias="user"></typeAlias> -->
<package name="cn.yw.bean"/>
</typeAliases>
<!-- environments环境 开发环境,生产环境-->
<environments default="development">
<environment id="development">
<!-- 使用jdbc的事务管理 -->
<transactionManager type="JDBC"/>
<!-- dataSource Mybatis自带数据源连接池-->
<dataSource type="POOLED">
<!-- 四大信息 -->
<property name="driver" value="com.mysql.cj.jdbc.Driver"/>
<property name="url" value="jdbc:mysql://localhost:3306/test?serverTimezone=UTC&useSSL=false"/>
<property name="username" value="root"/>
<property name="password" value="123456"/>
</dataSource>
</environment>
</environments>
<!-- 配置多个映射文件-->
<mappers>
<mapper resource="UserMapper.xml"/>
<mapper resource="UserDao.xml"></mapper>
</mappers>
</configuration>
至于mappers里面是什么东西呢?
稍后会有所介绍,可以不编写这一部分内容。
在这之后要做的就是建立数据库,建一个表设定相应字段然后写一个bean类和一个dao接口(不需要实现)
这里有一个注意点就是bean类最好和数据中表的相应字段是对应的,因为mybatis在自动封装sql语句执行的返回结果时会对应查询到的结果的字段和bean类的参数名进行赋值等操作,如果你很任性,实在想让两者名称不一致也可以在之后的查询语句中对查询到的字段使用别名(mybatis自动封装其实看的是你sql语句查询的返回结果的字段进行封装)
然后现在,你有了一个bean类,一个dao的接口,一个mybatis核心配置文件。
那么这时应该编写SQL语句了以及相关的工具类了,有一定编写经验的人可能都对这个步骤很熟悉
无非就是 通过反射加载数据库驱动然后获取DriverManager类,之后获取链接得到Connection类的对象,然后通过Connection获得一个preparedStatement类,传入SQL语句,SQL语句中占位符“?”里的参数然后就是执行相应的方法获得一个值或者resultset
除了sql语句基本大同小异 ,于是mybatis就对这个重复的过程进行了封装,然后,使用者只需要编写SQL语句就行了,至于具体怎么做呢?
此时我们需要一个bean的mapper的xml文件用于存储我们编写的sql语句
<?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="cn.yw.bean.User">
<select id="findUserById" resultType="cn.yw.bean.User">
SELECT * FROM user WHERE uid = #{uid}
</select>
</mapper>
大概就是这样的我把这个文件命名为UserMapper.xml
namespace:这个命名空间不一定需要对应包名,只是为了防止语句多了以后防止重复。
select标签:这里面就是写SQL语句的地方了,然后mybatis通过命名空间+id找到这个语句进行执行
resultType:指定了执行SQL语句返回的结果需要封装成的类,需要写出类的全类名
#{id}:这个东西相当于我们熟悉的?占位符
之后我们编写一个测试方法,试着执行这个sql语句
@org.junit.Test
public void test01() throws IOException {
String resource = "mybatisConfig.xml";
InputStream inputStream = Resources.getResourceAsStream(resource);
SqlSessionFactory sessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
SqlSession session =sessionFactory.openSession();
try{
User user=session.selectOne("cn.yw.bean.User.findUserById",1);
System.out.println(user);
}finally {
session.close();
}
}
这段语句主要做的就是使用
Resources.getResourceAsStream(“mybatis核心配置文件名”)
加载里面的信息,但是此时,mybatis它还找不到我们之前写的sql语句
这就要用到我们之前提到的
核心配置文件里面的Mappers标签了
<mappers>
<mapper resource="UserMapper.xml"/>
<mapper resource="UserDao.xml"></mapper>
</mappers>
resource属性里指定的是sql语句存放的xml的从根目录开始的完整路径
我这里直接放在了根目录下,所以直接写的是文件名
然后 我们就将相关信息转化为了一个流对象,此时我们需要一个SqlSessionFactory对象,它是由SqlSessionFactoryBuilder得来的
于是我们new 一个Builder对象利用它的build()方法传入之前的 resource流
就能得到一个SqlSessionFactory对象,通过它的:openSession()我们获得一个SqlSession对象行相应方法,selectOne()方法,第一个参数是,命名空间+id
第二个则是之前提到的#{id},使用名为User的bean类接收
然后这个测试方法就算结束了,之后会执行finally里的close方法关闭SqlSession释放资源
至此SELECT的使用方法算是初步掌握,小试牛刀
然后我们换一种方式,编写一个测试方法,执行INSERT操作
因为之前的操作还没有用上我们编写的dao类,所以我们在这个测试方法里面把它也用上
@org.junit.Test
public void test02() throws IOException {
String resource ="mybatisConfig.xml";
InputStream inputStream = Resources.getResourceAsStream(resource);
SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(inputStream);
SqlSession session = factory.openSession();
UserDao userDao = session.getMapper(UserDao.class);
User u = new User();
u.setName("aaa");
u.setAddress("xxxx");
u.setUid(2);
u.setBirthday(new Date());
System.out.println(userDao.insertUser(u));
session.commit();
session.close();
}
这个方法中我们需要一个新的xml,要求与dao类同名,里面的sql语句的id也需要与我们的dao类里面的方法一一对应,我们新建一个UserDao.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="cn.yw.dao.UserDao">
<insert id="insertUser" parameterType="user">
INSERT INTO user(uid,name,address,sex,birthday) VALUE (#{uid},#{name},#{address},#{sex},#{birthday})
</insert>
</mapper>
命名空间和dao类的全类名相对应
package cn.yw.dao;
import cn.yw.bean.User;
public interface UserDao {
public User getUserById(int uid);
public int insertUser(User user);
}
xml中的parameterType 和方法的参数相对应,然后mybatis就根据User的属性值对value里的占位符进行赋值
session.getMapper();方法的参数是dao接口的class对象 然后mybatis会根据dao类中未实现的方法和同名xml文件里的id一一对应,实现相应方法,
此时我们执行
userDao.insertUser(User)方法它就能自动执行相关sql语句的操作往数据库中插入一个user对象