Mybatis之增删改查

MyBatis为JAVA的一种持久层框架(或者说是ORM框架),另一种ORM框架为Hibernate;说是MyBatis是半自动化的ORM框架,Hibernate是全自动的ORM框架。刚开始先用起来,理论先别管太多。

该教程参考自:一号门MyBatis从入门到精通

http://limingnihao.iteye.com/blog/781671

http://blog.csdn.net/chris_mao/article/details/48803545

需要添加的JAR包:
mybatis-3.4.1.jar(下载地址:https://github.com/mybatis/mybatis-3/releases
mysql-connector-java-5.1.40-bin.jar(这里用的MySQL数据库)

1. 用户表:sys_user1;

CREATE TABLE `sys_user1` (
  `id` INT(11) PRIMARY KEY AUTO_INCREMENT,
  `userName` VARCHAR(50),
  `birthday` DATE,
  `salary` DECIMAL(8,2),
  `address` VARCHAR(200)
) ENGINE=INNODB CHARSET=utf8;
INSERT INTO `sys_user1` VALUES(1, '陈三', '1992-02-29', 123456.78, '深圳市南山区');
INSERT INTO `sys_user1` VALUES(2, '张三', '1990-03-05', 8500, '深圳市宝安区');
INSERT INTO `sys_user1` VALUES(3, '李三', '1991-05-23', 123326.1, '深圳市福田区');
INSERT INTO `sys_user1` VALUES(4, '赵四', '1988-09-15', 8000, '深圳市龙华新区');

2. 实体类:SysUser1

public class SysUser1 {
	private int id;
	private String userName;
	private Date birthday;
	private Double salary;
	private String address;
	
	public String toString(){
		return "SysUser1 : {id = " + id + ", userName = " + userName + ", birthday = " + birthday + ", salary = " + salary + ", address = " + address + "}";
	}
	
	//省略属性的setter、getter方法
}
3. 实体类SysUser1的映射文件SysUser1.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">

<!-- namespace用于区分对应哪个实体类对应的配置文件,须对应typeAlias的alias -->
<mapper namespace="com.chensan.sys.entity.SysUser1">
  <!-- 新增用户 -->
  <insert id="insert" parameterType="sys_user1" useGeneratedKeys="true" keyProperty="id">
    insert into `sys_user1`(userName, birthday, salary, address) 
    values(#{userName}, #{birthday}, #{salary}, #{address})
  </insert>

  <!-- 删除用户 -->
  <delete id="delete" parameterType="int">
    delete from `sys_user1` where id=#{id}
  </delete>
  
  <!-- 根据id修改用户信息 -->
  <update id="update" parameterType="sys_user1">
    update `sys_user1` set userName=#{userName} 
    where id=#{id}
  </update>
  
  <!-- 根据id查询单条用户记录 -->
  <select id="getById" parameterType="int" resultType="sys_user1">
    select * from `sys_user1` where id = #{id}
  </select>
  
  <!-- 根据其它字段查询用户列表 -->
  <select id="getByName" parameterType="java.lang.String" resultType="sys_user1">
    select * from `sys_user1` where userName like '%${value}%'
  </select>
  
  <!-- 查询所有用户记录 -->
  <select id="getAll" resultType="sys_user1">
    select * from `sys_user1`
  </select>
</mapper>

4. myBatis配置文件myBatisConfig.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>
  <!-- 为实体类配置别名,方便在类的配置文件里直接取用 -->
  <typeAliases>
    <typeAlias alias="sys_user1" type="com.chensan.sys.entity.SysUser1"/>
  </typeAliases>
  
  <!-- 和spring整合后 environments配置将废除-->
  <environments default="development">
	<environment id="development">
	  <!-- 使用jdbc事务管理  或者JTA事务管理-->
	  <transactionManager type="JDBC" />
	  <!-- 数据库连接池  第三方组件:c3p0-->
	  <dataSource type="POOLED">
		<property name="driver" value="com.mysql.jdbc.Driver"/>
        <property name="url" value="jdbc:mysql://localhost:3306/test1"/>
        <property name="username" value="root"/>
        <property name="password" value="123456"/>
	  </dataSource>
	</environment>
  </environments>

  <!-- 加载实体类的映射文件 -->
  <mappers>
    <mapper resource="com/chensan/sys/mapper/SysUser1.xml"/>
  </mappers>
</configuration>

5. 测试类MyBatisSysUser1Test

public class MyBatisSysUser1Test {
	private static SqlSessionFactory sqlSessionFactory;
    private static Reader resource;
    
    //创建会话工厂
    static{
        try{
        	//读取MyBatis配置文件
        	resource = Resources.getResourceAsReader("myBatisConfig.xml");
        	//创建SqlSessionFactory会话工厂
            sqlSessionFactory = new SqlSessionFactoryBuilder().build(resource);
        }catch(Exception e){
            e.printStackTrace();
        }
    }
    
    public static SqlSessionFactory getSession(){
        return sqlSessionFactory;
    }
    
    //插入一条数据
    public void insert(){
    	SqlSession sqlSession = sqlSessionFactory.openSession();
    	SysUser1 sysUser1 = new SysUser1();
    	sysUser1.setUserName("王二");
    	DateFormat df = new SimpleDateFormat("yyyy-MM-dd");
    	try {
    		sysUser1.setBirthday(df.parse("1988-08-23"));
    	} catch (ParseException e) {
    	    e.printStackTrace();
    	}
    	sysUser1.setSalary(7800.00);
    	sysUser1.setAddress("深圳市罗湖区");
    	sqlSession.insert("com.chensan.sys.entity.SysUser1.insert", sysUser1);
    	sqlSession.commit();//新增、修改、删除需要提交
    	sqlSession.close();
    	System.out.println(sysUser1);
    }
    
    //删除一条记录
    public void delete(){
    	SqlSession sqlSession = sqlSessionFactory.openSession();
    	sqlSession.delete("com.chensan.sys.entity.SysUser1.delete", 4);
    	sqlSession.commit();
    	sqlSession.close();
    }
    
    //更新用户记录
    public void update(){
    	SqlSession sqlSession = sqlSessionFactory.openSession();
    	SysUser1 sysUser1 = new SysUser1();
    	sysUser1.setId(5);
    	sysUser1.setUserName("王二小");
    	sqlSession.update("com.chensan.sys.entity.SysUser1.update", sysUser1);
    	sqlSession.commit();
    	sqlSession.close();
    	System.out.println(sysUser1);
    }
    
    public void getById(){
    	//开启会话实例sqlSession
    	SqlSession sqlSession = sqlSessionFactory.openSession();
    	SysUser1 sysUser1 = sqlSession.selectOne("com.chensan.sys.entity.SysUser1.getById",1);
    	sqlSession.close();//关闭会话
    	System.out.println(sysUser1);
    }
    
    //根据其它字段查询记录
    public void getByName(){
    	SqlSession sqlSession = sqlSessionFactory.openSession();
    	List<SysUser1> sysUser1 = sqlSession.selectList("com.chensan.sys.entity.SysUser1.getByName","三");
    	sqlSession.close();
    	for(SysUser1 user : sysUser1){
    		System.out.println(user);
    	}
    }
    
    //查询所有用户记录
    public void getAll(){
    	SqlSession sqlSession = sqlSessionFactory.openSession();
    	List<SysUser1> sysUser1 = sqlSession.selectList("com.chensan.sys.entity.SysUser1.getAll");
    	sqlSession.close();
    	for(SysUser1 user : sysUser1){
    		System.out.println(user);
    	}
    }
    
    public static void main(String[] args) {
    	MyBatisSysUser1Test myBatisSysUser1Test = new MyBatisSysUser1Test();
    	//myBatisSysUser1Test.insert();
    	//myBatisSysUser1Test.delete();
    	//myBatisSysUser1Test.update();
    	//myBatisSysUser1Test.getById();
    	//myBatisSysUser1Test.getByName();
    	myBatisSysUser1Test.getAll();
    } 
}
注意点:

1)mapper元素的namespace属性,用来区分映射对应的实体类,绑定Dao接口,即面向接口编程。可用全限定名,直接找对对应的操作实体;也可用唯一名称标识来表示,在工程中唯一即可。

2)#{} 是一个占位符,通过#{}可实现preparedStatement向占位符中设置值,自动进行java类型和jdbc类型转换,#{}可以有效防止注入。#{}可以接收简单类型值或者pojo属性值。
${}表示拼接sql串,通过${}可以将preparedStatement传入的内容拼接在sql中,且不进行jdbc类型转换,${}可以接收简单类型值或者pojo属性值,如果parameterType传输单个简单类型,${}括号中只能是value。

