Mybatis的学习
简介:
MyBatis是一款优秀的持久层框架,相比Hibernate而言,更适合做需求不明确,需求经常变化的互联网项目,因为Mybatis能更好的定制化 SQL、存储过程以及高级映射。MyBatis 避免了几乎所有的 JDBC 代码和手动设置参数以及获取结果集。MyBatis 可以使用简单的 XML 或注解来配置和映射原生信息,将接口和 Java 的 POJOs(Plain Old Java Objects,普通的 Java对象)映射成数据库中的记录。
官方学习文档:http://www.mybatis.org/mybatis-3/zh/configuration.html
工程完成后的全部目录:
1.新建工程
创建完的项目目录
2.在pom.xml引入Mybatis所需要的架包
//这段代码加在<dependencies></dependencies>这个标签里面
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.11</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.4.1</version>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>6.0.6</version>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
</dependency>
<dependency>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
<version>1.2.17</version>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-log4j12</artifactId>
<version>1.7.25</version>
</dependency>
3.新建数据库名字叫mybatisstu,里面新建user表
4.资源文件的配置
4.1在main文件夹下新建resource类型的文件config的配置文件
注意这个文件类型一定要设置为resource类型不要后面运行程序会报:
java.io.IOException: Could not find resource mybatis-config.xml
4.2在config里面新建这几个文件:
mybatis-config.xml是我们的配置文件,
log4.properties是我们的日志文件,没有他,我们将看不到,每次运行都干了什么,比如sql语句的打印
config.properties是我们的数据库信息
User.xml是我们的映射文件
4.3配置config.properties文件:
jdbc.databaseurl=jdbc:mysql://127.0.0.1:3306/mybatisstu?characterEncoding=UTF-8&serverTimezone=GMT%2b8
jdbc.driver=com.mysql.cj.jdbc.Driver
jdbc.username=root
jdbc.password=root
jdbc.maxActive=100
jdbc.maxWait=5000
jdbc.filters=wall,stat
4.4配置log4.properties
#在开发环境下日志级别设置成DEGUG,生成环境配置成info 或者error
log4j.rootLogger=debug, stdout, R
#
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern=%5p - %m%n
log4j.appender.R=org.apache.log4j.RollingFileAppender
log4j.appender.R.File=firestorm.log
log4j.appender.R.MaxFileSize=100KB
log4j.appender.R.MaxBackupIndex=1
log4j.appender.R.layout=org.apache.log4j.PatternLayout
log4j.appender.R.layout.ConversionPattern=%p %t %c - %m%n
log4j.logger.com.codefutures=DEBUG
4.3和4.4这两个文件都是不变的,以后都可以照写,除了更改4.3中数据库的名字
4.5非常重要的mybatis-config.xml的配置
xml文件属性介绍:
properties
这些属性都是可外部配置且可动态替换的,既可以在典型的java属性文件中配置,亦可通过 properties 元素的子元素来传递, 例如:我外部有个文件config.properties,现在通过properties将这个文件引入xml配置文件里
现在获取这些值:用${这里添配置文件里得参数名}
<environments default="development">
<environment id="development">
<transactionManager type="JDBC"/>
<dataSource type="POOLED">
<property name="driver" value="${jdbc.driver}"/>
<property name="url" value="${jdbc.databaseurl}"/>
<property name="username" value="${jdbc.username}"/>
<property name="password" value="${jdbc.password}"/>
</dataSource>
</environment>
</environments>
settings
这是 MyBatis 中极为重要的调整设置,它们会改变 MyBatis 的运行时行为。下表描述了设置中各项的意图、默认值等。
typeAliases
类型别名是为java类型设置一个短的名字。他只和xml有关,存在的意义仅在于用来减少类完全限定名的冗余
例如:
<typeAliases>
<typeAlias alias="Author" type="domain.blog.Author"/>
<typeAlias alias="Blog" type="domain.blog.Blog"/>
<typeAlias alias="Comment" type="domain.blog.Comment"/>
<typeAlias alias="Post" type="domain.blog.Post"/>
<typeAlias alias="Section" type="domain.blog.Section"/>
<typeAlias alias="Tag" type="domain.blog.Tag"/>
</typeAliases>
然后就还可以通过别名来代替使用较长的路径名.
映射器(mappers)
既然 MyBatis 的行为已经由上述元素配置完了,我们现在就要定义 SQL 映射语句了。但是首先我们需要告诉 MyBatis 到哪里去找到这些语句。 Java 在自动查找这方面没有提供一个很好的方法,所以最佳的方式是告诉 MyBatis 到哪里去找映射文件。你可以使用相对于类路径的资源引用, 或完全限定资源定位符(包括 file:/// 的 URL),或类名和包名等。例如:
<!-- 使用相对于类路径的资源引用 -->
<mappers>
<mapper resource="org/mybatis/builder/AuthorMapper.xml"/>
<mapper resource="org/mybatis/builder/BlogMapper.xml"/>
<mapper resource="org/mybatis/builder/PostMapper.xml"/>
</mappers>
完整的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>
<!--这个很重要,用来连接刚才存放数据库信息的文件,有了这个连接,我们才能拿到那个文件里面的信息-->
<properties resource="config.properties"/>
<!--这个配置也很重要,我们可以给我们类起一个别名,这样子当我们需要引用User这个类的时候,就不需要写全部路径,直接用他的别名User就可以了-->
<typeAliases>
<typeAlias type="zjc.model.User" alias="User"/>
</typeAliases>
<environments default="development">
<environment id="development">
<transactionManager type="JDBC"/>
<dataSource type="POOLED">
<property name="driver" value="${jdbc.driver}"/>
<property name="url" value="${jdbc.databaseurl}"/>
<property name="username" value="${jdbc.username}"/>
<property name="password" value="${jdbc.password}"/>
</dataSource>
</environment>
</environments>
<!--加载映射文件-->
<mappers>
<mapper resource="sqlmap/User.xml"/>
</mappers>
</configuration>
4.6配置User.xml映射文件
注意:
mapper的namespace属性的作用:namespace命名空间,作用是对sql进行分类化管理,理解sql隔离 注意:使用mapper代理方法 开发,namespace有特殊重要的作用
id标识映射文件中的sql,
标识为statement的id 将sql语句分装到mappedStatement的对象中
#{}标识一个占位符
parameterType指定输入参数的类型
resultType指定sql输出结果所映射的单条java对象类型
只能是单条 #{id}:中的id标识接受输入的参数,参数的名称是id
<?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命名空间,作用是对sql进行分类化管理,理解sql隔离
注意:使用mapper代理方法开发,namespace有特殊重要的作用
-->
<mapper namespace="zjc">
<!--在映射文件里面配置sql语句-->
<!--
id标识映射文件中的sql,标识为statement的id
将sql语句分装到mappedStatement的对象中
#{}标识一个占位符
parameterType指定输入参数的类型
resultType指定sql输出结果所映射的单条java对象类型 只能是单条
#{id}:中的id标识接受输入的参数,参数的名称是id
-->
<select id="findUserById" parameterType="Integer" resultType="User">
select * from user where id = #{id}
</select>
<!--模糊查询-->
<select id="findUserByName" parameterType="String" resultType="User">
select * from user where username like '%${value}%'
</select>
<!--添加用户-->
<insert id="insertUser" parameterType="User">
<selectKey keyProperty="id" order="AFTER" resultType="int">
select last_insert_id()
</selectKey>
insert into user(id,username,birthday,sex,address) value (#{id},#{username},#{birthday},#{sex},#{address})
</insert>
<!--删除用户-->
<delete id="deletUser" parameterType="Integer">
delete from user where id = #{id}
</delete>
<!--更新用户-->
<update id="updateUser" parameterType="User">
update user set username = #{username},birthday = #{birthday},sex=#{sex},address = #{address} where id = #{id}
</update>
</mapper>
5.配置文件配完了,现在开始测试
注意:获取映射文件里面某条sql语句的时候是通过namespace+id来得到的。
新建一个MybatisFirst类
//测试通过id查找用户
@Test
public void findUserById() throws IOException {
//mybatis配置文件
String respurce = "mybatis-config.xml";
//得到配置文件流
InputStream inputStream = Resources.getResourceAsStream(respurce);
//创建会话工厂,传入mybatis的配置文件
//创建会话工程,传入mybatis的配置文件信息
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
//通过工厂得到SqlSession
SqlSession sqlSession = sqlSessionFactory.openSession();
//以上代码是不用变得
//通过SqlSession操作数据库
//第一个参数是:namespace+"."+id
User user = sqlSession.selectOne("zjc.findUserById",1);
System.out.println(user.getSex());
sqlSession.close();
}
//模糊查询
@Test
public void findUserByName(){
//mybatis配置文件
String respurce = "mybatis-config.xml";
//得到配置文件流
InputStream inputStream = null;
try {
inputStream = Resources.getResourceAsStream(respurce);
} catch (IOException e) {
e.printStackTrace();
}
//创建会话工厂,传入mybatis的配置文件
//创建会话工程,传入mybatis的配置文件信息
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
//通过工厂得到SqlSession
SqlSession sqlSession = sqlSessionFactory.openSession();
//通过SqlSession操作数据库
//第一个参数是:namespace+"."+id
List<User> list = sqlSession.selectList("zjc.findUserByName","余");
System.out.println(list);
sqlSession.close();
}
//插入数据
@Test
public void insertUser(){
//mybatis配置文件
String respurce = "mybatis-config.xml";
//得到配置文件流
InputStream inputStream = null;
try {
inputStream = Resources.getResourceAsStream(respurce);
} catch (IOException e) {
e.printStackTrace();
}
//创建会话工厂,传入mybatis的配置文件
//创建会话工程,传入mybatis的配置文件信息
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
//通过工厂得到SqlSession
SqlSession sqlSession = sqlSessionFactory.openSession();
//通过SqlSession操作数据库
//第一个参数是:namespace+"."+id
User user = new User();
user.setUsername("孙好");
user.setBirthday(new Date());
user.setSex("1");
user.setAddress("杭州");
sqlSession.insert("zjc.insertUser",user);
//提交事务
sqlSession.commit();
System.out.println(user.getId());
sqlSession.close();
}
//删除用户
@Test
public void deleteUser(){
//mybatis配置文件
String respurce = "mybatis-config.xml";
//得到配置文件流
InputStream inputStream = null;
try {
inputStream = Resources.getResourceAsStream(respurce);
} catch (IOException e) {
e.printStackTrace();
}
//创建会话工厂,传入mybatis的配置文件
//创建会话工程,传入mybatis的配置文件信息
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
//通过工厂得到SqlSession
SqlSession sqlSession = sqlSessionFactory.openSession();
//通过SqlSession操作数据库
//第一个参数是:namespace+"."+id
sqlSession.delete("zjc.deletUser",6);
sqlSession.commit();
sqlSession.close();
}
//更新用户
@Test
public void updateUser(){
//mybatis配置文件
String respurce = "mybatis-config.xml";
//得到配置文件流
InputStream inputStream = null;
try {
inputStream = Resources.getResourceAsStream(respurce);
} catch (IOException e) {
e.printStackTrace();
}
//创建会话工厂,传入mybatis的配置文件
//创建会话工程,传入mybatis的配置文件信息
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
//通过工厂得到SqlSession
SqlSession sqlSession = sqlSessionFactory.openSession();
//通过SqlSession操作数据库
//第一个参数是:namespace+"."+id
User user = new User();
user.setId(3);//更新的时候必须设置id
user.setUsername("孙好");
user.setBirthday(new Date());
user.setSex("1");
user.setAddress("杭州");
sqlSession.update("zjc.updateUser",user);
sqlSession.commit();
sqlSession.close();
}
全部代码:
链接:
https://github.com/1169927533/SSM_Study
https://pan.baidu.com/s/1zn13pwDcqV4RcWxpo_UIqQ
提取码:cql0