1.1全局配置
mybatis-config.xml 文件
0.加载了两个配置文件,jdbc.properties,log4j.properties(就不展示了)
1.批量对引用类型取别名,最好还是不起使用全类名,比较容易查看类型,就是多了些代码
注意:它如果多余不同包同名的java文件,出现别名冲突, 得通过@Alias("")单独指定别名,可以参考下面
2.并未使用批量注册sql映射文件,而是一个个注册,适合sql映射文件少时,
如果比较多的话,还是批量注册,将sql映射文件放入接口包下,而且必须同包同名
注册的方法有3种,个人还是注册配置文件方式,这样sql映射文件就不需要和接口放一起了,这样的话不会说一个包下文件太多.或者就是使用基于注解,这样就不用映射文件,但是将sql语句写在了接口的方法上,但是不利于维护,也不能体现mybatis的目的
没有sql映射文件,使用注解的方式
3.对于环境们的配置,现在需要掌握,后续是在spring配置,所以需要了解
像这里配置了oracle数据库环境,mysql数据库环境,只需通过default属性设置不同的id即可切换环境
4.数据库厂商取别名
2.1 基本的了解
这些是基本的格式,namespace可以随便取,但如果接口式配置的话,就必须得是接口全名
以及的id必须是接口的方法名
注意:mybatis的传入参数就一个,对于多个参数待会指出.
传入的参数类型可以不写
查询后的结果如果是一个List,但是resultType还是按User的类型取,多个数据按单个类型取
可以指出数据库类型,databaseId指出
使用了#{} ,后续还有${},大致了解一下
2.2参照sql映射文件
未使用接口式配置
主要讲解下#{},${}
#{变量名} 一个占位符,对于传入的字符串自动加’’
KaTeX parse error: Expected 'EOF', got '#' at position 58: …么里面的变量名随便起 ,比如 #̲{id} …{value},就是变量名固定死了,所以两种写法#{id}, ${value}
第二个例子:就只能使用${value},使用#{}会自动对字符串加’’
1.读取配置文件 2.创建SqlSessionFactory对象 3.创建SqlSession
4.使用它自带的方法 selectOne()…
//1.读取配置文件
//全局配置文件的路径
String resource = "mybatis-config.xml";
InputStream is = Resources.getResourceAsStream(resource);
//2.创建SqlSessionFactory对象
SqlSessionFactory sqlSessionFactory =
new SqlSessionFactoryBuilder().build(is);
/*
3.创建SqlSession
能直接执行映射的sql语句
openSession()有一个传入boolean的方法
默认是false,需要手动提交事物,设置为true,就自动提交事物
*/
SqlSession sqlSession = sqlSessionFactory.openSession();
//4.调用SqlSession的方法
try {
/*
1.查询
selectOne("映射文件的id.
接口式写法
select * from BIGPIG.USERPSD where U_ID = #{id}
select * from sc0926.userpsd where u_id = #{id}
前面一样,都是1.读取配置文件 2.获取SqlSessionFactory对象 3.获取SqlSession对象
4.接着就是获取接口的实现类对象,动态代理获取该对象 5.调用接口中的方法
//1.读取配置文件
//全局配置文件的路径
String resource = "mybatis-config.xml";
InputStream is = Resources.getResourceAsStream(resource);
//2.创建SqlSessionFactory
SqlSessionFactory sqlSessionFactory =
new SqlSessionFactoryBuilder().build(is);
//获取SqlSession对象
SqlSession sqlSession = sqlSessionFactory.openSession();
//获取接口的实现类对象
//会为接口自动的创建一个代理对象,代理对象去执行方法
UserDao userDao = sqlSession.getMapper(UserDao.class);
//动态代理,获取到了该对象
System.err.println(userDao.getClass());
User user = userDao.getUserByIdAndUser(3,"张三");
System.err.println(user);
//3.关闭资源
sqlSession.close();
综合来说前面步骤一样
//1.读取配置文件
//全局配置文件的路径
String resource = "mybatis-config.xml";
InputStream is = Resources.getResourceAsStream(resource);
//2.创建SqlSessionFactory
SqlSessionFactory sqlSessionFactory =
new SqlSessionFactoryBuilder().build(is);
//获取SqlSession对象
SqlSession sqlSession = sqlSessionFactory.openSession();
/*
一种是使用SqlSession对象的方法
*/
/*
另一种是接口式配置,使用接口中的方法.先获取接口的实现类对象,为接口自动创建一个代理对象,代理对象去执行方法
*/
(ps:后续的操作都是建立在接口式配置)
2.3插入并返回主键值
对于支持主键自增的数据库,如Mysql数据库,mybatis支持设置属性
userGenerateKeys默认是false,设置为true
keyProperty属性是返回javaBean的哪个
insert into sc0926.userpsd(u_user, u_psd, u_date)
values(#{u_user},#{u_psd},#{u_date})
对于Oracle数据库,没有自增主键,通过sequnce序列设置的,可以通过一般方法:
查询主键,在标签内需要输入查询主键的sql
keyProperty属性,可以使用字段名;resultType类型,字段的类型
order:指定查询主键的sql和insert语句的执行顺序,相对于insert语句来说
last_insert_id():该函数是Mysql数据库的,获取自增主键的id,它必须配合insert语句一起使用
select last_insert_id();
insert into sc0926.userpsd(u_user, u_psd, u_date)
values(#{u_user},#{u_psd},#{u_date})
select seq_userpsd.currval from dual
insert into BIGPIG.USERPSD
values(seq_userpsd.nextval,#{u_user},#{u_psd},#{u_date})
推荐使用这个一般方法,比较适合多种数据库
2.4多个参数传入
查询时,不可能查询条件只有一个,有时候多个条件,那么就得传入多个参数
mybatis对于参数,只能接受一个,是指它将传入的参数都疯转成了一个Map
那么map中的key对应多个value,如果取出第一个,第二个参数值,#{param1},#{param2}…
select * from BIGPIG.USERPSD where U_ID = #{param1} and U_USER=#{param2}
这样不太利于维护,所以我们可以使用注解命名,使用别名
public interface UserDao {
User getUser( Integer u_id);
void addUser(User user);
void updateUser(User user);
void deleteUser(Integer u_id);
/**
* 使用注解@Param,可以给参数命名,这样多个参数传值时,可以直接使用名字取值
* 由于多个参数被封装成了map,key:param1,param2...
* 虽然可以直接通过#{parm1}取值,但是不利于维护
* 可以给参数命名,然后#{u_id}取值,这样利于维护
* @param u_id
* @param u_user
* @return
*/
User getUserByIdAndUser(@Param("u_id") Integer u_id,
@Param("u_user") String u_user);
}
select * from BIGPIG.USERPSD where U_ID = #{u_id} and U_USER=#{u_user}
1.如果多个参数正好是业务模型,直接传入pojo就可以了,也即是javabean类型
#{属性名},也即是JavaBean的字段名.
2.如果传入的参数不是业务模型中的数据,没有对应的pojo,为了方便,传入map
#{key}也就是取出map中对应的值