Mybatis笔记2
程序员文章站
2023-11-12 08:46:10
使用Mybatis完成的CRUD操作 个人总结的一些小规律 学习过程中碰到的错误: 虽然报错信息提示的 很明显是sql语法报错,不过我一时之间没有没有看出sql语句错在哪里,后来才发现是插入sql语句的括号写错了,不是小括号,而是大括号 JavaBean类 dao层 配置文件 测试类 typeAli ......
使用mybatis完成的crud操作
个人总结的一些小规律
学习过程中碰到的错误:
org.apache.ibatis.exceptions.persistenceexception: ### error updating database. cause: com.mysql.jdbc.exceptions.jdbc4.mysqlsyntaxerrorexception: you have an error in your sql syntax; check the manual that corresponds to your mysql server version for the right syntax to use near '' at line 1
虽然报错信息提示的 很明显是sql语法报错,不过我一时之间没有没有看出sql语句错在哪里,后来才发现是插入sql语句的括号写错了,不是小括号,而是大括号
错误写法:insert into user(username,address,sex,birthday)value(#(username),#(address),#(sex),#(birthday); 正确写法:insert into user(username,address,sex,birthday)value(#{username},#{address},#{sex},#{birthday});
javabean类
package com.itheima.domain; import java.io.serializable; import java.util.date; public class user implements serializable { private integer id; private string username; private string address; private string sex; private date birthday; public integer getid() { return id; } public void setid(integer id) { this.id = id; } public string getusername() { return username; } public void setusername(string username) { this.username = username; } public string getaddress() { return address; } public void setaddress(string address) { this.address = address; } public string getsex() { return sex; } public void setsex(string sex) { this.sex = sex; } public date getbirthday() { return birthday; } public void setbirthday(date birthday) { this.birthday = birthday; } @override public string tostring() { return "user{" + "id=" + id + ", username='" + username + '\'' + ", address='" + address + '\'' + ", sex='" + sex + '\'' + ", birthday=" + birthday + '}'; } }
dao层
package com.itheima.dao; import com.itheima.domain.user; import java.util.list; public interface iuserdao { //查询所有用户 list<user> findall(); //保存用户 void saveuser(user user); //更新用户 void updateuser(user user); //根据id删除用户 void deleteuser(integer userid); //查询一个,根据id查询用户信息 user findbyid(integer userid); //根据名称模糊查询用户信息 list<user> findbyname(string username); //查询总用户数 int findtotal(); }
配置文件
<?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="com.itheima.dao.iuserdao"> <!--查询所有用户--> <select id="findall" resulttype="com.itheima.domain.user"> select * from user; </select> <!--保存用户--> <insert id="saveuser" parametertype="com.itheima.domain.user"> <selectkey keyproperty="id" keycolumn="id" resulttype="int" order="after"> select last_insert_id(); </selectkey> insert into user(username,address,sex,birthday)value(#{username},#{address},#{sex},#{birthday}); </insert> <!--更新用户--> <update id="updateuser" parametertype="com.itheima.domain.user"> update user set username=#{username},address=#{address},sex=#{sex},birthday=#{birthday} where id=#{id} </update> <!--删除用户--> <delete id="deleteuser" parametertype="integer"> delete from user where id=#{id} </delete> <!--根据id查询用户--> <select id="findbyid" parametertype="integer" resulttype="com.itheima.domain.user"> select * from user where id = #{uid} </select> <!--根据名称模糊查询--> <select id="findbyname" parametertype="string" resulttype="com.itheima.domain.user"> select * from user where username like #{name} </select> <select id="findtotal" resulttype="int"> select count(id) from user; </select> </mapper>
测试类
package com.itheima.test; import com.itheima.dao.iuserdao; import com.itheima.domain.user; import org.apache.ibatis.io.resources; import org.apache.ibatis.session.sqlsession; import org.apache.ibatis.session.sqlsessionfactory; import org.apache.ibatis.session.sqlsessionfactorybuilder; import org.junit.after; import org.junit.before; import org.junit.test; import java.io.ioexception; import java.io.inputstream; import java.util.date; import java.util.list; public class mybatistest { private inputstream in;//读取配置文件 private sqlsession sqlsession;//操作数据库 private iuserdao userdao; @before//用于在测试方法执行之前执行,在其他方法执行之前执行init方法 public void init() throws ioexception { //读取配置文件,生成字节输入流 in = resources.getresourceasstream("sqlmapconfig.xml"); //获取sqlsessionfactory sqlsessionfactory factory = new sqlsessionfactorybuilder().build(in); //获取sqlsession对象 sqlsession = factory.opensession(); //获取dao的代理对象 userdao = sqlsession.getmapper(iuserdao.class); } @after//用于测试方法执行之后执行 public void destroy() throws ioexception { //提交事务 sqlsession.commit(); //释放资源 sqlsession.close(); in.close(); } @test //查询所有用户 public void testfindall() throws ioexception { //执行查询方法 list<user> users = userdao.findall(); for(user user:users){ system.out.println(user); } } @test //保存用户 public void testsave(){ user user = new user(); user.setusername("王五"); user.setaddress("北京市"); user.setsex("男"); user.setbirthday(new date()); system.out.println("保存前"+user); //执行保存方法 userdao.saveuser(user); system.out.println("保存后"+user); } @test //更新用户 public void testupdate(){ user user = new user(); user.setid(50); user.setusername("李四"); user.setaddress("北京市"); user.setsex("男"); user.setbirthday(new date()); //执行查询方法 userdao.updateuser(user); } @test //删除用户 public void testdelete(){ userdao.deleteuser(48); } @test //查询一个用户 public void testfindone(){ user user = userdao.findbyid(48); system.out.println(user); } @test //查询一个用户 public void testfindbyname(){ list<user> users = userdao.findbyname("%王%"); for(user user :users){ system.out.println(user); } } @test //查询一个用户 public void testfindtotal(){ int count = userdao.findtotal(); system.out.println(count); } }
typealiases标签和package标签
<!--使用typealiases配置别名,他只能配置domain中类的别名--> <typealiases> <!--typealias用于配置别名,type属性指定的是实体类权限定类名 alias属性指定别名,当指定了别命,不再区分大小写--> <!--<typealias type="com.itheima.domain.user" alias="user"></typealias>--> <!--用于指定配置别名的包,当指定之后,该包下的实体类都会注册别名,并且类名就是别名,不再区分大小写--> <package name="com.itheima.domain"></package> </typealiases>
<mappers> <!--<mapper resource="com/itheima/dao/iuserdao.xml"></mapper>--> <!--package标签是用于指定dao接口所在的包,当指定了之后就不需要在写mapper以及resource或者class了--> <package name="com.itheima.dao"></package> </mappers>
mybatis连接池的分类
连接池:我们在实际开发中都会使用连接池,因为他可以减少我们获取连接所消耗的时间
mybatis中的连接池
mybatis连接池提供了3种方式的配置:
配置的位置:主配置文件sqlmapconfig.xml的datasource标签,type属性就是表示采用何种连接池方式
type属性的取值有三种
1.pooled 采用传统的javax.sql.datasource规范中的连接池,mybatis中有针对规范的实现
2.unpooled 采用的获取连接的方式,虽然也实现javax.sql.datasource接口,但是并没有使用池的思想
3.采用服务器提供的jndi技术实现,来获取datasource对象,不同的服务器所能拿到datasource是不一样的,如果不是web或者maven的war工程,是不能使用的(tomcat服务器,采用连接池就是dbcp连接池)