Mybatis的学习1____使用idea和mybatis编写第一个程序
1.什么是Mybatis?
1)Mybatis是一个半ORM(对象关系映射)框架,它内部封装了JDBC,开发时只需要关注SQL语句本身,不需要花费精力去处理加载驱动、创建连接、创建statement等繁杂的过程。程序员直接编写原生态sql,可以严格控制sql执行性能,灵活度高。
(2)MyBatis 可以使用 XML 或注解来配置和映射原生信息,将 POJO映射成数据库中的记录,避免了几乎所有的 JDBC 代码和手动设置参数以及获取结果集。
(3)通过xml 文件或注解的方式将要执行的各种 statement 配置起来,并通过java对象和 statement中sql的动态参数进行映射生成最终执行的sql语句,最后由mybatis框架执行sql并将结果映射为java对象并返回。(从执行sql到返回result的过程)。
MyBatis 是一款优秀的持久层框架,它支持定制化 SQL、存储过程以及高级映射。MyBatis 避免了几乎所有的 JDBC 代码和手动设置参数以及获取结果集。MyBatis 可以使用简单的 XML 或注解来配置和映射原生类型、接口和 Java 的 POJO(Plain Old Java Objects,普通老式 Java 对象)为数据库中的记录。
2.什么是持久层?
持久是相对于瞬时来说的, 持久层,可以理解成数据 保存在 数据库或者 硬盘一类可以保存很长时间的设备里面,不像放在内存中那样断电就消失了,也就是把数据存在持久化设备上 ,你想一下 内存中的数据 断电就没有了,硬盘的数据 是否会像内存中的数据一样断电消失么?当然不会。
3.Mybatis的缺点:
(1)SQL语句的编写工作量较大,尤其当字段多、关联表多时,对开发人员编写SQL语句的功底有一定要求。
(2)SQL语句依赖于数据库,导致数据库移植性差,不能随意更换数据库。
4.Mybatis和Hibernate区别:
(1)Mybatis和hibernate不同,它不完全是一个ORM(对象关系映射)框架,因为MyBatis需要程序员自己编写Sql语句。
(2)Mybatis直接编写原生态sql,可以严格控制sql执行性能,灵活度高,非常适合对关系数据模型要求不高的软件开发,因为这类软件需求变化频繁,一但需求变化要求迅速输出成果。但是灵活的前提是mybatis无法做到数据库无关性,如果需要实现支持多种数据库的软件,则需要自定义多套sql映射文件,工作量大。
(3)Hibernate对象/关系映射(ORM)能力强,数据库无关性好,对于关系模型要求高的软件,如果用hibernate开发可以节省很多代码,提高效率。
5.#{} ,${} 的区别:
#{} :预编译处理,相当于PreparedStatement中的占位符。
${}:字符串替换,会替换成变量的值。
#{}可以有效的解决SQL注入的问题。
===============================================================================================================
第一个Mybatis程序的编写:
1.搭建数据库实验环境:
CREATE DATABASE /*!32312 IF NOT EXISTS*/`mybatis` /*!40100 DEFAULT CHARACTER SET utf8 */; USE `mybatis`; DROP TABLE IF EXISTS `user`; CREATE TABLE `user` ( `id` INT(20) NOT NULL, `name` VARCHAR(30) DEFAULT NULL, `pwd` VARCHAR(30) DEFAULT NULL, PRIMARY KEY (`id`) ) ENGINE=INNODB DEFAULT CHARSET=utf8; INSERT INTO `user`(`id`,`name`,`pwd`) VALUES (1,'狂神','123456'),(2,'张三','abcdef'),(3,'李四','987654');
2.创建一个普通的maven项目:
pom.xml:
<?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <groupId>com.kuang</groupId> <artifactId>ssm-mybatis-study</artifactId> <version>1.0-SNAPSHOT</version> <dependencies> <!--单元测试--> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>4.11</version> </dependency> <!--mybatis的包--> <dependency> <groupId>org.mybatis</groupId> <artifactId>mybatis</artifactId> <version>8.0.16</version> </dependency> <!--连接数据库的驱动包--> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <version>5.1.47</version> </dependency> </dependencies> <build> <!--希望maven在导出项目的时候,能够将我们的配置及资源导出--> <resources> <resource> <directory>src/main/java</directory> <includes> <include>**/*.properties</include> <include>**/*.xml</include> </includes> <filtering>false</filtering> </resource> <resource> <directory>src/main/resources</directory> <includes> <include>**/*.properties</include> <include>**/*.xml</include> </includes> <filtering>false</filtering> </resource> </resources> </build> </project>
3.代码的编写:
3.1 pojo 实体类的编写:
public class User { private int id; private String name; private String pwd; public User() { } public User(int id, String name, String pwd) { this.id = id; this.name = name; this.pwd = pwd; } public int getId() { return id; } public void setId(int id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } public String getPwd() { return pwd; } public void setPwd(String pwd) { this.pwd = pwd; } @Override public String toString() { return "User{" + "id=" + id + ", name='" + name + '\'' + ", pwd='" + pwd + '\'' + '}'; } }
3.2Dao层接口 UserMapper的编写:
public interface UserMapper { //获取所有的User List<User> getUser(); }
3.3Dao层userMapper.xml配置文件的编写:
<?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd"> <!--mapper中的namespace 标签:对应mapper接口的类--> <mapper namespace="com.xbf.dao.UserMapper"> <!--select标签对应执行sql的查询语句 id对应映射接口中的方法的名字 --> <!--属性: resultType:返回结果的类型--> <!--select标签的中间部分,写sql语句--> <select id="selectUser" resultType="com.xbf.pojo.User"> select * from user </select> <!--增加用户--> <insert id="addUser" parameterType="com.xbf.pojo.User"> insert into user (id,name,pwd) values (#{id},#{name},#{pwd}) </insert> <!--删除user 通过id删--> <delete id="deleteUserById"> delete from user where id=#{id} </delete> <!--改--> <update id="modify" parameterType="com.xbf.pojo.User"> update user set pwd=#{pwd},name=#{name} where id=#{id} </update> <!--查--> <select id="getUserById" resultType="com.xbf.pojo.User"> select * from user where id=#{id} </select> </mapper>
3.4在src/resources 下的database.properties的编写:
driver=com.mysql.cj.jdbc.Driver
url=jdbc:mysql://localhost:3306/mybatis?serverTimezone=UTC
username=root
password=1234567890
在src/resources 下的mybatis-config.xml的编写:
<?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Config 3.0//EN" "http://mybatis.org/dtd/mybatis-3-config.dtd"> <configuration> <properties resource="database.properties"/> <!--配置环境 这里可以有多套环境 default是代表默认的那一套环境--> <environments default="development"> <!--环境的id 即环境的名字--> <environment id="development"> <!--transactionManager 事务管理,type:JDBC--> <transactionManager type="JDBC"></transactionManager> <!--dataSource:数据源--> <dataSource type="POOLED"> <!--xml中 不允许使用 ? 得用 & 替换--> <property name="driver" value="${driver}"></property> <property name="url" value="${url}"/> <property name="username" value="${username}"/> <property name="password" value="${password}"/> </dataSource> </environment> </environments> <!--关联映射文件--> <mappers> <mapper resource="com/xbf/dao/userMapper.xml"/> </mappers> </configuration>
4.工具类(主要为了获取SqlSessionFactory)
//目的为了获得SqlSessionFactory public class MybatisUtils { private static SqlSessionFactory sqlSessionFactory; static { try { //在maven中所有的资源文件都在resources下,我们一般可以直接拿到 String resource = "mybatis-config.xml"; InputStream inputStream = Resources.getResourceAsStream(resource); sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream); } catch (IOException e) { e.printStackTrace(); } } public static SqlSessionFactory getSqlSessionFactory() { return sqlSessionFactory; } }
5.测试类的编写:
public class UserMapperTest { @Test //获取user public void testSelectUser(){ //1.拿到sqlSessionFactory对象 SqlSessionFactory sqlSessionFactory= MybatisUtils.getSqlSessionFactory(); //2.通过sqlSessionFactory对象 openSession() 创建一个sqlSession SqlSession sqlSession = sqlSessionFactory.openSession(); //3.通过sqlSession 获得mapper对象,参数为映射文件中对应的接口类的class对象 UserMapper mapper = sqlSession.getMapper(UserMapper.class); //4.通过mapper对象来执行操作 List<User> users = mapper.selectUser(); //关闭资源 sqlSession.close(); //输出结果 System.out.println(users); } @Test //增 public void addTest(){ User user=new User("4","张三","250"); SqlSession sqlSession = MybatisUtils.getSqlSessionFactory().openSession(); UserMapper mapper = sqlSession.getMapper(UserMapper.class); mapper.addUser(user); //提交事务 sqlSession.commit(); //关闭资源 sqlSession.close(); } @Test //删 public void deleteTest(){ SqlSession sqlSession = MybatisUtils.getSqlSessionFactory().openSession(); UserMapper mapper = sqlSession.getMapper(UserMapper.class); mapper.deleteUserById(4); //提交事务 sqlSession.commit(); sqlSession.close(); } //改 @Test public void midifyTest(){ User u=new User("2","沙雕","250"); SqlSession sqlSession = MybatisUtils.getSqlSessionFactory().openSession(); UserMapper mapper = sqlSession.getMapper(UserMapper.class); mapper.modify(u); sqlSession.commit(); sqlSession.close(); } //查 @Test public void selectTest(){ SqlSession sqlSession = MybatisUtils.getSqlSessionFactory().openSession(); UserMapper mapper = sqlSession.getMapper(UserMapper.class); User u = mapper.getUserById(2); System.out.println(u); } }
项目结构:
测试结果:
[User{id=1, name='狂神', pwd='123456'}, User{id=2, name='沙雕', pwd='250'}, User{id=3, name='李四', pwd='987654'}, User{id= 4, name='张三', pwd='250'}]
(增删改查的注意事项:)
1.事务:
增删改需要进行事物的提交。
增删改需要进行事物的提交。
增删改需要进行事物的提交。
2.参数问题:
如果是基本类型可以省略不写,而引用类型必须是: 包名+类名。