赞
踩
Mybatis用于简化Java当中对于JDBC的操作,它将连接数据库,执行SQL命令自动化实现
<dependencies> <!-- Mybatis核心 --> <dependency> <groupId>org.mybatis</groupId> <artifactId>mybatis</artifactId> <version>3.5.7</version> </dependency> <!-- junit测试 --> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>4.12</version> <scope>test</scope> </dependency> <!-- MySQL驱动 --> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <version>5.1.3</version> </dependency> </dependencies>
根据需要可以更改版本之类的东西
习惯上命名为mybatis-config.xml 存放的位置在src/main/resources目录下
<?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.cj.jdbc.Driver"/> <property name="url" value="jdbc:mysql://localhost:3306/MyBatis"/> <property name="username" value="root"/> <property name="password" value="123456"/> </dataSource> </environment> </environments> <!--引入映射文件--> <mappers> <mapper resource="mappers/UserMapper.xml"/> </mappers> </configuration>
有几个标签,其中environments是用于配置数据库的环境,这块的type是JDBC,所有的事务是手动提交的。
mappers是用于引入映射文件。
Mybatis当中存在面向接口编程
使用JDBC的时候需要将MySQL中的数据转换为Java数据,是使用了反射,所以需要一个实体类对象对应着MySQL当中的表,创建一个User类
创建一个Mapper接口,Mybatis中的Mapper接口相当于以前的dao,
public interface UserMapper{
int insertUser();
}
类似与上面的接口。
ORM (Object Relationship Mapping) 对象关系映射
映射文件的命名规则:
<?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.atguigu.mybatis.mapper.UserMapper">
<!--int insertUser();-->
<insert id="insertUser">
insert into t_user values(null,'张三','123',23,'女')
</insert>
</mapper>
例如上面的,因为我实现了一个insert方法,所以这里的标签就是 然后后面的id是SQL语句的唯一标识,指向你要实现的接口方法。。
MyBatis面向接口编程的两个一致:
public class UserMapperTest { @Test public void testInsertUser() throws IOException { //读取MyBatis的核心配置文件 InputStream is = Resources.getResourceAsStream("mybatis-config.xml"); //获取SqlSessionFactoryBuilder对象 SqlSessionFactoryBuilder sqlSessionFactoryBuilder = new SqlSessionFactoryBuilder(); //通过核心配置文件所对应的字节输入流创建工厂类SqlSessionFactory,生产SqlSession对象 SqlSessionFactory sqlSessionFactory = sqlSessionFactoryBuilder.build(is); //获取sqlSession,此时通过SqlSession对象所操作的sql都必须手动提交或回滚事务 //SqlSession sqlSession = sqlSessionFactory.openSession(); //创建SqlSession对象,此时通过SqlSession对象所操作的sql都会自动提交 SqlSession sqlSession = sqlSessionFactory.openSession(true); //通过代理模式创建UserMapper接口的代理实现类对象 UserMapper userMapper = sqlSession.getMapper(UserMapper.class); //调用UserMapper接口中的方法,就可以根据UserMapper的全类名匹配元素文件,通过调用的方法名匹配映射文件中的SQL标签,并执行标签中的SQL语句 int result = userMapper.insertUser(); //提交事务 //sqlSession.commit(); System.out.println("result:" + result); } }
MyBatis提供了一个操作数据库的对象叫SqlSession,所以我们要获取SqlSession。
Sqlsession代表java程序与数据库的会话
一个接口要想实现实例对象,得要有一个实例类,但是Mapper只有接口没有实例类,有一个方法为SqlSession.getMapper(Class)
传入一个T.class的时候会返回一个T的实例对象,这步代码使用的是代理模式
最后直接指向Sql语句即可。
但是要注意的是因为是要手动提交事务,所以得写一个commit方法,才能在数据库当中看到变化。
因为是手动的commit,为了不那么麻烦我们可以在创建usermapper对象的时候将自动提交打开
SqlSession sqlSession = sqlSessionFactory.openSession(true);
这样就不用写commit,也可以提交
添加log4j依赖
<!-- log4j日志 -->
<dependency>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
<version>1.2.17</version>
</dependency>
加入配置文件
<?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE log4j:configuration SYSTEM "log4j.dtd"> <log4j:configuration xmlns:log4j="http://jakarta.apache.org/log4j/"> <appender name="STDOUT" class="org.apache.log4j.ConsoleAppender"> <param name="Encoding" value="UTF-8" /> <layout class="org.apache.log4j.PatternLayout"> <param name="ConversionPattern" value="%-5p %d{MM-dd HH:mm:ss,SSS} %m (%F:%L) \n" /> </layout> </appender> <logger name="java.sql"> <level value="debug" /> </logger> <logger name="org.apache.ibatis"> <level value="info" /> </logger> <root> <level value="debug" /> <appender-ref ref="STDOUT" /> </root> </log4j:configuration>
其中配置文件当中的level value代表日志输出的级别
其中的优先度为FATAL(致命)>ERROR(错误)>WARN(警告)>INFO(信息)>DEBUG(调试) 从左到右打印的内容越来越详细。
<?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文件,此时就可以${属性名}的方式访问属性值--> <properties resource="jdbc.properties"></properties> <settings> <!--将表中字段的下划线自动转换为驼峰--> <setting name="mapUnderscoreToCamelCase" value="true"/> <!--开启延迟加载--> <setting name="lazyLoadingEnabled" value="true"/> </settings> <typeAliases> <!-- typeAlias:设置某个具体的类型的别名 属性: type:需要设置别名的类型的全类名 alias:设置此类型的别名,且别名不区分大小写。若不设置此属性,该类型拥有默认的别名,即类名 --> <!--<typeAlias type="com.atguigu.mybatis.bean.User"></typeAlias>--> <!--<typeAlias type="com.atguigu.mybatis.bean.User" alias="user"> </typeAlias>--> <!--以包为单位,设置改包下所有的类型都拥有默认的别名,即类名且不区分大小写--> <package name="com.atguigu.mybatis.bean"/> </typeAliases> <!-- environments:设置多个连接数据库的环境 属性: default:设置默认使用的环境的id --> <environments default="mysql_test"> <!-- environment:设置具体的连接数据库的环境信息 属性: id:设置环境的唯一标识,可通过environments标签中的default设置某一个环境的id,表示默认使用的环境 --> <environment id="mysql_test"> <!-- transactionManager:设置事务管理方式 属性: type:设置事务管理方式,type="JDBC|MANAGED" type="JDBC":设置当前环境的事务管理都必须手动处理 type="MANAGED":设置事务被管理,例如spring中的AOP --> <transactionManager type="JDBC"/> <!-- dataSource:设置数据源 属性: type:设置数据源的类型,type="POOLED|UNPOOLED|JNDI" type="POOLED":使用数据库连接池,即会将创建的连接进行缓存,下次使用可以从缓存中直接获取,不需要重新创建 type="UNPOOLED":不使用数据库连接池,即每次使用连接都需要重新创建 type="JNDI":调用上下文中的数据源 --> <dataSource type="POOLED"> <!--设置驱动类的全类名--> <property name="driver" value="${jdbc.driver}"/> <!--设置连接数据库的连接地址--> <property name="url" value="${jdbc.url}"/> <!--设置连接数据库的用户名--> <property name="username" value="${jdbc.username}"/> <!--设置连接数据库的密码--> <property name="password" value="${jdbc.password}"/> </dataSource> </environment> </environments> <!--引入映射文件--> <mappers> <!-- <mapper resource="UserMapper.xml"/> --> <!-- 以包为单位,将包下所有的映射文件引入核心配置文件 注意: 1. 此方式必须保证mapper接口和mapper映射文件必须在相同的包下 2. mapper接口要和mapper映射文件的名字一致 --> <package name="com.atguigu.mybatis.mapper"/> </mappers> </configuration>
其中往里面加标签的时候,必须严格遵守(有的标签可以不写,但顺序一定不能乱):properties、settings、typeAliases、typeHandlers、objectFactory、objectWrapperFactory、reflectorFactory、plugins、environments、databaseIdProvider、mapper。
创建包的时候使用\\来写,因为包是标签存在的,在这个地方要是使用.来创建包,会显示一个文件名称为XXX.XXX.XXX,不能体现到标签的用处,这是要注意的。
其中Mybatis的增删改都是返回一个整数,为被影响的行数,这和上文的insert插入操作大同小异,这里不做过多赘述。
下面主要要看查的操作:
<!--User getUserById();-->
<select id="getUserById" resultType="com.atguigu.mybatis.bean.User">
select * from t_user where id = 2
</select>
<!--List<User> getUserList();-->
<select id="getUserList" resultType="com.atguigu.mybatis.bean.User">
select * from t_user
</select>
其中第一个是查一个实体类,第二个是查集合
查询标签当中多了一个叫做resulType的东西,这是因为在MySQL查找到东西返回类型的时候,需要去指定类型返回,resultType是自动映射,属于属性名称和字段名称一致的情况。会直接生成User类对象返回。
还有一种情况是不对应的,这个时候就需要另外一种叫做自定义映射resultMap,用于一对多,或者多对一的情况。
注意:当查询的数据为多条时,不能使用实体类作为返回值,只能使用集合,否则会抛出异常TooManyResultsException;但是若查询的数据只有一条,可以使用实体类或集合作为返回值。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。