3)在类映射文件的insert操作中属性useGeneratedKeys(默认为false)允许 JDBC 支持自动生成主键,必须驱动兼容(如:MySQL和SQLServer;Oracle只能依赖于sequence来实现自增长不支持该属性)。在useGeneratedKeys="true"时,keyProperty必须绑定主键对应的字段;(不过即使不用useGeneratedKeys="true",MySQL5.6只要在数据表中设置了auto_increment,仍能实现自增长,只是这个自增长是数据库自身的,而useGeneratedKeys是使用jdbc的getGenereatedKeys方法获取主键并赋值到keyProperty设置的属性)。在插入时,如果不同时设置useGeneratedKeys="true"和keyProperty属性,返回的插入数据SysUser1 : {id = 0, userName = 王二, birthday = Tue Aug 23 00:00:00 CDT 1988, salary = 7800.0, address = 深圳市罗湖区} 的id=0;因为这时的主键并不是由jdbc去生成,而此时的数据也仅是当前操作的对象,并非从数据库获取。

4)在MyBatis的配置文件myBatisConfig.xml中,typeAliases中加上typeAliase可对实体取别名,在实体的映射文件中parameterType或者resultType就可直接使用该实体类的别名;当然如果实体类映射中使用resultMap(设置实体类属性和数据表字段对应关系)后,resultMap的id属性即相当于实体类的别名,在该映射文件的parameterType和resultType中也可直接使用该简写(只作用于本映射文件内)。

还有批量新增、批量删除的例子没写;
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值