一、为什么要使用mybatis框架?
在之前我们使用传统的jdbc操作方式对数据库进行增删改查。
比如进行user表查询:
//使用jdbc访问数据库 public class Demo{ public static void main(String[] args) throws SQLException, ClassNotFoundException { //1.注册驱动 DriverManager.registerDriver(new Driver()); Class.forName("com.mysql.jdbc.Driver"); //2.创建连接 三种方式 //url是数据库的路径 //Connection connection = DriverManager.getConnection("jdbc:mysql://localhost:3306/db2", "root", "123"); //Properties properties = new Properties(); //properties.setProperty("user", "root"); //properties.setProperty("password", "123"); //Connection connection = DriverManager.getConnection("jdbc:mysql://localhost:3306/db2", properties); Connection connection = DriverManager.getConnection("jdbc:mysql://localhost:3306/db2?user=root&password=123"); //3.创建小车,并关联sql语句 Statement statement = connection.createStatement(); //3.1关联sql语句 /*String sql = "select * from student1"; //执行executerQuary方法,实现到数据库获取数据并存储到ResultSet对象里 ResultSet set = statement.executeQuery(sql);//只适合查;增删改使用executeUpdate,增删改不用箱子 //4.卸货(ResultSet) while (set.next()) {//执行一次,取一条记录出来 //Object object = set.getObject(2); Object object = set.getObject("name"); System.out.println(object); }*/ String sql = "select * from user"; //返回的值到ResultSet中 ResultSet rSet = statement.executeUpdate(sql); while(rSet.next()){ Object object = rSet.getObject("name");//此处只取名字 } //5.关闭资源 rSet.close(); statement.close(); connection.close(); } }
上述代码中我们可以看出:
1.仅仅是执行一个简单的查询工作我们就需要写如此多的代码,这就使得程序员在编写代码的时候不仅仅需要关注业务需求了,还要记住这些繁杂的链接数据库的操作;(使用工具类如DButil,jdbcTemplate)
2.并且上述代码存在大量的硬编码。 如:我需要查找另外一个数据库的数据,则需要在源代码中来修改数据库(配合资源配置文件可以解决)
总结:所以使用mybatis框架可以解决这些问题
二、Mybatis的配置与简单使用:
mybatis的概述
mybatis是一个持久层框架,用java编写
它封装了jdbc的很多操作细节,使开发者只需要关注sql语句本身,而无需关注注册驱动,创建连接等繁杂过程
它使用了ORM思想实现了结果集的封装
ORM:
obejct relational mapping 对象关系映射
简单的说:
就是把数据库的实体类及实体类的属性对应起来
让我们可以操作实体类就实现操作数据库
mybatis的入门
mybatis的环境搭建
第一步:创建maven工程并导入坐标
第二步:创建实体类和dao接口
第三步:创建Mybatis的主配置文件SqlMapConfig.xml
第四步:创建映射配置文件IUserDao.xml
注意事项:
1.mybatis的映射配置文件位置必须和dao接口的包结构相同
2.映射配置文件的mapper标签namespace属性取值必须是dao接口的全限定类名
3.映射配置文件的操作配置,id属性必须是接口中的方法名
优点:在开发中无需写dao接口的实现类
mybatis框架实现增和查:
1 public interface IUserDao { 2 List<User> findAll(); 3 void insertUser(User user); 4 }
1 <?xml version="1.0" encoding="UTF-8"?> 2 <!DOCTYPE mapper 3 PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" 4 "http://mybatis.org/dtd/mybatis-3-mapper.dtd"> 5 <mapper namespace="com.swpu.dao.IUserDao"> 6 <select id="findAll" resultType="com.swpu.domain.User"> 7 select * from user; 8 </select> 9 10 <insert id="insertUser" parameterType="com.swpu.domain.User"> 11 insert into user(username,address,sex,birthday) values (#{username},#{address},#{sex},#{birthday}); 12 </insert> 13 </mapper>
1 <?xml version="1.0" encoding="UTF-8"?> 2 <!DOCTYPE configuration 3 PUBLIC "-//mybatis.org//DTD Config 3.0//EN" 4 "http://mybatis.org/dtd/mybatis-3-config.dtd"> 5 <configuration> 6 <environments default="mysql"> 7 <!--mysql的环境配置--> 8 <environment id="mysql"> 9 <transactionManager type="JDBC"/> 10 <dataSource type="POOLED"> 11 <property name="driver" value="com.mysql.jdbc.Driver"/> 12 <property name="url" value="jdbc:mysql://localhost:3306/mybatis"/> 13 <property name="username" value="root"/> 14 <property name="password" value="123"/> 15 </dataSource> 16 </environment> 17 </environments> 18 19 <mappers> 20 <mapper resource="com/swpu/dao/IUserDao.xml"/> 21 </mappers> 22 </configuration>
1 public class User implements Serializable { 2 3 private int id; 4 private String username; 5 private String address; 6 private String sex; 7 private Date birthday; 8 9 public int getId() { 10 return id; 11 } 12 13 public void setId(int id) { 14 this.id = id; 15 } 16 17 public String getUsername() { 18 return username; 19 } 20 21 public void setUsername(String username) { 22 this.username = username; 23 } 24 25 public String getAddress() { 26 return address; 27 } 28 29 public void setAddress(String address) { 30 this.address = address; 31 } 32 33 public String getSex() { 34 return sex; 35 } 36 37 public void setSex(String sex) { 38 this.sex = sex; 39 } 40 41 public Date getBirthday() { 42 return birthday; 43 } 44 45 public void setBirthday(Date birthday) { 46 this.birthday = birthday; 47 } 48 49 @Override 50 public String toString() { 51 return "User{" + 52 "id=" + id + 53 ", username='" + username + '\'' + 54 ", address='" + address + '\'' + 55 ", sex='" + sex + '\'' + 56 ", birthday=" + birthday + 57 '}'; 58 } 59 }
测试代码:
1 public class MybatisTest { 2 private InputStream in; 3 private SqlSession sqlSession; 4 private IUserDao userDao; 5 6 @Before//测试代码前执行 7 public void init()throws Exception{ 8 //1.读取配置文件,生成字节输入流 9 in = Resources.getResourceAsStream("SqlMapConfig.xml"); 10 SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(in); 11 sqlSession = factory.openSession(); 12 userDao = sqlSession.getMapper(IUserDao.class); 13 } 14 15 @After//测试代码后执行 16 public void destory() throws Exception{ 17 sqlSession.commit();//一定要手动提交事务 18 sqlSession.close(); 19 in.close(); 20 } 21 22 //查询所有 23 @Test 24 public void findAll(){ 25 List<User> users = userDao.findAll(); 26 for(User user : users){ 27 System.out.println(user); 28 } 29 } 30 31 //增加 32 @Test 33 public void testSave(){ 34 User user = new User(); 35 user.setUsername("你好comadin"); 36 user.setAddress("西南石油大学"); 37 user.setSex("男"); 38 user.setBirthday(new Date()); 39 40 userDao.insertUser(user); 41 } 42 }
查询结果:
增加结果: