您的位置:首页 > 其它

mybatis的进阶指南

2018-01-15 21:40 316 查看
这一篇mybatis的进阶指南是接着上一篇mybatis的入门指南来的,先新建一个项目mybatis02,包名等都相应的改了,其他跟mybatis的入门指南一样

通过接口交互数据

SqlSession通过的通用方法并强制转换的方式,容易出错,IDE不能不能提示转换类型,存在着转换安全的问题,可以采用接口+xml,和单独的接口两种方式来加以避免。

接口+xml

在com.example.mybatis02.mapping包下新建一个接口文件:

package com.example.mybatis02.mapping;

import java.util.List;

import com.example.mybatis02.domain.User;

public interface UserMapper {
public void insert(User user);
public User selectUser(String userName);
public List<User> selectAll();
}


测试,其他的不用动,我们测试:

package com.example.mybatis02;

import java.io.InputStream;

import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;

import com.example.mybatis02.domain.User;
import com.example.mybatis02.mapping.UserMapper;
import com.example.mybatis02.mapping.UserMapper2;

/**
* Hello world!
*
*/
public class App {
public static void main(String[] args) {
//mybatis的配置文件
String resource = "conf.xml";
//使用类加载器加载mybatis的配置文件(它也加载关联的映射文件)
InputStream is = App.class.getClassLoader().getResourceAsStream(resource);
//构建sqlSession的工厂
SqlSessionFactory sessionFactory = new SqlSessionFactoryBuilder().build(is);
//创建能执行映射文件中sql的sqlSession
SqlSession session = sessionFactory.openSession(true);
UserMapper useMapper = session.getMapper(UserMapper.class);
System.out.println(useMapper.selectUser("alex"));
}
}


注意,UserMapper.xml文件的mapper节点的namespace要对于接口文件的包名+类名。

纯接口

新建一个接口:

package com.example.mybatis02.mapping;

import java.util.List;

import org.apache.ibatis.annotations.Insert;
import org.apache.ibatis.annotations.Select;

import com.example.mybatis02.domain.User;

public interface UserMapper2 {

@Insert({"insert into users(username,password,enabled) values(#{username}, #{password},#{enabled})"})
public void insert(User user);

@Select({ "SELECT * FROM users WHERE username = #{username}" })
public User selectUser(String userName);

@Select({ "SELECT * FROM users" })
public List<User> selectAll();
}


在方法上面加上select注释,需要在conf.xml加上:

<mapper class="com.example.mybatis02.mapping.UserMapper2" />


或者:

//构建sqlSession的工厂
SqlSessionFactory sessionFactory = new SqlSessionFactoryBuilder().build(is);
sessionFactory.getConfiguration().addMapper(UserMapper2.class);


测试:

package com.example.mybatis02;

import java.io.InputStream;

import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;

import com.example.mybatis02.domain.User;
import com.example.mybatis02.mapping.UserMapper;
import com.example.mybatis02.mapping.UserMapper2;

/**
* Hello world!
*
*/
public class App {
public static void main(String[] args) {
//mybatis的配置文件
String resource = "conf.xml";
//使用类加载器加载mybatis的配置文件(它也加载关联的映射文件)
InputStream is = App.class.getClassLoader().getResourceAsStream(resource);
//构建sqlSession的工厂 SqlSessionFactory sessionFactory = new SqlSessionFactoryBuilder().build(is); sessionFactory.getConfiguration().addMapper(UserMapper2.class);
//创建能执行映射文件中sql的sqlSession
SqlSession session = sessionFactory.openSession(true);
UserMapper2 mapper2 = session.getMapper(UserMapper2.class);
System.out.println(mapper2.selectUser("alex"));
System.out.println(mapper2.selectAll());
}
}


上面两种方法都行,要注意的是,在接口+xml的方法中,如果把接口加入mybatis的配置中,则接口和配置文件必须得在同一个包里,xml的namespace必须对应接口文件的包名+类名,否则报错,如果把xml文件加入mybatis配置中,则接口和配置文件不一定要在同一个包里,但是xml的namespace必须对应接口文件的包名+类名。不能都加,否则也会报错。

返回类型resultMap

<resultMap type="user" id="userList"><!-- type为返回列表元素的类全名或别名 -->
<result column="username" property="username" />
<result column="password" property="password" />
<result column="enabled" property="enabled" />
</resultMap>
<select id="selectAll" resultMap="userList">
SELECT * FROM users
</select>


属性名映射到列名,功能很强大,我们也可以直接:

<select id="selectAll" resultType="user">
SELECT * FROM users
</select>


这样要属性名跟列名一样才行。

参数类型parameterType

参数类型parameterType既可以是Java的基本类型,也可以自定义类型,例如:user,

<insert id="insert" parameterType="user">
insert into users(username,
password,enabled) values(#{username}, #{password},#{enabled})
</insert>
<select id="selectUser" parameterType="String" resultType="user">
SELECT * FROM users WHERE username = #{username}
</select>


事务

通过

SqlSession session = sqlSessionFactory.openSession(false); // 打开会话,事务开始


获取session或者不传参数,开启了一个事务,之后的insert,update,delete操作都是事务中,最后要通过

session.commit();


来提交事务,否则不起作用。

今后有时间,写一些mybatis整合spring,springboot的博客,记录下自己的所学所思,也给其他的读者一些入门的参考。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: