mybatis下载地址:https://github.com/mybatis/mybatis-3/releases
下载mybatis的压缩包,解压,根目录有mybatis的jar包,根目录下有一个lib文件,是mybatis运行所需要的jar包
- 添加根目录下mybatis的jar包到项目
- 添加lib目录下mybatis运行所需要的jar包到项目
- 添加连接mysql的驱动包mysql-connnector-java.jar
Mybatis分为两类配置文件,主配置文件和Mapper配置文件
主配置文件:SqlMapConfig.xml
Mapper配置文件:Mapper1.xml、Mapper2.xml等
- mybatis配置
SqlMapConfig.xml,此文件作为mybatis的全局配置文件,配置了mybatis的运行环境等信息。
mapper.xml文件即sql映射文件,文件中配置了操作数据库的sql语句。此文件需要在SqlMapConfig.xml中加载。- 通过mybatis环境等配置信息构造SqlSessionFactory即会话工厂
- 由会话工厂创建sqlSession即会话,操作数据库需要通过sqlSession进行
- mybatis底层自定义了Executor执行器接口操作数据库,Executor接口有两个实现,一个是基本执行器、一个是缓存执行器
- Mapped Statement也是mybatis一个底层封装对象,它包装了mybatis配置信息及sql映射信息等。mapper.xml文件中一个sql对应一个Mapped Statement对象,sql的id即是Mapped statement的id
- Mapped Statement对sql执行输入参数进行定义,包括HashMap、基本类型、pojo,Executor通过Mapped Statement在执行sql前将输入的java对象映射至sql中,输入参数映射就是jdbc编程中对preparedStatement设置参数
- Mapped Statement对sql执行输出结果进行定义,包括HashMap、基本类型、pojo,Executor通过Mapped Statement在执行sql后将输出结果映射至java对象中,输出结果映射过程,相当于jdbc编程中对结果的解析处理过程。
SqlMapConfig.xml
<configuration>
<properties resource="db.properties">
<property name="jdbc.driver" value="com.mysql.jdbc.Driver"/>
<property name="jdbc.url" value="jdbc:mysql://192.168.13.3:3306/mybatis?characterEncoding=utf-8"/>
<property name="jdbc.username" value="yhl"/>
properties>
<typeAliases>
<package name="com.mydeertrip.mybatis.po"/>
typeAliases>
<environments default="development">
<environment id="development">
<transactionManager type="JDBC" />
<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="sqlmap/user.xml"/>
<package name="com.mydeertrip.mybatis.mapper"/>
mappers>
configuration>
user.xml
<mapper namespace="test">
<select id="getUserById" parameterType="int" resultType="com.mydeertrip.mybatis.po.User">
SELECT * FROM `user` WHERE id=#{id};
select>
<select id="getUserByName" parameterType="string" resultType="com.mydeertrip.mybatis.po.User">
SELECT * FROM `user` WHERE username LIKE '%${value}%'
select>
<insert id="insertUser" parameterType="com.mydeertrip.mybatis.po.User">
<selectKey keyProperty="id" resultType="int" order="AFTER">
SELECT LAST_INSERT_ID()
selectKey>
INSERT into user (username,birthday,sex,address)
values (#{username}, #{birthday}, #{sex}, #{address})
insert>
<delete id="deleteUser" parameterType="int">
DELETE from user WHERE id=#{id1}
delete>
<update id="updateUser" parameterType="com.mydeertrip.mybatis.po.User">
update user set username=#{username} WHERE id=#{id}
update>
mapper>
package com.mydeertrip.mybatis.test;
import java.io.InputStream;
import java.util.Date;
import java.util.List;
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.Before;
import org.junit.Test;
import com.mydeertrip.mybatis.po.User;
public class MybatisTest {
private SqlSessionFactory sqlSessionFactory = null;
@Before
public void init() throws Exception {
//第一步:创建一个SQLSessionFactoryBuilder对象。
SqlSessionFactoryBuilder sqlSessionFactoryBuilder = new SqlSessionFactoryBuilder();
//第二步:加载配置文件。
InputStream inputStream = Resources.getResourceAsStream("SqlMapConfig.xml");
//第三步:创建SQLSessionFactory对象
sqlSessionFactory = sqlSessionFactoryBuilder.build(inputStream);
}
@Test
public void getUserById() throws Exception {
//第四步:创建SQLSession对象
SqlSession sqlSession = sqlSessionFactory.openSession();
//第五步:使用SqlSession对象执行查询,得到User对象。
//第一个参数:执行查询的statementId
User user = sqlSession.selectOne("getUserById", 10);
//第六步:打印结果
System.out.println(user);
//第七步:释放资源
sqlSession.close();
}
@Test
public void getUserByName() throws Exception {
//创建一个SQLSession对象
SqlSession sqlSession = sqlSessionFactory.openSession();
//执行查询
List list = sqlSession.selectList("getUserByName", "张");
for (User user : list) {
System.out.println(user);
}
//释放资源
sqlSession.close();
}
@Test
public void addUser() throws Exception {
//创建一个SQLSession对象
SqlSession sqlSession = sqlSessionFactory.openSession();
//创建User对象
User user = new User();
user.setUsername("小乔");
user.setBirthday(new Date());
user.setSex("2");
user.setAddress("上海");
//插入用户
sqlSession.insert("insertUser", user);
System.out.println(user.getId());
//提交事务
sqlSession.commit();
//释放资源
sqlSession.close();
}
@Test
public void deleteUser() throws Exception {
SqlSession sqlSession = sqlSessionFactory.openSession();
//删除用户
sqlSession.delete("deleteUser",2);
//提交事务
sqlSession.commit();
sqlSession.close();
}
@Test
public void updateUser() throws Exception {
SqlSession sqlSession = sqlSessionFactory.openSession();
//创建一个User对象
User user = new User() ;
user.setUsername("张角1");
user.setId(27);
//更新用户
sqlSession.update("updateUser", user);
//提交事务
sqlSession.commit();
sqlSession.close();
}
}
package com.mydeertrip.mybatis.dao;
import java.util.List;
import com.mydeertrip.mybatis.po.User;
public interface UserDao {
User getUserById(int id);
List getUserByName(String username);
void insertUser(User user);
}
package com.mydeertrip.mybatis.dao.impl;
import java.util.List;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import com.mydeertrip.mybatis.dao.UserDao;
import com.mydeertrip.mybatis.po.User;
public class UserDaoImpl implements UserDao {
private SqlSessionFactory sqlSessionFactory;
public UserDaoImpl(SqlSessionFactory sqlSessionFactory) {
this.sqlSessionFactory = sqlSessionFactory;
}
@Override
public User getUserById(int id) {
SqlSession sqlSession = sqlSessionFactory.openSession();
// 根据id查询用户信息
User user = sqlSession.selectOne("getUserById", id);
// 关闭SQLSession
sqlSession.close();
return user;
}
@Override
public List getUserByName(String username) {
// 创建一个SQLSession对象
SqlSession sqlSession = sqlSessionFactory.openSession();
// 执行查询
List list = sqlSession.selectList("getUserByName", username);
// 释放资源
sqlSession.close();
return list;
}
@Override
public void insertUser(User user) {
// 创建一个SQLSession对象
SqlSession sqlSession = sqlSessionFactory.openSession();
// 插入用户
sqlSession.insert("insertUser", user);
// 提交事务
sqlSession.commit();
// 释放资源
sqlSession.close();
}
}
package com.mydeertrip.mybatis.dao;
import java.io.InputStream;
import java.util.Date;
import java.util.List;
import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
import org.junit.Before;
import org.junit.Test;
import com.mydeertrip.mybatis.dao.impl.UserDaoImpl;
import com.mydeertrip.mybatis.po.User;
public class UserDaoTest {
private SqlSessionFactory sqlSessionFactory = null;
@Before
public void init() throws Exception {
// 第一步:创建一个SQLSessionFactoryBuilder对象。
SqlSessionFactoryBuilder sqlSessionFactoryBuilder = new SqlSessionFactoryBuilder();
// 第二步:加载配置文件。
InputStream inputStream = Resources.getResourceAsStream("SqlMapConfig.xml");
// 第三步:创建SQLSessionFactory对象
sqlSessionFactory = sqlSessionFactoryBuilder.build(inputStream);
}
@Test
public void testGetUserById() {
UserDao userDao = new UserDaoImpl(sqlSessionFactory);
User user = userDao.getUserById(10);
System.out.println(user);
}
@Test
public void testGetUserByName() {
UserDao userDao = new UserDaoImpl(sqlSessionFactory);
List list = userDao.getUserByName("张");
for (User user : list) {
System.out.println(user);
}
}
@Test
public void testInsertUser() {
UserDao userDao = new UserDaoImpl(sqlSessionFactory);
User user = new User();
user.setUsername("赵云");
user.setAddress("正定");
user.setBirthday(new Date());
user.setSex("1");
userDao.insertUser(user);
}
}
package com.mydeertrip.mybatis.mapper;
import java.util.List;
import com.mydeertrip.mybatis.po.User;
public interface UserMapper {
User getUserById(int id);
List getUserByName(String username);
void insertUser(User user);
}
<mapper namespace="com.mydeertrip.mybatis.mapper.UserMapper">
<select id="getUserById" parameterType="int" resultType="USer">
SELECT * FROM `user` WHERE id=#{id};
select>
<select id="getUserByName" parameterType="string" resultType="com.mydeertrip.mybatis.po.User">
SELECT * FROM `user` WHERE username LIKE '%${value}%'
select>
<insert id="insertUser" parameterType="com.mydeertrip.mybatis.po.User">
<selectKey keyProperty="id" resultType="int" order="AFTER">
SELECT LAST_INSERT_ID()
selectKey>
INSERT into user (username,birthday,sex,address)
values (#{username}, #{birthday}, #{sex}, #{address})
insert>
mapper>
package com.mydeertrip.mybatis.mapper;
import static org.junit.Assert.fail;
import java.io.InputStream;
import java.util.List;
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.Before;
import org.junit.Test;
import com.mydeertrip.mybatis.po.User;
public class UserMapperTest {
private SqlSessionFactory sqlSessionFactory = null;
@Before
public void init() throws Exception {
// 第一步:创建一个SQLSessionFactoryBuilder对象。
SqlSessionFactoryBuilder sqlSessionFactoryBuilder = new SqlSessionFactoryBuilder();
// 第二步:加载配置文件。
InputStream inputStream = Resources.getResourceAsStream("SqlMapConfig.xml");
// 第三步:创建SQLSessionFactory对象
sqlSessionFactory = sqlSessionFactoryBuilder.build(inputStream);
}
@Test
public void testGetUserById() {
//和spring整合后省略
SqlSession sqlSession = sqlSessionFactory.openSession();
//获得代理对象
UserMapper userMapper = sqlSession.getMapper(UserMapper.class);
User user = userMapper.getUserById(10);
System.out.println(user);
//和spring整合后省略
sqlSession.close();
}
@Test
public void testGetUserByName() {
SqlSession sqlSession = sqlSessionFactory.openSession();
UserMapper userMapper = sqlSession.getMapper(UserMapper.class);
List list = userMapper.getUserByName("张");
for (User user : list) {
System.out.println(user);
}
sqlSession.close();
}
@Test
public void testInsertUser() {
fail("Not yet implemented");
}
}
#{}表示一个占位符号,通过#{}可以实现preparedStatement向占位符中设置值,自动进行java类型和jdbc类型转换,#{}可以有效防止sql注入。 #{}可以接收简单类型值或pojo属性值。 如果parameterType传输单个简单类型值,#{}括号中可以是value或其它任意名称(即括号中可以不是输入参数的名称),如果时pojo,则括号中必须是pojo属性名。
${}表示拼接sql串,通过${}可以将parameterType 传入的内容拼接在sql中且不进行jdbc类型转换,不能防止sql注入,${}可以接收简单类型值或pojo属性值,如果parameterType传输单个简单类型值,${}括号中只能是value,如果是pojo,则括号中必须是属性值。
parameterType:指定输入参数类型,mybatis通过ognl从输入对象中获取参数值拼接在sql中
resultType:指定输出结果类型,mybatis将sql查询结果的一行记录数据映射为resultType指定类型的对象
selectOne查询一条记录,如果使用selectOne查询多条记录则抛出异常
selectList可以查询一条或多条记录
<insert id="insertUser" parameterType="com.mydeertrip.mybatis.po.User">
<selectKey keyProperty="id" order="AFTER" resultType="java.lang.Integer">
select LAST_INSERT_ID()
selectKey>
insert into user(username,birthday,sex,address)
values(#{username},#{birthday},#{sex},#{address});
insert>
- mapper.xml配置文件中的明明空间必须是接口的全限定名
- mapper.xml配置文件中select标签的id属性值,必须和接口中的方法名一样
- 接口方法的参数类型必须和parameterType类型一样
- 接口方法的返回值类型必须和resultType类型一样
properties(属性)
settings(全局配置参数)
typeAliases(类型别名)
typeHandlers(类型处理器)
objectFactory(对象工厂)
plugins(插件)
environments(环境集合属性对象)
environment(环境子属性对象)
transactionManager(事务管理)
dataSource(数据源)
mappers(映射器)
"db.properties">
<property name="jdbc.driver" value="com.mysql.jdbc.Driver"/>
<property name="jdbc.url" value="jdbc:mysql://192.168.13.3:3306/mybatis?characterEncoding=utf-8"/>
<property name="jdbc.username" value="yhl"/>
- properties标签用于配置属性,该配置文件其他标签可以通过“${}”的方式引用properties中定义的值
- 通过在properties上添加resource属性来加载外部定义的properties文件,如:db.properties
- 内部定义properties和外部加载的properties的加载顺序是:先加载内部properties再加载外部properties,因此外部properties文件中定义的属性会覆盖内部定义的同名属性
<typeAliases>
<package name="com.mydeertrip.mybatis.po"/>
typeAliases>
- 给每个类定义别名
- 扫描包形式,别名为类名,不区分大小写
别名 | 映射的类型 |
---|---|
_byte | byte |
_long | long |
_short | short |
_int | int |
_integer | int |
_double | double |
_float | float |
_boolean | boolean |
string | String |
byte | Byte |
long | Long |
short | Short |
int | Integer |
integer | Integer |
double | Double |
float | Float |
boolean | Boolean |
date | Date |
decimal | BigDecimal |
bigdecimal | BigDecimal |
map | Map |
<mappers>
<mapper resource="sqlmap/user.xml"/>
<package name="com.mydeertrip.mybatis.mapper"/>
mappers>
resource属性
在mapper标签上使用resource属性加载mapper.xml文件,基于classpath路径查找
class属性
在mapper标签上使用class属性加载mapper.xml文件
- mapper.xml映射文件必须和mapper.java接口在同一目录下,即同一包下
- mapper.xml映射文件的文件名必须和mapper.java的文件名一样,比如:UserMapper.xml和UserMapper.java
- class的值为mapper接口的全限定名
package标签
通过package标签扫描包加载mapper.xml文件
- mapper.xml映射文件必须和mapper.java接口在同一目录下,即同一包下
- mapper.xml映射文件的文件名必须和mapper.java的文件名一样,比如:UserMapper.xml和UserMapper.java
- class的值为mapper接口的全限定名