Mybatis简介
MyBatis 本是apache的一个开源项目iBatis, 2010年这个项目由apache software foundation 迁移到了google code,并且改名为MyBatis 。2013年11月迁移到Github。
MyBatis 是一款优秀的持久层框架,它支持定制化 SQL、存储过程以及高级映射。MyBatis 避免了几乎所有的 JDBC 代码和手动设置参数以及获取结果集。MyBatis 可以使用简单的 XML 或注解来配置和映射原生信息,将接口和 Java 的 POJOs(Plain Ordinary Java Object,普通的 Java对象)映射成数据库中的记录。
Mybatis编程
mybatis的mapper编程
1.新建项目
2.导包
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>3.8.1</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.4.6</version>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.38</version>
</dependency>
<dependency>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
<version>1.2.17</version>
</dependency>
</dependencies>
3.新建log4j.properties文件,用于打印日志
写入:
# Global logging configuration
log4j.rootLogger=DEBUG, stdout
# MyBatis logging configuration...
log4j.logger.org.mybatis.example.BlogMapper=TRACE
# 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
4.新建实体类Users,与数据库中的表相对应
5.新建UserMapper.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="com.mybatis.UserMapper">
<!-- namespace 里可以随意起名 但要与测试类中 openSession.selectOne("com.mybatis.UserMapper.selectEmp", 1) 里的名字一样 -->
<!-- namespace:名称空间 id:唯一标识 resultType:返回值类型 #{id}:从传递过来的参数中取到id值-->
<select id="selectEmp" resultType="com.mybatis.Users"><!--所传进来的id值由selectEmp中获取,返回值类型为Users类-->
select * from users where id = #{id}
</select>
</mapper>
6.新建全局配置文件SqlMapConfig.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/test"/>
<property name="username" value="root"/>
<property name="password" value="123456"/>
</dataSource>
</environment>
</environments>
<mappers>
<mapper resource="UserMapper.xml"/>
</mappers>
</configuration>
7.新建测试类测试
写入:
package com.mybatis;
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;
public class mybatisTest {
/**
* 1.根据xml配置文件创建一个SqlSessionFactory对象
* @throws IOException
*/
@Test
public void test() throws IOException {
//加载核心配置文件
String resource = "SqlMapConfig.xml";
InputStream inputStream = Resources.getResourceAsStream(resource);
//创建SqlSessionFactory
SqlSessionFactory sqlSessionFactory =new SqlSessionFactoryBuilder().build(inputStream);
//2.获取sqlSession实例,能直接执行已经映射的sql语句
SqlSession openSession=sqlSessionFactory.openSession();
try {
Users users=openSession.selectOne("com.mybatis.UserMapper.selectEmp", 1); //将id值设置为1,用selectEmp传给SqlMapConfig.xml
System.out.println(users);
}finally {
openSession.close();
}
}
}
8.测试运行
当Users类中的变量名与建表时的名称未对应时,应该在UserMapper.xml文件中写入别名:
select * from users where id = #{id}
//将原语句改为:
select id,name username,password from users where id = #{id}
//建表时所创建字段名称为name,而在实体类中写为username
模糊查询
selecy * from user where username like '%${value}%'
//${}里只能写 value
//也可以写成 "%"#{}"%" #{} 里的数值可以随意写
mybatis的接口类编程
1.写一个接口,与UserMapper.xml文件动态绑定
接口类如下所示:
package com.mybatis;
public interface UserMapper {
public Users getUserId(Integer id);
}
2.绑定到UserMapper.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="com.mybatis.UserMapper">
<!-- namespace:名称空间,必须指定为接口全类名
id:唯一标识 方法名
resultType:返回值类型
#{id}:从传递过来的参数中取到id值
public Users getUserId(Integer id);
-->
<select id="getUserId" resultType="com.mybatis.Users">
select * from users where id = #{id}
</select>
</mapper>
3.编写测试类
//获取sqlsessionFactory方法
public SqlSessionFactory getSqlSessionFactory() throws IOException {
String resource = "SqlMapConfig.xml";
InputStream inputStream = Resources.getResourceAsStream(resource);
return new SqlSessionFactoryBuilder().build(inputStream);
}
@Test
public void test01() throws IOException{
//1.获取sqlsessionFactory
SqlSessionFactory sqlSessionFactory=getSqlSessionFactory();
//2.获取SqlSession对象
SqlSession openSession = sqlSessionFactory.openSession();
try {
//3获取接口的实现类对象
//会为接口自动创造一个代理对象
UserMapper mapper=openSession.getMapper(UserMapper.class);
Users user=mapper.getUserId(1);
System.out.println(mapper.getClass());//获取mapper的对象名
System.out.println(user);
}finally {
openSession.close();
}
}
接口式编程的好处:
接口中编写的方法具有更强的类型检查,有明确的返回值,相当与抽出来一个规范。
mybatis会自动为其创建一个代理对象,所以推荐使用接口式编程。
SqlSession代表数据库的一次会话,用完必须关闭
SqlSession和Connetcion一样,都是非线程安全,所以不可以写成成员变量,会引起资源竞争,所以每次使用都应该获取新的对象,不能共享。
mapper接口没有实现类,但是mybatis会为这个接口生成一个代理对象。
(将接口与xml绑定)
UserMapper userMapper = sqlSession.getMpper(UseraMapper.class);
两个重要配置文件。
mybatis全局配置文件(SqlMapconfig),包含了数据库连接池信息,事务管理信息等。。。。系统运行环境
sql映射文件(UserMapper),保存了每一个sql语句映射信息,将sql抽取出来
别名问题:
在xml文件里设置
<resultMap type="Orders" id="orders">
<result column="user_id" property="userId"/>
</result>
//column 是数据库中的名字 property 是类中的属性
<select id="selectOrderList" resultMap=" orders">
select id,user_id,number FROM orders
</select>
//resultType改为resultMap resultMap中的内容与id一致
sql语句拼接
<!-- 根据性别和名字查询用户 where 可以在sex为null或空值时 去掉username前的 and 但不能去掉后 and -->
<select id="selectUserBySexAndUsername" parameterType="User" resultType="User">
select * from user
<where>
<if text="sex != null and sex != ' '">
sex = #{sex}
</if>
<if test="username !=null and username != ' '">
and username = #{username}
</if>
</where>
</select>
<!-- 根据性别和名字查询用户 where 可以在sex为null或空值时 去掉username前的 and 但不能去掉后 and -->
<select id="selectUserBySexAndUsername" parameterType="User" resultType="User">
select * from user
<where>
<if text="sex != null and sex != ' '">
sex = #{sex}
</if>
<if test="username !=null and username != ' '">
and username = #{username}
</
mybatis的注解式编程
只写接口,不写mapper.xml文件
public interface UsersMapper2 {
@Select("select * from users where id = #{id}")
public Users findUsersById(String id);
}
测试类中:
SqlSessionFactory sqlSessionFactory;
@Before
public void before() throws IOException {
String resource = "mybatis-config.xml";
InputStream inputStream = Resources.getResourceAsStream(resource);
sqlSessionFactory =new SqlSessionFactoryBuilder().build(inputStream);
}
@Test
public void test02() throws IOException {
//创建会话
SqlSession sqlSession=sqlSessionFactory.openSession();
//执行
UsersMapper2 users2=sqlSession.getMapper(UsersMapper2.class);
Users user = users2.findUsersById("01");
System.out.println(user);
//关闭
sqlSession.close();
}
网友评论