MyBatis学习笔记

MyBatis
1
.MyBatis是一个优秀的持久层框架,对jdbc的操作数据库的过程进行了封装,使开发者只需要关注SQL本身。
  而不用花费精力去处理例如注册驱动,创建connection,创建statement,手动设置参数,结果集等jdbc繁杂的过程。
2.MyBatis配置:
  SQLMapConfig.xml  全局配置文件,配置了mybatis的运行环境等信息。
  mapper.xml sql映射文件,配置了操作数据库的sql语句。需要在SqlMapConfig.xml里边加载。

3.需要的jar包

MyBatis学习笔记_第1张图片

4.配置文件:放在config目录下
    log4j.properties(日志文件)

# Global logging configuration
		log4j.rootLogger=DEBUG, stdout
		# Console output...
		log4j.appender.stdout=org.apache.log4j.ConsoleAppender
		log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
		log4j.appender.stdout.layout.ConversionPattern=%5p [%t] - %m%n
	


SqlMapConfig.xml

		
		
			
			
				
			
			
				
					
					
						
						
						
						
					
					
				
			
			
			
			
			
				
				
				
			


			



一、第一种方式

5.SQL映射文件:
在config下的sqlmap目录下创建sql映射文件User.xml:

		
		
		
		




6.加载映射文件
将User.xml添加在SqlMapConfig.xml

		 
	


7.在User.xml里边添加 ‘增删改查’ 操作

			
			
			
			
			
			
			
			
			
			
				select LAST_INSERT_ID()
			
			insert into `user` (username ,birthday,sex ,address) VALUES (#{username},#{birthday},#{sex},#{address});
			
			
			
			
				update user set address = #{address} where id = #{id}
			
			
			
			
				delete from user where id = #{id}
			
		


8.测试程序
public class MybatisTest {
			SqlSessionFactory sessionFactory = null;
			@Before
			public  void init() {
				// TODO Auto-generated method stub
				try {
					SqlSessionFactoryBuilder sessionFactoryBuilder = new SqlSessionFactoryBuilder();
					InputStream inputStream = Resources.getResourceAsStream("SqlMapConfig.xml");//加载配置文件
					sessionFactory = sessionFactoryBuilder.build(inputStream);
				} catch (IOException e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				}	
			}
			@Test
			public void testQueryUserById() throws Exception {	 
				
				SqlSession session = sessionFactory.openSession(); 
				User user = session.selectOne("queryUserById", 1);  //selectOne返回一个查询结果
				System.out.println(user);
				session.close();


			}
			
			@Test
			public void testQueryUserByName2() {
				SqlSession session = sessionFactory.openSession();
				List list = session.selectList("queryUserByName2", "王五"); //selectList是返回一个列表
				for (User user : list) {
					System.out.println(user);
				}
				session.close();
			}
			@Test
			public void insetUser() {
				// TODO Auto-generated method stub
				SqlSession sqlSession = sessionFactory.openSession();
				User user = new User("赵小虎",new Date(),'2',"蜀国");
				sqlSession.insert("insetUser",user);
				sqlSession.commit();
				System.out.println(user);
				sqlSession.close();
			}
			@Test
			public  void updateUserById() {
				// TODO Auto-generated method stub
				SqlSession sqlSession = sessionFactory.openSession();
				User user = new User();
				user.setId(26);
				user.setAddress("刘家窑");
				sqlSession.update("updateUserById", user);
				sqlSession.commit();
				sqlSession.close();
			}
			
			@Test
			public void deleteUserById() {
				// TODO Auto-generated method stub
				SqlSession sqlSession = sessionFactory.openSession();
				sqlSession.delete("deleteUserById",31);
				sqlSession.commit();
				sqlSession.close();
			}
		}



第二种方式


9.Mapper动态代理方式
Mapper接口开发方法只需要程序员编写Mapper接口
规范:
1、Mapper.xml文件中的namespace与mapper接口的类路径相同。
2、Mapper接口方法名和Mapper.xml中定义的每个statement的id相同 
3、Mapper接口方法的输入参数类型和mapper.xml中定义的每个sql 的parameterType的类型相同
4、Mapper接口方法的输出参数类型和mapper.xml中定义的每个sql的resultType的类型相同

10.在src下创建mapper包,将userMapper.xml 和 (接口)UserMapper.java 放在一起。

    UserMapper.xml


		
		
		
		
		
			
		


UserMapper.java
public interface UserMapper {
			List queryUserByQueryVo(QueryVo queryVo);
		}


11.配置SqlMapConfig.xml

			
		


12.mapper测试类
public class userMapperTest {
			private SqlSessionFactory sqlSessionFactory = null;
			@Before
			public void init() {
				// TODO Auto-generated method stub
				SqlSessionFactoryBuilder builder = new SqlSessionFactoryBuilder();
				InputStream inputStream;
				try {
					inputStream = Resources.getResourceAsStream("SqlMapConfig.xml");
					sqlSessionFactory = builder.build(inputStream);
				} catch (IOException e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				}
				
			}
			@Test
			public  void queryUserByQueryVo() {
				// TODO Auto-generated method stub
				SqlSession sqlSession = sqlSessionFactory.openSession();
				UserMapper mapper = sqlSession.getMapper(UserMapper.class);
				QueryVo queryVo = new QueryVo();
				User user = new User();
				user.setUsername("刘");
				queryVo.setUser(user);
				 List list = mapper.queryUserByQueryVo(queryVo);
				 for (User user2 : list) {
					System.out.println(user2);
				}
				 sqlSession.close();
			}
			
		}



13.自定义别名

		
		
		
		
		
	




14.resultMap
resultType可以指定将查询结果映射为pojo,但需要pojo的属性名和sql查询的列名一致方可映射成功。
如果sql查询字段名和pojo的属性名不一致,可以通过resultMap将字段名和属性名作一个对应关系 ,
resultMap实质上还需要将查询结果映射到pojo对象中。

			
			
			
			
			
				
		


15.动态sql
maper.xml:




16.Sql片段
   Sql中可将重复的sql提取出来,使用时用include引用即可,最终达到sql重用的目的。
   

	
		id, username, birthday, sex, address
	
	
	
	



17.foreach标签
向sql传递数组或List,mybatis使用foreach解析



18.关联查询
两个表联合查询
(1)使用resultType  创建一个新的pojo,属性为需要查询的结果属性。
(2)使用resultType  在 Order 类中加入 User属性(将整个User类当做一个属性)

			
			
			
			
			


			
			
			
			
				
				
				
				
			


		

你可能感兴趣的:(java)