MyBatis初学及增删改查基本操作
今天学习了MyBatis框架,与hibernate相比,它是一个半封闭的数据库层框架 ,可以直接操作数据库层,而hibernate则是全封闭的数据库层框架 。 半封闭的mybatis可以接触到sql 方便开发人员进行sql调优 。
1.使用 mybatis框架进行开发:
- 打开eclipse,创建Java项目
- 导入两个jar包(需要两个 ,一个是mybatis自己的jar ,一个是 mysql驱动jar)并在Bulid Path中Add JARs.
- 进行配置(配置文件分为两种,sqlmap核心配置文件,mapper映射文件。 有几张表就对应几个 mapper映射文件 )
建立数据库
目录结构
以下关于各部分的详解
1.核心配置文件:SqlMapConfig.xml
<!DOCTYPE configuration
PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
<environments default="devp">
<environment id="devp">
<transactionManager type="JDBC"></transactionManager>
<dataSource type="POOLED">
<property name="driver" value="com.mysql.jdbc.Driver"/>
<property name="url" value="jdbc:mysql://localhost:3306/jiangligong"/>
<property name="username" value="root"/>
<property name="password" value="123"/>
</dataSource>
</environment>
</environments>
<mappers>
<mapper resource="com/neuesoft/mapper/studentMapper.xml"/>
</mappers>
</configuration>
在这个核心配置文件中,
- environments的default属性对应下面多个environment标签中的id值
- environment的id属性是用来给当前连接数据库环境取个名字
- transactionmanager的type 属性值如果为 JDBC,代表当前事务管理交由开发人员自己进行管理,若属性值为managed 代表mybatis把事务管理交给第三方别的应用进行管理
- datasource的type属性是关于数据库连接池的使用。 如果写UNPOOLED代表不需要使用连接池;如果写POOLED代表让mybatis给我们开启数据库连接池作用; 如果值为JNDI,代表数据库连接池功能交给其他应用服务第三方进行管理
- 4个property标签 分别对应 driver url username password 4个属性值
- mapper的resource属性:跟随,映射mapper配置文件所在相对路径地址
2.mapper映射文件
<?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">
<!--namespace属性对应 我们的mapper接口路径 -->
<mapper namespace="com.neuesoft.mapper.studentMapper">
<!--增加一条信息-->
<insert id="addStudent" parameterType="com.neuesoft.pojo.Student">
insert into student (name,age,sno,telephone) values(#{name},#{age},#{sno},#{telephone})
</insert>
<!--增加一条信息并返回主键值-->
<insert id="addStudentBackID" parameterType="com.neuesoft.pojo.Student">
<selectKey keyColumn="sid" keyProperty="sid" order="AFTER" resultType="int">
select LAST_INSERT_ID()
</selectKey>
insert into student (name,age,sno,telephone) values(#{name},#{age},#{sno},#{telephone})
</insert>
<!--增加一条信息并返回主键值-->
<insert id="addStudentBackID2" parameterType="com.neuesoft.pojo.Student" useGeneratedKeys="true" keyProperty="sid">
insert into student (name,age,sno,telephone) values(#{name},#{age},#{sno},#{telephone})
</insert>
<!--按主键值删除一条信息-->
<delete id="deleStudentById" parameterType="int">
delete from student where sid=#{sid}
</delete>
<!--查询表中所有信息-->
<select id="queryAll" resultType="com.neuesoft.pojo.Student">
select * from student
</select>
<!--按主键值查询表中信息-->
<select id="queryById" parameterType="int"
resultType="com.neuesoft.pojo.Student">
select * from student where sid=#{sid}
</select>
<!--按主键值修改信息-->
<update id="updateStudentById" parameterType="com.neuesoft.pojo.Student" >
update student set name=#{name},age=#{age},sno=#{sno},telephone=#{telephone} where sid=#{sid}
</update>
<!--模糊查询表中信息-->
<select id="queryLikeName" resultType="com.neuesoft.pojo.Student" parameterType="String" >
<!-- select * from student where name like #{name} -->
select * from student where name like "%${value}%"
</select>
</mapper>
在mapper映射文件中,
- mapper 的namespace即命名空间属性。该属性值对应当前mapper配置文件,对应的接口的路径地址,包括该接口的包路径+接口名称)
- insert,delete,update,select的
- id属性对应接口中的方法名
- parameterType 对应方法入参类型 (如果是8大基本类型则直接写类型名例如 int,float,String等都可以.如果是一个引用类型的,这种情况下要书写类全路径地址)
- resultType 对应方法返回值类型,其内容值同 parameterType (值得注意的是,无论查询返回的是一条还是多条数据 返回值类型都按照一条记录的类型去书写)
- sql语句写在 insert,delete,update,select 标签之间,如果需要引用,引用类型参数的时候,直接通过#{属性名}进行获取。
- 智能添加单引号,无需开发人员操心sql中的单引号问题
模糊查询的两种方式
方式一:使用#{}占位符,使用该种形式的时候要注意:要在传递的占位符内容中自行传入 %%
方式二:直接拼接sql 使用${} 。使用该种形式 ,直接写入要查询的模糊词条即可
返回刚添加数据记录的主键ID值(前提条件是当前表的主键设置为自增长的)
有两种方式
方式一:与selectkey标签配合使用,查询刚添加数据的主键值。该方式适用绝大多数数据库,甚至一些不带有主键自增功能数据库。
方式二:在insert标签添加useGeneratedKeys=“true” keyProperty=“对应属性名称”。该方式适用于当前表已经设置好主键自增 ,仅限于 sqlServer以及mysql两种带有主键自增功能数据库
mybatis核心对象彼此创建关系:
SqlSessionFactoryBuilder -> SqlSessionFactory -> SqlSession ->mapper对象
SqlSessionFactoryBuilder sessionFactoryBuilder = new SqlSessionFactoryBuilder();
InputStream is=new FileInputStream(new File("SqlMapConfig.xml"));
SqlSessionFactory factory=sessionFactoryBuilder.build(is);
SqlSession session= factory.openSession();
studentMapper smapper= session.getMapper(studentMapper.class);
SQLSessionFactory是线程安全的,建议一个项目中创建一个该对象即可。
每个sqlSession对象是单线程的,sqlSession是线程不安全的,不建议将它设置为全局变量使用。