一.properties
这些属性都是可外部配置且可动态替换的,既可以在典型的 Java 属性文件中配置,亦可通过 properties 元素的子元素来传递。例如
1)
这种方法是将数据源的属性放在db.properties中,然后在mybatis中读取property的value值,需要在中配置一个properties的属性,
db.properties的内容如下:
driver=com.mysql.jdbc.Driver
url=jdbc:mysql://localhost:3306/mybatis02?useSSL=false
username=root
password=123456
2)直接将属性的value值写死在mybaties.xml
二,typeAliases
有三种方式配置typeAliases,第一种方式是手动配置别名,第二种方式是通过注解,第三种方式是通过扫描包(推荐使用该方式)
在configuration标签中添加如下标签,
通过包扫描的方式配置别名
3,注解的方式配置别名
暂时不用
三,typeHandles类型处理器无论是 MyBatis 在预处理语句(PreparedStatement)中设置一个参数时,还是从结果集中取出一个值时, 都会用类型处理器将获取的值以合适的方式转换成 Java类型。
下表描述了一些默认的类型处理器。
四,环境配置
MyBatis 可以配置成适应多种环境,这种机制有助于将 SQL 映射应用于多种数据库之中, 现实情况下有多种理由需要这么做。例如,开发、测试和生产环境需要有不同的配置;或者共享相同 Schema 的多个生产数据库, 想使用相同的 SQL 映射。许多类似的用例。不过要记住:尽管可以配置多个环境,每个 不过要记住:尽管可以配置多个环境,每个SqlSessionFactory 实例只能选 实例只能选择其一。所以,如果你想连接两个数据库,就需要创建两个 SqlSessionFactory 实例,每个数据库对应一个。而如果是三个数据库,就需要三个实例,依此类推,记起来很简单:
db.properties文件
driver=com.mysql.jdbc.Driver
url=jdbc:mysql://localhost:3306/mybatis02?useSSL=false
username=root
password=123456
driver2=com.mysql.jdbc.Driver
url2=jdbc:mysql://localhost:3306/mybatis?useSSL=false
username2=root
password2=123456
五,DataSource数据源
dataSource 元素使用标准的 JDBC 数据源接口来配置 JDBC 连接对象的资源。数据源类型有三种:UNPOOLED,POOLED,JNDI。
UNPOOLED是没有数据库连接池的,没执行一次操作,打开一次数据库,关闭一次数据库.效率较为低下
POOLED是存在数据库连接池的,没有操作数据库从数据库连接池中拿取连接
JNDI这个数据源的实现是为了能在如 EJB 或应用服务器这类容器中使用,容器可以集中或在外部配置数据源,然后放置一个 JNDI 上下文的引用。
六 mapper映射器(4种配置)
第一种 配置文件路径(相对项目的相对路径)
第二种 配置文件的绝对路径(不推荐使用,随着项目的变更,路径也要改变,比较麻烦)
第三种 注解形式配置(用的相对较少)
配置注解的时候,在接口的方法要加上注解,映射文件中可以不用配置sql语句
第四种 映射包下所有接口(较为常用)
七,封装Dao
将UserMapper的接口实现,将接口里方法重写并且实现封装
importcom.shsxt.mapper.UserMapper;importcom.shsxt.po.User;importorg.apache.ibatis.session.SqlSession;importorg.apache.ibatis.session.SqlSessionFactory;importjava.util.List;importjava.util.Map;public class UserMapperImpl implementsUserMapper {privateSqlSessionFactory sqlSessionFactory;publicUserMapperImpl(SqlSessionFactory sqlSessionFactory) {this.sqlSessionFactory =sqlSessionFactory;
}
@OverridepublicUser queryById(Integer id) {
SqlSession session=null;
User user=null;try{
session=sqlSessionFactory.openSession();
user=session.selectOne("com.shsxt.mapper.UserMapper.queryById",id);
}catch(Exception e){
e.printStackTrace();
}finally{if(session!=null){
session.close();
}
}returnuser;
}
八,增删改查,在UserMapper.xml的文件中配置
UserMapper.xm的文件配置内容如下
username,realname,password
select * from user where id=#{id}
select count(*) from user
select username from user where id =#{id}
select username from user where username like concat('%',#{username},'%')
select * from user where id=#{id}
select * from user where id=#{id} and username=#{username}
insert into user (username,realname,password) values (#{username},#{realname},#{password})
select LAST_INSERT_ID() as idinsert into user (username,realname,password) values (#{username},#{realname},#{password})
insert into user (username,realname,password) values (#{username},#{realname},#{password})
insert into user (username,realname,password) values(#{item.username},#{item.realname},#{item.password})
update user set username=#{username}, realname=#{realname},password=#{password} where id=#{id}
update user set password='88888888' where id in (#{item})
delete from user where id=#{id}
delete from user where id in (#{item})
实现类UserMapperImpl的配置如下:
packagecom.shsxt.mapper.Impl;importcom.shsxt.mapper.UserMapper;importcom.shsxt.po.User;importorg.apache.ibatis.session.SqlSession;importorg.apache.ibatis.session.SqlSessionFactory;importjava.util.List;importjava.util.Map;public class UserMapperImpl implementsUserMapper {privateSqlSessionFactory sqlSessionFactory;publicUserMapperImpl(SqlSessionFactory sqlSessionFactory) {this.sqlSessionFactory =sqlSessionFactory;
}
@OverridepublicUser queryById(Integer id) {
SqlSession session=null;
User user=null;try{
session=sqlSessionFactory.openSession();
user=session.selectOne("com.shsxt.mapper.UserMapper.queryById",id);
}catch(Exception e){
e.printStackTrace();
}finally{if(session!=null){
session.close();
}
}returnuser;
}
@OverridepublicInteger queryAll() {
SqlSession session=null;
Integer a=null;try{
session=sqlSessionFactory.openSession();
a=session.selectOne("com.shsxt.mapper.UserMapper.queryAll");
}catch(Exception e){
e.printStackTrace();
}finally{if(session!=null){
session.close();
}
}returna;
}
@OverridepublicString queryUname(Integer id) {
SqlSession session=null;
String abc=null;try{
session=sqlSessionFactory.openSession();
abc=session.selectOne("com.shsxt.mapper.UserMapper.queryUname", id);
}catch(Exception e){
e.printStackTrace();
}finally{if(session!=null){
session.close();
}
}returnabc;
}
@Overridepublic ListqueryByName(User user) {
SqlSession session=null;
List list=null;try{
session=sqlSessionFactory.openSession();
list=session.selectList("com.shsxt.mapper.UserMapper.queryByName", user);
}catch(Exception e){
e.printStackTrace();
}finally{if(session!=null){
session.close();
}
}returnlist;
}
@OverridepublicMap queryIdByMap(Integer id) {
SqlSession sqlsession=null;
Map map=null;try{
sqlsession=sqlSessionFactory.openSession();
map=sqlsession.selectOne("com.shsxt.mapper.UserMapper.queryIdByMap",id);
}catch(Exception e){
e.printStackTrace();
}finally{if(sqlsession!=null){
sqlsession.close();
}
}returnmap;
}
@OverridepublicInteger insertByUser(User user) {
SqlSession session=null;
Integer a=null;try{
session=sqlSessionFactory.openSession();
a=session.insert("com.shsxt.mapper.UserMapper.insertByUser",user);
}catch(Exception e){
e.printStackTrace();
}finally{if(session!=null){
session.close();
}
}returna;
}
@OverridepublicInteger insertByUserHasKey(User user) {
SqlSession session=null;
Integer a=null;try{
session=sqlSessionFactory.openSession();
a=session.insert("com.shsxt.mapper.UserMapper.insertByUserHasKey",user);
}catch(Exception e){
e.printStackTrace();
}finally{if(session!=null){
session.commit();
session.close();
}
}returna;
}
@OverridepublicInteger insertByUserHasKey02(User user) {
SqlSession session=null;
Integer a=null;try{
session=sqlSessionFactory.openSession();
a=session.insert("com.shsxt.mapper.UserMapper.insertByUserHasKey02",user);
}catch(Exception e){
e.printStackTrace();
}finally{if(session!=null){
session.commit();
session.close();
}
}returna;
}
@Overridepublic Integer insertByUserBatch(Listlist) {
SqlSession session=null;
Integer a=null;try{
session=sqlSessionFactory.openSession();
a=session.insert("com.shsxt.mapper.UserMapper.insertByUserBatch",list);
}catch(Exception e){
e.printStackTrace();
}finally{if(session!=null){
session.commit();
session.close();
}
}returna;
}
@OverridepublicUser queryUserByMap(Map map) {
SqlSession session=null;
User user=null;try{
session=sqlSessionFactory.openSession();
user=session.selectOne("com.shsxt.mapper.UserMapper.queryUserByMap",map);
}catch(Exception e){
e.printStackTrace();
}finally{if(session!=null){
session.commit();
session.close();
}
}returnuser;
}
@OverridepublicInteger updateUser(User user) {
SqlSession session=null;
Integer a=null;try{
session=sqlSessionFactory.openSession();
a=session.update("com.shsxt.mapper.UserMapper.updateUser",user);
}catch(Exception e){
e.printStackTrace();
}finally{if(session!=null){
session.commit();
session.close();
}
}returna;
}
@OverridepublicInteger updataUserBatch(Integer[] ids) {
SqlSession session=null;
Integer aa=null;try{
session=sqlSessionFactory.openSession();
aa=session.update("com.shsxt.mapper.UserMapper.updataUserBatch",ids);
}catch(Exception e){
e.printStackTrace();
}finally{if(session!=null){
session.commit();
session.close();
}
}returnaa;
}
@OverridepublicInteger deleteUser(Integer id) {
SqlSession session=null;
Integer aa=null;try{
session=sqlSessionFactory.openSession();
aa=session.delete("com.shsxt.mapper.UserMapper.deleteUser",id);
}catch(Exception e){
e.printStackTrace();
}finally{if(session!=null){
session.commit();
session.close();
}
}returnaa;
}
@Overridepublic Integer deleteUserBatch(Listids) {
SqlSession session=null;
Integer aa=null;try{
session=sqlSessionFactory.openSession();
aa=session.update("com.shsxt.mapper.UserMapper.deleteUserBatch",ids);
}catch(Exception e){
e.printStackTrace();
}finally{if(session!=null){
session.commit();
session.close();
}
}returnaa;
}
}
测试单元的代码如下:
packagecom.shsxt;importcom.shsxt.mapper.Impl.UserMapperImpl;importcom.shsxt.mapper.UserMapper;importcom.shsxt.po.User;importorg.apache.ibatis.io.Resources;importorg.apache.ibatis.session.SqlSessionFactory;importorg.apache.ibatis.session.SqlSessionFactoryBuilder;importorg.junit.Before;importorg.junit.Test;importjava.io.IOException;importjava.io.InputStream;importjava.util.ArrayList;importjava.util.HashMap;importjava.util.List;importjava.util.Map;public classTest_mybatis02 {
SqlSessionFactory sqlSessionFactory;
@Beforepublic void ready() throwsIOException {
InputStream inputStream= Resources.getResourceAsStream("mybatis.xml");
sqlSessionFactory=newSqlSessionFactoryBuilder().build(inputStream);
}/** queryById*/@Testpublic voidtest01(){
UserMapper userMapper=newUserMapperImpl(sqlSessionFactory);
User user= userMapper.queryById(1);
System.out.println(user);
}
@Testpublic voidtest02(){
UserMapper userMapper=newUserMapperImpl(sqlSessionFactory);
Integer a=userMapper.queryAll();
System.out.println("总数量是:"+a);
}
@Testpublic voidtest03(){
UserMapper userMapper=newUserMapperImpl(sqlSessionFactory);
String aa= userMapper.queryUname(1);
System.out.println("id为1的uname是:"+aa);
}
@Testpublic voidtest04(){
UserMapper userMapper=newUserMapperImpl(sqlSessionFactory);
User user=newUser();
user.setUser_name("hello");
List lists =userMapper.queryByName(user);for(User per_user :lists) {
System.out.println(per_user);
}
}
@Testpublic voidtest05(){
UserMapper userMapper=newUserMapperImpl(sqlSessionFactory);
Map map= userMapper.queryIdByMap(1);
System.out.println(((Map) map).toString());
}
@Testpublic voidtest06(){
UserMapper userMapper=newUserMapperImpl(sqlSessionFactory);
User user=newUser();
user.setUser_name("ahah");
user.setRealname("papapa");
user.setPassword("89533");
Integer aavv=userMapper.insertByUser(user);
System.out.println(aavv);
}
@Testpublic voidtest07(){
UserMapper userMapper=newUserMapperImpl(sqlSessionFactory);
User user=newUser();
user.setUser_name("ahah");
user.setRealname("papapa");
user.setPassword("89533");
Integer aavv=userMapper.insertByUserHasKey(user);
System.out.println("受影响的行数: "+aavv);
System.out.println("返回的id是: "+user.getId());
}
@Testpublic voidTest08(){
UserMapper userMapper=newUserMapperImpl(sqlSessionFactory);
User user=newUser();
user.setUser_name("ahah");
user.setRealname("papapa");
user.setPassword("89533");
Integer aavv=userMapper.insertByUserHasKey02(user);
System.out.println("受影响的行数: "+aavv);
System.out.println("返回的id是: "+user.getId());
}
@Testpublic voidTest09(){
UserMapper userMapper=newUserMapperImpl(sqlSessionFactory);
List list=new ArrayList<>();for (int i = 0; i <10 ; i++) {
User user=newUser();
user.setUser_name("haha"+i);
user.setPassword("123456"+i);
user.setRealname("hehe"+i);
list.add(user);
}
Integer aavv=userMapper.insertByUserBatch(list);
System.out.println("受影响的行数: "+aavv);
}
@Testpublic voidTest10(){
UserMapper userMapper=newUserMapperImpl(sqlSessionFactory);
Map map=newHashMap();
map.put("id",1);
map.put("username","hello");
User user=userMapper.queryUserByMap(map);
System.out.println(user);
}
@Testpublic voidTest11(){
UserMapper userMapper=newUserMapperImpl(sqlSessionFactory);
User user=newUser();
user.setRealname("laodu");
user.setPassword("888888");
user.setUser_name("liudaye");
user.setId(1);
Integer a=userMapper.updateUser(user);
System.out.println(a);
}
@Testpublic voidTest12(){
UserMapper userMapper=newUserMapperImpl(sqlSessionFactory);
Integer[] aa=new Integer[10];for (int i = 0; i < 10; i++) {
aa[i]=i+10;
}
Integer a=userMapper.updataUserBatch(aa);
System.out.println(a);
}
@Testpublic voidTest13(){
UserMapper userMapper=newUserMapperImpl(sqlSessionFactory);
Integer a= userMapper.deleteUser(22);
System.out.println(a);
}
@Testpublic voidTest14(){
UserMapper userMapper=newUserMapperImpl(sqlSessionFactory);
List list=new ArrayList<>();for (int i = 10; i < 20; i++) {
list.add(i);
}
Integer a=userMapper.deleteUserBatch(list);
System.out.println(a);
}
}
九,sql片段和动态sql
ql 元素用来定义一个可以复用的 SQL 语句段,供其它语句调用,例如
userId, userName, password
from user where userId =#{userId}
Batis 的强大特性之一便是它的动态 SQL。如果你有使用 JDBC 或其他类似框架的经验,你就能体会到根据不同条件拼接 SQL 语句有多么痛苦。拼接的时候要确保不能忘了必要的空格,还要注意省掉列名列表最后的逗号。
利用动态 SQL 这一特性,可以彻底摆脱这种痛苦。它借助 ognl(类似于 jsp 里面的 el 表达式)表达式来完成动态 sql 的拼接使得非常简便。
1,条件判断 使用 if 标签就是加一个 test 属性作为判断, 如果有多个条件组合判断的话用 and, or连接
select * from user where 1=1and username like concat('%',#{username},'%')
测试方法
importcom.shsxt.mapper.UserMapper;importcom.shsxt.po.User;importorg.apache.ibatis.io.Resources;importorg.apache.ibatis.session.SqlSession;importorg.apache.ibatis.session.SqlSessionFactory;importorg.apache.ibatis.session.SqlSessionFactoryBuilder;importorg.junit.Before;importorg.junit.Test;importjava.io.InputStream;importjava.util.List;public classmybaties03_Test {privateUserMapper userMapper;
@Beforepublic void before() throwsException{
InputStream inputStream= Resources.getResourceAsStream("mybatis.xml");
SqlSessionFactory sqlSessionFactory=newSqlSessionFactoryBuilder().build(inputStream);
SqlSession sqlSession=sqlSessionFactory.openSession();
userMapper=sqlSession.getMapper(UserMapper.class);
}
@Testpublic voidtest02(){
List list=userMapper.queryByName("li");for(User user:list) {
System.out.println(user);
}
}
}
2,choose,when,otherwise
我们不想用到所有的条件语句,而只想从中择其一二。针对这种情况,MyBatis 提供了 choose 元素,它有点像 Java 中的 switch 语句
select id,
username
password
from user
测试方法
importcom.shsxt.mapper.UserMapper;importcom.shsxt.po.User;importorg.apache.ibatis.io.Resources;importorg.apache.ibatis.session.SqlSession;importorg.apache.ibatis.session.SqlSessionFactory;importorg.apache.ibatis.session.SqlSessionFactoryBuilder;importorg.junit.Before;importorg.junit.Test;importjava.io.InputStream;importjava.util.List;public classmybaties03_Test {privateUserMapper userMapper;
@Beforepublic void before() throwsException{
InputStream inputStream= Resources.getResourceAsStream("mybatis.xml");
SqlSessionFactory sqlSessionFactory=newSqlSessionFactoryBuilder().build(inputStream);
SqlSession sqlSession=sqlSessionFactory.openSession();
userMapper=sqlSession.getMapper(UserMapper.class);
}
@Testpublic voidtest03(){
List list=userMapper.queryByParams("hello");for(User user:list) {
System.out.println(user);
}
}
}
10,mapper 接口代理方式的 crud 开发
对于 mapper 接口方式开发,需要遵循 mybatis 开发规范,mybatis 框架可以自
动生成 mapper 接口对象。
完成账户表 crud 操作
开发规则:
1. mapper.xml 中 namespace 等于接口类全限定名
2. mapper.java 接口中的方法名必须与 mapper.xml 中 statement id 一致
3. mapper.java 输入参数类型必须与 mapper.xml 中 statement 的
parameterType 参数类型一致
4.mapper.java 中方法的返回值类型必须与 mapper.xml 中对应 statement 返回
值类型一致。
接口名 与映射文件名称 一致(非集成环境)
映射文件与接口处于同一个包中(非集成环境
InputStream inputStream = Resources.getResourceAsStream("mybatis.xml");
SqlSessionFactory sqlSessionFactory=newSqlSessionFactoryBuilder().build(inputStream);
SqlSession sqlSession=sqlSessionFactory.openSession();
userMapper=sqlSession.getMapper(UserMapper.class);
说白了就是我们不需要手动创建实现类了,mybatis的框架会帮我们通过动态代理来创建实现类,我们只需要用接口去接收创建好的实现的对象就可以了.