核心方法
返回值 | 方法名 | 说明 |
---|---|---|
InputStream | getResourceAsStream(String fileName) | 通过类加载器返回指定资源的字节流 |
建造者设计模式:
核心方法
返回值 | 方法名 | 说明 |
---|---|---|
SqlSessionFactory | build(InputStream is) | 通过指定资源字节输入流获取SqlSession工厂对象 |
String resource = "org/mybatis/builder/mybatis-config.xml";
InputStream inputStream = Resources.getResourceAsStream(resource);
SqlSessionFactoryBuilder builder = new SqlSessionFactoryBuilder();
SqlSessionFactory factory = builder.build(inputStream);
其中, Resources 工具类,这个类在 org.apache.ibatis.io 包中。
Resources 类帮助你从类路径下、文件系统或一个 web URL 中加载资源文件。
工厂设计模式:
核心api
返回值 | 方法名 | 说明 |
---|---|---|
SqlSession | openSession() | 获取SqlSession构建者对象,并开启手动提交事务 |
SqlSession | openSession(boolean autoCommit) | 获取SqlSession构建者对象,如果参数为true,则开启自动提交事务 |
org.apache.ibatis.session.SqlSession:构建者对象接口。
用于执行 SQL、管理事务、接口代理。
核心api
SqlSession 实例在 MyBatis 中是非常强大的一个类。
在这里你会看到所有执行语句、提交或回滚事务和获取映射器实例的方法。
采用 Mybatis 的代理开发方式实现 DAO 层的开发,这种方式是我们后面进入企业的主流。
Mapper 接口开发方法只需要程序员编写Mapper 接口(相当于Dao 接口),由Mybatis 框架根据接口定义创建接口的动态代理对象,代理对象的方法体同上边Dao接口实现类方法。
Mapper 接口开发需要遵循以下规范:
1) Mapper.xml文件中的namespace与mapper接口的全限定名相同
2) Mapper接口方法名和Mapper.xml中定义的每个statement的id相同
3) Mapper接口方法的输入参数类型和mapper.xml中定义的每个sql的parameterType的类型相同
4) Mapper接口方法的返回值类型和mapper.xml中定义的每个sql的resultType的类型相同
总结:
接口开发的方式: 程序员只需定义接口,就可以对数据库进行操作,那么具体的对象怎么创建?
1.程序员负责定义接口
2.在操作数据库,mybatis框架根据接口,通过动态代理的方式生成代理对象,负责数据库的crud操作
<Select> 查询功能标签
属性 id:唯一标识, 配合名称空间使用。
parameterType:指定参数映射的对象类型。
resultType:指定结果映射的对象类型。
SQL 获取参数: #{属性名} #表示方式sql注入的 $ 表示sql拼接 where id=1 1=1
示例
<select id="findById" parameterType="java.lang.String" resultType="cn.zxy.pojo.User">
select * from user where id=#{id}
select>
<insert>:新增功能标签。
属性 id:唯一标识, 配合名称空间使用。
SQL 获取参数: #{属性名}
示例
操作步骤:
第一步、编写dao接口
public void save(User user);
第二步、编写映射文件
<insert id="save" parameterType="com.by.pojo.User">
insert into user values(#{id},#{username},#{sex},#{address},#{birthday})
insert>
第三步、测试代码
@Test
public void saveTest() throws IOException {
//读取配置文件
InputStream is = Resources.getResourceAsStream("mybatis-config.xml");
//获取建造者对象
SqlSessionFactoryBuilder builder = new SqlSessionFactoryBuilder();
SqlSessionFactory sessionFactory = builder.build(is);
SqlSession session = sessionFactory.openSession();
UserDao mapper = session.getMapper(UserDao.class);
User user=new User();
// user.setId(1);
user.setUsername("张三");
user.setSex("男");
user.setAddress("河南开封");
user.setBirthday("2010-09-12");
mapper.save(user);
//提交数据
session.commit();
//释放资源
is.close();
session.close();
}
<update>:修改功能标签。
属性 id:唯一标识, 配合名称空间使用。
SQL 获取参数: #{属性名}
示例
1、编写dao接口
public void update(User user);
2、编写映射文件
<update id="update" parameterType="cn.zxy.pojo.User">
update user set username=#{username},sex=#{sex} where id=#{id}
update>
3、测试运行
@Test
public void update() throws IOException {
//读取配置文件
InputStream is = Resources.getResourceAsStream("mybatis-config.xml");
//获取建造者对象
SqlSessionFactoryBuilder builder = new SqlSessionFactoryBuilder();
SqlSessionFactory sessionFactory = builder.build(is);
SqlSession session = sessionFactory.openSession();
UserDao mapper = session.getMapper(UserDao.class);
User user=new User();
user.setId(1);
user.setUsername("张三");
user.setSex("女");
mapper.update(user);
//提交数据
session.commit();
//释放资源
is.close();
session.close();
}
<delete>:查询功能标签。
属性 id:唯一标识, 配合名称空间使用。
SQL 获取参数: #{属性名}
1、编写dao接口
public void delete(int id);
<delete id="delete" parameterType="java.lang.Integer">
delete from user where id=#{id}
delete>
3、测试运行
@Test
public void delTest() throws IOException {
InputStream is = Resources.getResourceAsStream("mybatis-config.xml");
//获取建造者对象
SqlSessionFactoryBuilder builder = new SqlSessionFactoryBuilder();
SqlSessionFactory sessionFactory = builder.build(is);
SqlSession session = sessionFactory.openSession();
UserDao mapper = session.getMapper(UserDao.class);
mapper.delete(1);
//提交数据
session.commit();
//释放资源
is.close();
session.close();
}
public class MybatisUtils {
//定义静态的session工厂对象
static SqlSessionFactory sqlSessionFactory;
static {
//读取配置文件
try {
InputStream is = Resources.getResourceAsStream("mybatis-config.xml");
SqlSessionFactoryBuilder builder=new SqlSessionFactoryBuilder();
sqlSessionFactory = builder.build(is);
} catch (IOException e) {
e.printStackTrace();
}
}
//提交
public static SqlSession getSqlSession(boolean autocommit){
return sqlSessionFactory.openSession(autocommit);
}
//关闭
public static void closeSqlSession(SqlSession sqlSession){
sqlSession.close();
}
}
测试操作:
@Test
public void findTest() throws IOException {
//调用utils里面的getsqlSession 包含提交操作
SqlSession session = MybatisUtils.getSqlSession(true);
UserDao mapper = session.getMapper(UserDao.class);
List<User> all = mapper.findAll();
for (User user : all) {
System.out.println(user);
}
//释放资源
MybatisUtils.closeSqlSession(session);
}
@insert 添加操作
1、编写mapper接口
@Insert("insert into T_user values(#{id},#{username},#{sex},#{address},#{birthday})")
public void save(User user);
2、编写测试类
@Test
public void insertTest(){
SqlSession sqlSession = MybatisUtils.getSqlSession(true);
IUsermapper mapper = sqlSession.getMapper(IUsermapper.class);
User user=new User();
user.setUsername("胡二小");
user.setSex("女");
user.setAddress("郑州");
user.setBirthday("2001-09-12");
mapper.save(user);
//释放资源
MybatisUtils.closeSqlSession(sqlSession);
}
@update修改操作
@Update("update T_user set username=#{username},sex=#{sex} where id=#{id}")
public void update(User user);
@Delete删除操作
@Delete("delete from T_user where id=#{id}")
public void delete(int id);
新增用户后, 同时还要返回当前新增用户的 id 值, 因为 id 是由数据库的自动增长来实现的,所以就相
当于我们要在新增后将自动增长 auto_increment 的值返回。
<insert id="saveUser" parameterType="user">
<selectKey order="AFTER" keyProperty="id" keyColumn="id" resultType="int">
select last_insert_id()
selectKey>
insert into T_user(id,username,sex,address,birthday) values(#{id},#{username},#{sex},#{address},#{birthday})
insert>
编写步骤:
1、在dao中添加一个方法
public void saveUser(User user);
2、编写映射
3、编写测试
@Test
public void saveTest() throws IOException {
SqlSession sqlSession = MybatisUtils.getSqlSession(true);
UserDao mapper = sqlSession.getMapper(UserDao.class);
User user=new User();
// user.setId(1);
user.setUsername("小李子");
user.setSex("男");
user.setAddress("郑州");
user.setBirthday(Date.valueOf("2011-09-12"));
//mapper.save(user);
mapper.saveUser(user);
//打印id的值
System.out.println("userId="+user.getId());
MybatisUtils.closeSqlSession(sqlSession);
}
总体解释:将插入数据的主键返回到 user 对象中。
具体解释:
SELECT LAST_INSERT_ID():得到刚 insert 进去记录的主键值,只适用与自增主键
keyProperty:将查询到主键值设置到 parameterType 指定的对象的那个属性
keyColumn 指定的是表中的主键字段名
resultType:指定 SELECTLAST_INSERT_ID() 的结果类型